mirror of
https://git.mirrors.martin98.com/https://github.com/Ultimaker/Cura
synced 2025-04-22 13:49:39 +08:00

Added a connection in WorkspaceDialog.qml to call function whenever the 'exportedSettingModel' changes. This ensures that any changes in the model will now be reflected in the UI table. Furthermore, an added adjustment in SpecificSettingsModel.py now correctly handles the enum type settings, retrieving the correct value from the options list. CURA-11783
512 lines
22 KiB
QML
512 lines
22 KiB
QML
// Copyright (c) 2022 Ultimaker B.V.
|
|
// Cura is released under the terms of the LGPLv3 or higher.
|
|
|
|
import QtQuick 2.10
|
|
import QtQuick.Controls 2.3
|
|
import QtQuick.Layouts 1.3
|
|
import QtQuick.Window 2.2
|
|
|
|
import UM 1.6 as UM
|
|
import Cura 1.1 as Cura
|
|
|
|
UM.Dialog
|
|
{
|
|
id: workspaceDialog
|
|
title: manager.isUcp? catalog.i18nc("@title:window Don't translate 'Universal Cura Project'", "Open Universal Cura Project (UCP)"): catalog.i18nc("@title:window", "Open Project")
|
|
|
|
margin: UM.Theme.getSize("default_margin").width
|
|
minimumWidth: UM.Theme.getSize("modal_window_minimum").width
|
|
minimumHeight: UM.Theme.getSize("modal_window_minimum").height
|
|
|
|
backgroundColor: UM.Theme.getColor("detail_background")
|
|
|
|
headerComponent: Rectangle
|
|
{
|
|
height: childrenRect.height + 2 * UM.Theme.getSize("default_margin").height
|
|
color: UM.Theme.getColor("main_background")
|
|
ColumnLayout
|
|
{
|
|
id: headerColumn
|
|
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.topMargin: UM.Theme.getSize("default_margin").height
|
|
anchors.leftMargin: UM.Theme.getSize("default_margin").width
|
|
anchors.rightMargin: anchors.leftMargin
|
|
RowLayout
|
|
{
|
|
UM.Label
|
|
{
|
|
id: titleLabel
|
|
text: manager.isUcp? catalog.i18nc("@action:title Don't translate 'Universal Cura Project'", "Summary - Open Universal Cura Project (UCP)"): catalog.i18nc("@action:title", "Summary - Cura Project")
|
|
font: UM.Theme.getFont("large")
|
|
}
|
|
Cura.TertiaryButton
|
|
{
|
|
id: learnMoreButton
|
|
visible: manager.isUcp
|
|
text: catalog.i18nc("@button", "Learn more")
|
|
iconSource: UM.Theme.getIcon("LinkExternal")
|
|
isIconOnRightSide: true
|
|
onClicked: Qt.openUrlExternally("https://support.ultimaker.com/s/article/000002979")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
Rectangle
|
|
{
|
|
anchors.fill: parent
|
|
UM.I18nCatalog { id: catalog; name: "cura" }
|
|
color: UM.Theme.getColor("main_background")
|
|
|
|
Flickable
|
|
{
|
|
id: dialogSummaryItem
|
|
width: parent.width
|
|
height: parent.height
|
|
|
|
clip: true
|
|
|
|
contentHeight: contentColumn.height
|
|
ScrollBar.vertical: UM.ScrollBar { id: scrollbar }
|
|
|
|
ListModel
|
|
{
|
|
id: resolveStrategiesModel
|
|
// Instead of directly adding the list elements, we add them afterwards.
|
|
// This is because it's impossible to use setting function results to be bound to listElement properties directly.
|
|
// See http://stackoverflow.com/questions/7659442/listelement-fields-as-properties
|
|
Component.onCompleted:
|
|
{
|
|
append({"key": "override", "label": catalog.i18nc("@action:ComboBox Update/override existing profile", "Update existing")});
|
|
append({"key": "new", "label": catalog.i18nc("@action:ComboBox Save settings in a new profile", "Create new")});
|
|
}
|
|
}
|
|
|
|
Column
|
|
{
|
|
id: contentColumn
|
|
width: parent.width - scrollbar.width - UM.Theme.getSize("default_margin").width
|
|
height: childrenRect.height
|
|
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("default_margin").width
|
|
rightPadding: UM.Theme.getSize("default_margin").width
|
|
|
|
WorkspaceSection
|
|
{
|
|
id: printerSection
|
|
title: catalog.i18nc("@action:label", "Printer settings")
|
|
iconSource: UM.Theme.getIcon("Printer")
|
|
content: Column
|
|
{
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Type")
|
|
rightLabelText: manager.machineType
|
|
}
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name")
|
|
rightLabelText: manager.isUcp? manager.machineType: manager.machineName == catalog.i18nc("@button", "Create new") ? "" : manager.machineName
|
|
}
|
|
}
|
|
|
|
comboboxTitle: catalog.i18nc("@action:label", "Open With")
|
|
comboboxTooltipText: catalog.i18nc("@info:tooltip", "Printer settings will be updated to match the settings saved with the project.")
|
|
comboboxVisible: workspaceDialog.visible && manager.updatableMachinesModel.count > 1
|
|
combobox: Cura.MachineSelector
|
|
{
|
|
id: machineSelector
|
|
headerCornerSide: Cura.RoundedRectangle.Direction.All
|
|
width: parent.width
|
|
height: parent.height
|
|
machineListModel: manager.updatableMachinesModel
|
|
machineName: manager.machineName
|
|
|
|
isConnectedCloudPrinter: false
|
|
isCloudRegistered: false
|
|
isNetworkPrinter: manager.isNetworked
|
|
isGroup: manager.isAbstractMachine
|
|
connectionStatus: ""
|
|
|
|
minDropDownWidth: machineSelector.width
|
|
|
|
Component
|
|
{
|
|
id: componentNewPrinter
|
|
|
|
Cura.SecondaryButton
|
|
{
|
|
id: createNewPrinter
|
|
text: catalog.i18nc("@button", "Create new")
|
|
fixedWidthMode: true
|
|
width: parent.width - leftPadding * 1.5
|
|
visible: manager.allowCreateMachine
|
|
onClicked:
|
|
{
|
|
toggleContent()
|
|
manager.setResolveStrategy("machine", "new")
|
|
machineSelector.machineName = catalog.i18nc("@button", "Create new")
|
|
manager.setIsAbstractMachine(false)
|
|
manager.setIsNetworkedMachine(false)
|
|
}
|
|
}
|
|
}
|
|
|
|
buttons: manager.allowCreateMachine ? [componentNewPrinter.createObject()] : []
|
|
|
|
onSelectPrinter: function(machine)
|
|
{
|
|
toggleContent();
|
|
machineSelector.machineName = machine.name
|
|
manager.setResolveStrategy("machine", "override")
|
|
manager.setMachineToOverride(machine.id)
|
|
manager.setIsAbstractMachine(machine.isAbstractMachine)
|
|
manager.setIsNetworkedMachine(machine.isNetworked)
|
|
}
|
|
}
|
|
}
|
|
|
|
WorkspaceSection
|
|
{
|
|
id: ucpProfileSection
|
|
visible: manager.isUcp
|
|
title: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
|
|
iconSource: UM.Theme.getIcon("Settings")
|
|
|
|
content: Column
|
|
{
|
|
id: ucpProfileSettingsValuesTable
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
|
|
|
|
WorkspaceRow
|
|
{
|
|
id: numberOfOverrides
|
|
leftLabelText: catalog.i18nc("@action:label", "Settings Loaded from UCP file")
|
|
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.exportedSettingModelRowCount).arg(manager.exportedSettingModelRowCount)
|
|
buttonText: tableViewSpecificSettings.shouldBeVisible ? catalog.i18nc("@action:button", "Hide settings") : catalog.i18nc("@action:button", "Show settings")
|
|
onButtonClicked: tableViewSpecificSettings.shouldBeVisible = !tableViewSpecificSettings.shouldBeVisible
|
|
}
|
|
Cura.TableView
|
|
{
|
|
id: tableViewSpecificSettings
|
|
width: parent.width - parent.leftPadding - UM.Theme.getSize("default_margin").width
|
|
height: UM.Theme.getSize("card").height
|
|
visible: shouldBeVisible && manager.isUcp
|
|
property bool shouldBeVisible: true
|
|
|
|
columnHeaders:
|
|
[
|
|
catalog.i18nc("@title:column", "Applies on"),
|
|
catalog.i18nc("@title:column", "Setting"),
|
|
catalog.i18nc("@title:column", "Value")
|
|
]
|
|
|
|
model: UM.TableModel
|
|
{
|
|
id: tableModel
|
|
headers: ["category", "label", "value"]
|
|
rows: manager.exportedSettingModelItems
|
|
}
|
|
|
|
Connections
|
|
{
|
|
target: manager
|
|
function onExportedSettingModelChanged()
|
|
{
|
|
tableModel.clear()
|
|
tableModel.rows = manager.exportedSettingModelItems
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
comboboxVisible: manager.qualityChangesConflict
|
|
combobox: Cura.ComboBox
|
|
{
|
|
id: qualityChangesResolveComboBox
|
|
model: resolveStrategiesModel
|
|
textRole: "label"
|
|
visible: manager.qualityChangesConflict && !manager.isUcp
|
|
contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
|
|
textFont: UM.Theme.getFont("medium")
|
|
|
|
background: Cura.RoundedRectangle
|
|
{
|
|
border.width: UM.Theme.getSize("default_lining").width
|
|
border.color: UM.Theme.getColor("lining")
|
|
color: qualityChangesResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
|
|
cornerSide: Cura.RoundedRectangle.Direction.All
|
|
radius: UM.Theme.getSize("default_radius").width
|
|
}
|
|
|
|
// This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
|
|
currentIndex:
|
|
{
|
|
currentIndex = 0
|
|
}
|
|
|
|
onCurrentIndexChanged:
|
|
{
|
|
manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(currentIndex).key)
|
|
}
|
|
}
|
|
}
|
|
|
|
WorkspaceSection
|
|
{
|
|
id: profileSection
|
|
title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Profile settings"):catalog.i18nc("@action:label", "Profile settings")
|
|
iconSource: UM.Theme.getIcon("Sliders")
|
|
content: Column
|
|
{
|
|
id: profileSettingsValuesTable
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Name")
|
|
rightLabelText: manager.qualityName
|
|
visible: manager.isCompatibleMachine
|
|
}
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Intent")
|
|
rightLabelText: manager.intentName
|
|
visible: manager.isCompatibleMachine
|
|
}
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Not in profile")
|
|
rightLabelText: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings)
|
|
visible: manager.numUserSettings != 0 && !manager.isUcp
|
|
}
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Derivative from")
|
|
rightLabelText: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges)
|
|
visible: manager.numSettingsOverridenByQualityChanges != 0 && manager.isCompatibleMachine
|
|
}
|
|
}
|
|
}
|
|
|
|
WorkspaceSection
|
|
{
|
|
id: materialSection
|
|
title: manager.isUcp? catalog.i18nc("@action:label", "Suggested Material settings"): catalog.i18nc("@action:label", "Material settings")
|
|
iconSource: UM.Theme.getIcon("Spool")
|
|
content: Column
|
|
{
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
|
|
|
|
Repeater
|
|
{
|
|
model: manager.materialLabels
|
|
delegate: WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Name")
|
|
rightLabelText: modelData
|
|
}
|
|
}
|
|
}
|
|
|
|
comboboxVisible: manager.materialConflict
|
|
|
|
combobox: Cura.ComboBox
|
|
{
|
|
id: materialResolveComboBox
|
|
model: resolveStrategiesModel
|
|
textRole: "label"
|
|
visible: manager.materialConflict && !manager.isUcp
|
|
contentLeftPadding: UM.Theme.getSize("default_margin").width + UM.Theme.getSize("narrow_margin").width
|
|
textFont: UM.Theme.getFont("medium")
|
|
|
|
background: Cura.RoundedRectangle
|
|
{
|
|
border.width: UM.Theme.getSize("default_lining").width
|
|
border.color: UM.Theme.getColor("lining")
|
|
color: materialResolveComboBox.hovered ? UM.Theme.getColor("expandable_hover") : UM.Theme.getColor("action_button")
|
|
cornerSide: Cura.RoundedRectangle.Direction.All
|
|
radius: UM.Theme.getSize("default_radius").width
|
|
}
|
|
|
|
// This is a hack. This will trigger onCurrentIndexChanged and set the index when this component in loaded
|
|
currentIndex:
|
|
{
|
|
currentIndex = 0
|
|
}
|
|
|
|
onCurrentIndexChanged:
|
|
{
|
|
manager.setResolveStrategy("material", resolveStrategiesModel.get(currentIndex).key)
|
|
}
|
|
}
|
|
}
|
|
|
|
WorkspaceSection
|
|
{
|
|
id: visibilitySection
|
|
title: catalog.i18nc("@action:label", "Setting visibility")
|
|
iconSource: UM.Theme.getIcon("Eye")
|
|
visible : !manager.isUcp
|
|
content: Column
|
|
{
|
|
spacing: UM.Theme.getSize("default_margin").height
|
|
leftPadding: UM.Theme.getSize("medium_button_icon").width + UM.Theme.getSize("default_margin").width
|
|
bottomPadding: UM.Theme.getSize("narrow_margin").height
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "Mode")
|
|
rightLabelText: manager.activeMode
|
|
}
|
|
|
|
WorkspaceRow
|
|
{
|
|
leftLabelText: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings)
|
|
rightLabelText: manager.activeMode
|
|
visible: manager.hasVisibleSettingsField
|
|
}
|
|
}
|
|
}
|
|
|
|
Row
|
|
{
|
|
id: clearBuildPlateWarning
|
|
width: parent.width
|
|
height: childrenRect.height
|
|
spacing: UM.Theme.getSize("default_margin").width
|
|
visible: manager.hasObjectsOnPlate
|
|
|
|
UM.ColorImage
|
|
{
|
|
width: warningLabel.height
|
|
height: width
|
|
source: UM.Theme.getIcon("Information")
|
|
color: UM.Theme.getColor("text")
|
|
}
|
|
UM.Label
|
|
{
|
|
id: warningLabel
|
|
text: catalog.i18nc("@action:warning", "Loading a project will clear all models on the build plate.")
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
property bool warning: manager.missingPackages.length > 0
|
|
|
|
footerComponent: Rectangle
|
|
{
|
|
color: warning ? UM.Theme.getColor("warning") : "transparent"
|
|
anchors.bottom: parent.bottom
|
|
width: parent.width
|
|
height: childrenRect.height + (warning ? 2 * workspaceDialog.margin : workspaceDialog.margin)
|
|
|
|
Column
|
|
{
|
|
height: childrenRect.height
|
|
spacing: workspaceDialog.margin
|
|
|
|
anchors.leftMargin: workspaceDialog.margin
|
|
anchors.rightMargin: workspaceDialog.margin
|
|
anchors.bottomMargin: workspaceDialog.margin
|
|
anchors.topMargin: warning ? workspaceDialog.margin : 0
|
|
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
anchors.top: parent.top
|
|
|
|
RowLayout
|
|
{
|
|
id: warningRow
|
|
height: childrenRect.height
|
|
visible: warning
|
|
spacing: workspaceDialog.margin
|
|
UM.ColorImage
|
|
{
|
|
width: UM.Theme.getSize("extruder_icon").width
|
|
height: UM.Theme.getSize("extruder_icon").height
|
|
source: UM.Theme.getIcon("Warning")
|
|
}
|
|
|
|
UM.Label
|
|
{
|
|
id: warningText
|
|
text: catalog.i18nc("@label", "This project contains materials or plugins that are currently not installed in Cura.<br/>Install the missing packages and reopen the project.")
|
|
}
|
|
}
|
|
|
|
Loader
|
|
{
|
|
width: parent.width
|
|
height: childrenRect.height
|
|
sourceComponent: buttonRow
|
|
}
|
|
}
|
|
}
|
|
|
|
buttonSpacing: UM.Theme.getSize("wide_margin").width
|
|
|
|
rightButtons: [
|
|
Cura.TertiaryButton
|
|
{
|
|
visible: !warning
|
|
text: catalog.i18nc("@action:button", "Cancel")
|
|
onClicked: reject()
|
|
},
|
|
Cura.PrimaryButton
|
|
{
|
|
visible: !warning
|
|
text: catalog.i18nc("@action:button", "Open")
|
|
onClicked: accept()
|
|
},
|
|
Cura.TertiaryButton
|
|
{
|
|
visible: warning
|
|
text: catalog.i18nc("@action:button", "Open project anyway")
|
|
onClicked: {
|
|
manager.showMissingMaterialsWarning();
|
|
accept();
|
|
}
|
|
},
|
|
Cura.PrimaryButton
|
|
{
|
|
visible: warning
|
|
text: catalog.i18nc("@action:button", "Install missing packages")
|
|
onClicked: manager.installMissingPackages()
|
|
}
|
|
]
|
|
|
|
onClosing: manager.notifyClosed()
|
|
onRejected: manager.onCancelButtonClicked()
|
|
onAccepted: manager.onOkButtonClicked()
|
|
onVisibleChanged:
|
|
{
|
|
if (visible)
|
|
{
|
|
// Force reload the comboboxes
|
|
// Since this dialog is only created once the first time you open it, these comboxes need to be reloaded
|
|
// each time it is shown after the first time so that the indexes will update correctly.
|
|
materialSection.reloadValues()
|
|
profileSection.reloadValues()
|
|
printerSection.reloadValues()
|
|
ucpProfileSection.reloadValues()
|
|
}
|
|
}
|
|
}
|