diff options
author | Kostas Karmas <konskarm@gmail.com> | 2021-04-20 17:09:54 +0300 |
---|---|---|
committer | Kostas Karmas <konskarm@gmail.com> | 2021-04-20 17:09:54 +0300 |
commit | 5b74090dce6c4d2f268f869b03a7a39c3c4f20f2 (patch) | |
tree | 6f0b6e357219dfff30a11c7f5c8d4e2a56197258 /plugins/DigitalLibrary/resources/qml | |
parent | 196c8913311a8c6a2d033620df0b6d70d4d132b4 (diff) | |
parent | 0db033a6907b83e92645e4ac7b8f7532388745ca (diff) |
Merge branch 'df49' into 4.94.9.0
Diffstat (limited to 'plugins/DigitalLibrary/resources/qml')
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 |