Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKostas Karmas <konskarm@gmail.com>2021-04-20 17:09:54 +0300
committerKostas Karmas <konskarm@gmail.com>2021-04-20 17:09:54 +0300
commit5b74090dce6c4d2f268f869b03a7a39c3c4f20f2 (patch)
tree6f0b6e357219dfff30a11c7f5c8d4e2a56197258 /plugins/DigitalLibrary/resources/qml
parent196c8913311a8c6a2d033620df0b6d70d4d132b4 (diff)
parent0db033a6907b83e92645e4ac7b8f7532388745ca (diff)
Merge branch 'df49' into 4.94.9.0
Diffstat (limited to 'plugins/DigitalLibrary/resources/qml')
-rw-r--r--plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml159
-rw-r--r--plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml61
-rw-r--r--plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml62
-rw-r--r--plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml129
-rw-r--r--plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml198
-rw-r--r--plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml92
-rw-r--r--plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml259
-rw-r--r--plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml202
8 files changed, 1162 insertions, 0 deletions
diff --git a/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml b/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
new file mode 100644
index 0000000000..75fb8d5811
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
@@ -0,0 +1,159 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Popup
+{
+ id: base
+
+ padding: UM.Theme.getSize("default_margin").width
+
+ closePolicy: Popup.CloseOnEscape
+ focus: true
+ modal: true
+ background: Cura.RoundedRectangle
+ {
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ width: parent.width
+ height: parent.height
+ color: UM.Theme.getColor("main_background")
+ }
+
+ Connections
+ {
+ target: manager
+
+ function onCreatingNewProjectStatusChanged(status)
+ {
+ if (status == DF.RetrievalStatus.Success)
+ {
+ base.close();
+ }
+ }
+ }
+
+ onOpened:
+ {
+ newProjectNameTextField.text = ""
+ newProjectNameTextField.focus = true
+ }
+
+ Label
+ {
+ id: createNewLibraryProjectLabel
+ text: "Create new Library project"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("small_button_text")
+ anchors
+ {
+ top: parent.top
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Label
+ {
+ id: projectNameLabel
+ text: "Project Name"
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("text")
+ anchors
+ {
+ top: createNewLibraryProjectLabel.bottom
+ topMargin: UM.Theme.getSize("default_margin").width
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Cura.TextField
+ {
+ id: newProjectNameTextField
+ width: parent.width
+ anchors
+ {
+ top: projectNameLabel.bottom
+ topMargin: UM.Theme.getSize("thin_margin").width
+ left: parent.left
+ right: parent.right
+ }
+ validator: RegExpValidator
+ {
+ regExp: /^[^\\\/\*\?\|\[\]]{0,96}$/
+ }
+
+ text: PrintInformation.jobName
+ font: UM.Theme.getFont("default")
+ placeholderText: "Enter a name for your new project."
+ onAccepted:
+ {
+ if (verifyProjectCreationButton.enabled)
+ {
+ verifyProjectCreationButton.clicked()
+ }
+ }
+ }
+
+ Label
+ {
+ id: errorWhileCreatingProjectLabel
+ text: manager.projectCreationErrorText
+ width: parent.width
+ wrapMode: Text.WordWrap
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("error")
+ visible: manager.creatingNewProjectStatus == DF.RetrievalStatus.Failed
+ anchors
+ {
+ top: newProjectNameTextField.bottom
+ left: parent.left
+ right: parent.right
+ }
+ }
+
+ Cura.SecondaryButton
+ {
+ id: cancelProjectCreationButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+
+ text: "Cancel"
+
+ onClicked:
+ {
+ base.close()
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: verifyProjectCreationButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Create"
+ enabled: newProjectNameTextField.text != "" && !busy
+
+ onClicked:
+ {
+ manager.createLibraryProjectAndSetAsPreselected(newProjectNameTextField.text)
+ }
+ busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml b/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml
new file mode 100644
index 0000000000..58958e0069
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/DigitalFactoryOpenDialog.qml
@@ -0,0 +1,61 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+Window
+{
+ id: digitalFactoryOpenDialogBase
+ title: "Open file from Library"
+
+ modality: Qt.ApplicationModal
+ width: 800 * screenScaleFactor
+ height: 600 * screenScaleFactor
+ minimumWidth: 800 * screenScaleFactor
+ minimumHeight: 600 * screenScaleFactor
+
+ Shortcut
+ {
+ sequence: "Esc"
+ onActivated: digitalFactoryOpenDialogBase.close()
+ }
+ color: UM.Theme.getColor("main_background")
+
+ SelectProjectPage
+ {
+ visible: manager.selectedProjectIndex == -1
+ createNewProjectButtonVisible: false
+ }
+
+ OpenProjectFilesPage
+ {
+ visible: manager.selectedProjectIndex >= 0
+ onOpenFilePressed: digitalFactoryOpenDialogBase.close()
+ }
+
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the user's projects from the digital factory library
+ id: retrievingProjectsBusyIndicator
+
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingProjectsStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml b/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml
new file mode 100644
index 0000000000..6d870d0c78
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/DigitalFactorySaveDialog.qml
@@ -0,0 +1,62 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+Window
+{
+ id: digitalFactorySaveDialogBase
+ title: "Save Cura project to Library"
+
+ modality: Qt.ApplicationModal
+ width: 800 * screenScaleFactor
+ height: 600 * screenScaleFactor
+ minimumWidth: 800 * screenScaleFactor
+ minimumHeight: 600 * screenScaleFactor
+
+ Shortcut
+ {
+ sequence: "Esc"
+ onActivated: digitalFactorySaveDialogBase.close()
+ }
+ color: UM.Theme.getColor("main_background")
+
+ SelectProjectPage
+ {
+ visible: manager.selectedProjectIndex == -1
+ createNewProjectButtonVisible: true
+ }
+
+ SaveProjectFilesPage
+ {
+ visible: manager.selectedProjectIndex >= 0
+ onSavePressed: digitalFactorySaveDialogBase.close()
+ onSelectDifferentProjectPressed: manager.clearProjectSelection()
+ }
+
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the user's projects from the digital factory library
+ id: retrievingProjectsBusyIndicator
+
+ anchors {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingProjectsStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml b/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
new file mode 100644
index 0000000000..45a0c6886d
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
@@ -0,0 +1,129 @@
+// Copyright (C) 2021 Ultimaker B.V.
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+Cura.RoundedRectangle
+{
+ id: base
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ signal clicked()
+ property var hasMoreProjectsToLoad
+ enabled: hasMoreProjectsToLoad
+ color: UM.Theme.getColor("main_background")
+
+ MouseArea
+ {
+ id: cardMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ }
+
+ Row
+ {
+ id: projectInformationRow
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+
+ UM.RecolorImage
+ {
+ id: projectImage
+ anchors.verticalCenter: parent.verticalCenter
+ width: UM.Theme.getSize("section").height
+ height: width
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+
+ Label
+ {
+ id: displayNameLabel
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Load more projects"
+ color: UM.Theme.getColor("text_link")
+ font: UM.Theme.getFont("medium_bold")
+ }
+ }
+
+ Component.onCompleted:
+ {
+ cardMouseArea.clicked.connect(base.clicked)
+ }
+
+ states:
+ [
+ State
+ {
+ name: "canLoadMoreProjectsAndHovered";
+ when: base.hasMoreProjectsToLoad && cardMouseArea.containsMouse
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("text_link")
+ text: "Load more projects"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("action_button_hovered")
+ }
+ },
+
+ State
+ {
+ name: "canLoadMoreProjectsAndNotHovered";
+ when: base.hasMoreProjectsToLoad && !cardMouseArea.containsMouse
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("text_link")
+ source: "../images/arrow_down.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("text_link")
+ text: "Load more projects"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("main_background")
+ }
+ },
+
+ State
+ {
+ name: "noMoreProjectsToLoad"
+ when: !base.hasMoreProjectsToLoad
+ PropertyChanges
+ {
+ target: projectImage
+ color: UM.Theme.getColor("action_button_disabled_text")
+ source: "../images/update.svg"
+ }
+ PropertyChanges
+ {
+ target: displayNameLabel
+ color: UM.Theme.getColor("action_button_disabled_text")
+ text: "No more projects to load"
+ }
+ PropertyChanges
+ {
+ target: base
+ color: UM.Theme.getColor("action_button_disabled")
+ }
+ }
+ ]
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml b/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
new file mode 100644
index 0000000000..e1918b3da7
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
@@ -0,0 +1,198 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+ width: parent.width
+ height: parent.height
+
+ property var fileModel: manager.digitalFactoryFileModel
+
+ signal openFilePressed()
+ signal selectDifferentProjectPressed()
+
+ anchors
+ {
+ fill: parent
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ ProjectSummaryCard
+ {
+ id: projectSummaryCard
+
+ anchors.top: parent.top
+
+ property var selectedItem: manager.digitalFactoryProjectModel.getItem(manager.selectedProjectIndex)
+
+ imageSource: selectedItem.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: selectedItem.displayName || ""
+ projectUsernameText: selectedItem.username || ""
+ projectLastUpdatedText: "Last updated: " + selectedItem.lastUpdated
+ cardMouseAreaEnabled: false
+ }
+
+ Rectangle
+ {
+ id: projectFilesContent
+ width: parent.width
+ anchors.top: projectSummaryCard.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").width
+ anchors.bottom: selectDifferentProjectButton.top
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").width
+
+ color: UM.Theme.getColor("main_background")
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+
+
+ Cura.TableView
+ {
+ id: filesTableView
+ anchors.fill: parent
+ model: manager.digitalFactoryFileModel
+ visible: model.count != 0 && manager.retrievingFileStatus != DF.RetrievalStatus.InProgress
+ selectionMode: OldControls.SelectionMode.SingleSelection
+
+ OldControls.TableViewColumn
+ {
+ id: fileNameColumn
+ role: "fileName"
+ title: "Name"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ id: usernameColumn
+ role: "username"
+ title: "Uploaded by"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ role: "uploadedAt"
+ title: "Uploaded at"
+ }
+
+ Connections
+ {
+ target: filesTableView.selection
+ function onSelectionChanged()
+ {
+ let newSelection = [];
+ filesTableView.selection.forEach(function(rowIndex) { newSelection.push(rowIndex); });
+ manager.setSelectedFileIndices(newSelection);
+ }
+ }
+ }
+
+ Label
+ {
+ id: emptyProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Select a project to view its files."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+
+ Connections
+ {
+ target: manager
+ function onSelectedProjectIndexChanged(newProjectIndex)
+ {
+ emptyProjectLabel.visible = (newProjectIndex == -1)
+ }
+ }
+ }
+
+ Label
+ {
+ id: noFilesInProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
+ text: "No supported files in this project."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+ }
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the files of a project from the digital factory library
+ id: retrievingFilesBusyIndicator
+
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+
+ Connections
+ {
+ target: manager.digitalFactoryFileModel
+
+ function onItemsChanged()
+ {
+ // Make sure no files are selected when the file model changes
+ filesTableView.currentRow = -1
+ filesTableView.selection.clear()
+ }
+ }
+ }
+ Cura.SecondaryButton
+ {
+ id: selectDifferentProjectButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ text: "Change Library project"
+
+ onClicked:
+ {
+ manager.clearProjectSelection()
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: openFilesButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Open"
+ enabled: filesTableView.selection.count > 0
+ onClicked:
+ {
+ manager.openSelectedFiles()
+ }
+ busy: false
+ }
+
+ Component.onCompleted:
+ {
+ openFilesButton.clicked.connect(base.openFilePressed)
+ selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
+ }
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml b/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
new file mode 100644
index 0000000000..4374b2f998
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
@@ -0,0 +1,92 @@
+// Copyright (C) 2021 Ultimaker B.V.
+import QtQuick 2.10
+import QtQuick.Controls 2.3
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+Cura.RoundedRectangle
+{
+ id: base
+ width: parent.width
+ height: projectImage.height + 2 * UM.Theme.getSize("default_margin").width
+ cornerSide: Cura.RoundedRectangle.Direction.All
+ border.color: UM.Theme.getColor("lining")
+ border.width: UM.Theme.getSize("default_lining").width
+ radius: UM.Theme.getSize("default_radius").width
+ color: UM.Theme.getColor("main_background")
+ signal clicked()
+ property alias imageSource: projectImage.source
+ property alias projectNameText: displayNameLabel.text
+ property alias projectUsernameText: usernameLabel.text
+ property alias projectLastUpdatedText: lastUpdatedLabel.text
+ property alias cardMouseAreaEnabled: cardMouseArea.enabled
+
+ onVisibleChanged: color = UM.Theme.getColor("main_background")
+
+ MouseArea
+ {
+ id: cardMouseArea
+ anchors.fill: parent
+ hoverEnabled: true
+ onEntered: base.color = UM.Theme.getColor("action_button_hovered")
+ onExited: base.color = UM.Theme.getColor("main_background")
+ onClicked: base.clicked()
+ }
+ Row
+ {
+ id: projectInformationRow
+ width: parent.width
+ padding: UM.Theme.getSize("default_margin").width
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Image
+ {
+ id: projectImage
+ anchors.verticalCenter: parent.verticalCenter
+ width: UM.Theme.getSize("toolbox_thumbnail_small").width
+ height: Math.round(width * 3/4)
+ sourceSize.width: width
+ sourceSize.height: height
+ fillMode: Image.PreserveAspectFit
+ mipmap: true
+ }
+ Column
+ {
+ id: projectLabelsColumn
+ height: projectImage.height
+ width: parent.width - x - UM.Theme.getSize("default_margin").width
+ anchors.verticalCenter: parent.verticalCenter
+
+ Label
+ {
+ id: displayNameLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("text")
+ font: UM.Theme.getFont("default_bold")
+ }
+
+ Label
+ {
+ id: usernameLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("small_button_text")
+ font: UM.Theme.getFont("default")
+ }
+
+ Label
+ {
+ id: lastUpdatedLabel
+ width: parent.width
+ height: Math.round(parent.height / 3)
+ elide: Text.ElideRight
+ color: UM.Theme.getColor("small_button_text")
+ font: UM.Theme.getFont("default")
+ }
+ }
+ }
+} \ No newline at end of file
diff --git a/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml b/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
new file mode 100644
index 0000000000..03bd655957
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
@@ -0,0 +1,259 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+ width: parent.width
+ height: parent.height
+ property var fileModel: manager.digitalFactoryFileModel
+
+ signal savePressed()
+ signal selectDifferentProjectPressed()
+
+ anchors
+ {
+ fill: parent
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ ProjectSummaryCard
+ {
+ id: projectSummaryCard
+
+ anchors.top: parent.top
+
+ property var selectedItem: manager.digitalFactoryProjectModel.getItem(manager.selectedProjectIndex)
+
+ imageSource: selectedItem.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: selectedItem.displayName || ""
+ projectUsernameText: selectedItem.username || ""
+ projectLastUpdatedText: "Last updated: " + selectedItem.lastUpdated
+ cardMouseAreaEnabled: false
+ }
+
+ Label
+ {
+ id: fileNameLabel
+ anchors.top: projectSummaryCard.bottom
+ anchors.topMargin: UM.Theme.getSize("default_margin").height
+ text: "Cura project name"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("text")
+ }
+
+
+ Cura.TextField
+ {
+ id: dfFilenameTextfield
+ width: parent.width
+ anchors.left: parent.left
+ anchors.top: fileNameLabel.bottom
+ anchors.topMargin: UM.Theme.getSize("thin_margin").height
+ validator: RegExpValidator
+ {
+ regExp: /^[^\\\/\*\?\|\[\]]{0,96}$/
+ }
+
+ text: PrintInformation.jobName
+ font: UM.Theme.getFont("medium")
+ placeholderText: "Enter the name of the file."
+ onAccepted: { if (saveButton.enabled) {saveButton.clicked()}}
+ }
+
+
+ Rectangle
+ {
+ id: projectFilesContent
+ width: parent.width
+ anchors.top: dfFilenameTextfield.bottom
+ anchors.topMargin: UM.Theme.getSize("wide_margin").height
+ anchors.bottom: selectDifferentProjectButton.top
+ anchors.bottomMargin: UM.Theme.getSize("default_margin").width
+
+ color: UM.Theme.getColor("main_background")
+ border.width: UM.Theme.getSize("default_lining").width
+ border.color: UM.Theme.getColor("lining")
+
+
+ Cura.TableView
+ {
+ id: filesTableView
+ anchors.fill: parent
+ model: manager.digitalFactoryFileModel
+ visible: model.count != 0 && manager.retrievingFileStatus != DF.RetrievalStatus.InProgress
+ selectionMode: OldControls.SelectionMode.NoSelection
+
+ OldControls.TableViewColumn
+ {
+ id: fileNameColumn
+ role: "fileName"
+ title: "@tableViewColumn:title", "Name"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ id: usernameColumn
+ role: "username"
+ title: "Uploaded by"
+ width: Math.round(filesTableView.width / 3)
+ }
+
+ OldControls.TableViewColumn
+ {
+ role: "uploadedAt"
+ title: "Uploaded at"
+ }
+ }
+
+ Label
+ {
+ id: emptyProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ text: "Select a project to view its files."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+
+ Connections
+ {
+ target: manager
+ function onSelectedProjectIndexChanged()
+ {
+ emptyProjectLabel.visible = (manager.newProjectIndex == -1)
+ }
+ }
+ }
+
+ Label
+ {
+ id: noFilesInProjectLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.verticalCenter: parent.verticalCenter
+ visible: (manager.digitalFactoryFileModel.count == 0 && !emptyProjectLabel.visible && !retrievingFilesBusyIndicator.visible)
+ text: "No supported files in this project."
+ font: UM.Theme.getFont("default")
+ color: UM.Theme.getColor("setting_category_text")
+ }
+
+ BusyIndicator
+ {
+ // Shows up while Cura is waiting to receive the files of a project from the digital factory library
+ id: retrievingFilesBusyIndicator
+
+ anchors
+ {
+ verticalCenter: parent.verticalCenter
+ horizontalCenter: parent.horizontalCenter
+ }
+
+ width: parent.width / 4
+ height: width
+ visible: manager.retrievingFilesStatus == DF.RetrievalStatus.InProgress
+ running: visible
+ palette.dark: UM.Theme.getColor("text")
+ }
+
+ Connections
+ {
+ target: manager.digitalFactoryFileModel
+
+ function onItemsChanged()
+ {
+ // Make sure no files are selected when the file model changes
+ filesTableView.currentRow = -1
+ filesTableView.selection.clear()
+ }
+ }
+ }
+ Cura.SecondaryButton
+ {
+ id: selectDifferentProjectButton
+
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+ text: "Change Library project"
+
+ onClicked:
+ {
+ manager.selectedProjectIndex = -1
+ }
+ busy: false
+ }
+
+ Cura.PrimaryButton
+ {
+ id: saveButton
+
+ anchors.bottom: parent.bottom
+ anchors.right: parent.right
+ text: "Save"
+ enabled: (asProjectCheckbox.checked || asSlicedCheckbox.checked) && dfFilenameTextfield.text != ""
+
+ onClicked:
+ {
+ let saveAsFormats = [];
+ if (asProjectCheckbox.checked)
+ {
+ saveAsFormats.push("3mf");
+ }
+ if (asSlicedCheckbox.checked)
+ {
+ saveAsFormats.push("ufp");
+ }
+ manager.saveFileToSelectedProject(dfFilenameTextfield.text, saveAsFormats);
+ }
+ busy: false
+ }
+
+ Row
+ {
+
+ id: saveAsFormatRow
+ anchors.verticalCenter: saveButton.verticalCenter
+ anchors.right: saveButton.left
+ anchors.rightMargin: UM.Theme.getSize("thin_margin").height
+ width: childrenRect.width
+ spacing: UM.Theme.getSize("default_margin").width
+
+ Cura.CheckBox
+ {
+ id: asProjectCheckbox
+ height: UM.Theme.getSize("checkbox").height
+ anchors.verticalCenter: parent.verticalCenter
+ checked: true
+ text: "Save Cura project"
+ font: UM.Theme.getFont("medium")
+ }
+
+ Cura.CheckBox
+ {
+ id: asSlicedCheckbox
+ height: UM.Theme.getSize("checkbox").height
+ anchors.verticalCenter: parent.verticalCenter
+
+ enabled: UM.Backend.state == UM.Backend.Done
+ checked: UM.Backend.state == UM.Backend.Done
+ text: "Save print file"
+ font: UM.Theme.getFont("medium")
+ }
+ }
+
+ Component.onCompleted:
+ {
+ saveButton.clicked.connect(base.savePressed)
+ selectDifferentProjectButton.clicked.connect(base.selectDifferentProjectPressed)
+ }
+}
diff --git a/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
new file mode 100644
index 0000000000..2de0e78cc7
--- /dev/null
+++ b/plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
@@ -0,0 +1,202 @@
+// Copyright (C) 2021 Ultimaker B.V.
+
+import QtQuick 2.10
+import QtQuick.Window 2.2
+import QtQuick.Controls 1.4 as OldControls // TableView doesn't exist in the QtQuick Controls 2.x in 5.10, so use the old one
+import QtQuick.Controls 2.3
+import QtQuick.Controls.Styles 1.4
+
+import UM 1.2 as UM
+import Cura 1.6 as Cura
+
+import DigitalFactory 1.0 as DF
+
+
+Item
+{
+ id: base
+
+ width: parent.width
+ height: parent.height
+ property alias createNewProjectButtonVisible: createNewProjectButton.visible
+
+ anchors
+ {
+ top: parent.top
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ margins: UM.Theme.getSize("default_margin").width
+ }
+
+ Label
+ {
+ id: selectProjectLabel
+
+ text: "Select Project"
+ font: UM.Theme.getFont("medium")
+ color: UM.Theme.getColor("small_button_text")
+ anchors.top: parent.top
+ anchors.left: parent.left
+ visible: projectListContainer.visible
+ }
+
+ Cura.SecondaryButton
+ {
+ id: createNewProjectButton
+
+ anchors.verticalCenter: selectProjectLabel.verticalCenter
+ anchors.right: parent.right
+ text: "New Library project"
+
+ onClicked:
+ {
+ createNewProjectPopup.open()
+ }
+ busy: manager.creatingNewProjectStatus == DF.RetrievalStatus.InProgress
+ }
+
+ Item
+ {
+ id: noLibraryProjectsContainer
+ anchors
+ {
+ top: parent.top
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ visible: manager.digitalFactoryProjectModel.count == 0 && (manager.retrievingProjectsStatus == DF.RetrievalStatus.Success || manager.retrievingProjectsStatus == DF.RetrievalStatus.Failed)
+
+ Column
+ {
+ anchors.centerIn: parent
+ spacing: UM.Theme.getSize("thin_margin").height
+ Image
+ {
+ id: digitalFactoryImage
+ anchors.horizontalCenter: parent.horizontalCenter
+ source: "../images/digital_factory.svg"
+ fillMode: Image.PreserveAspectFit
+ width: parent.width - 2 * UM.Theme.getSize("thick_margin").width
+ sourceSize.width: width
+ sourceSize.height: height
+ }
+
+ Label
+ {
+ id: noLibraryProjectsLabel
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: "It appears that you don't have any projects in the Library yet."
+ font: UM.Theme.getFont("medium")
+ }
+
+ Cura.TertiaryButton
+ {
+ id: visitDigitalLibraryButton
+ anchors.horizontalCenter: parent.horizontalCenter
+ text: "Visit Digital Library"
+ onClicked: Qt.openUrlExternally(CuraApplication.ultimakerDigitalFactoryUrl + "/app/library")
+ }
+ }
+ }
+
+ Item
+ {
+ id: projectListContainer
+ anchors
+ {
+ top: selectProjectLabel.bottom
+ topMargin: UM.Theme.getSize("default_margin").height
+ bottom: parent.bottom
+ left: parent.left
+ right: parent.right
+ }
+ visible: manager.digitalFactoryProjectModel.count > 0
+
+ // Use a flickable and a column with a repeater instead of a ListView in a ScrollView, because the ScrollView cannot
+ // have additional children (aside from the view inside it), which wouldn't allow us to add the LoadMoreProjectsCard
+ // in it.
+ Flickable
+ {
+ id: flickableView
+ clip: true
+ contentWidth: parent.width
+ contentHeight: projectsListView.implicitHeight
+ anchors.fill: parent
+
+ ScrollBar.vertical: ScrollBar
+ {
+ // Vertical ScrollBar, styled similarly to the scrollBar in the settings panel
+ id: verticalScrollBar
+ visible: flickableView.contentHeight > flickableView.height
+
+ background: Rectangle
+ {
+ implicitWidth: UM.Theme.getSize("scrollbar").width
+ radius: Math.round(implicitWidth / 2)
+ color: UM.Theme.getColor("scrollbar_background")
+ }
+
+ contentItem: Rectangle
+ {
+ id: scrollViewHandle
+ implicitWidth: UM.Theme.getSize("scrollbar").width
+ radius: Math.round(implicitWidth / 2)
+
+ color: verticalScrollBar.pressed ? UM.Theme.getColor("scrollbar_handle_down") : verticalScrollBar.hovered ? UM.Theme.getColor("scrollbar_handle_hover") : UM.Theme.getColor("scrollbar_handle")
+ Behavior on color { ColorAnimation { duration: 50; } }
+ }
+ }
+
+ Column
+ {
+ id: projectsListView
+ width: verticalScrollBar.visible ? parent.width - verticalScrollBar.width - UM.Theme.getSize("default_margin").width : parent.width
+ anchors.top: parent.top
+ spacing: UM.Theme.getSize("narrow_margin").width
+
+ Repeater
+ {
+ model: manager.digitalFactoryProjectModel
+ delegate: ProjectSummaryCard
+ {
+ id: projectSummaryCard
+ imageSource: model.thumbnailUrl || "../images/placeholder.svg"
+ projectNameText: model.displayName
+ projectUsernameText: model.username
+ projectLastUpdatedText: "Last updated: " + model.lastUpdated
+
+ onClicked:
+ {
+ manager.selectedProjectIndex = index
+ }
+ }
+ }
+
+ LoadMoreProjectsCard
+ {
+ id: loadMoreProjectsCard
+ height: UM.Theme.getSize("toolbox_thumbnail_small").height
+ width: parent.width
+ visible: manager.digitalFactoryProjectModel.count > 0
+ hasMoreProjectsToLoad: manager.hasMoreProjectsToLoad
+
+ onClicked:
+ {
+ manager.loadMoreProjects()
+ }
+ }
+ }
+ }
+ }
+
+ CreateNewProjectPopup
+ {
+ id: createNewProjectPopup
+ width: 400 * screenScaleFactor
+ height: 220 * screenScaleFactor
+ x: Math.round((parent.width - width) / 2)
+ y: Math.round((parent.height - height) / 2)
+ }
+} \ No newline at end of file