mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-23 22:54:01 -06:00
Initial commit for the DL
This commit is contained in:
parent
e19d5545bc
commit
d972c505d0
38 changed files with 3512 additions and 0 deletions
159
plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
Normal file
159
plugins/DigitalLibrary/resources/qml/CreateNewProjectPopup.qml
Normal file
|
@ -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
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
|
@ -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")
|
||||
}
|
||||
}
|
129
plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
Normal file
129
plugins/DigitalLibrary/resources/qml/LoadMoreProjectsCard.qml
Normal file
|
@ -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")
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
198
plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
Normal file
198
plugins/DigitalLibrary/resources/qml/OpenProjectFilesPage.qml
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
92
plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
Normal file
92
plugins/DigitalLibrary/resources/qml/ProjectSummaryCard.qml
Normal file
|
@ -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")
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
259
plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
Normal file
259
plugins/DigitalLibrary/resources/qml/SaveProjectFilesPage.qml
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
202
plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
Normal file
202
plugins/DigitalLibrary/resources/qml/SelectProjectPage.qml
Normal file
|
@ -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)
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue