// Copyright (c) 2020 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.5 as UM import Cura 1.1 as Cura UM.Dialog { id: base title: catalog.i18nc("@title:window", "Open Project") minimumWidth: UM.Theme.getSize("popup_dialog").width minimumHeight: UM.Theme.getSize("popup_dialog").height width: minimumWidth backgroundColor: UM.Theme.getColor("main_background") margin: UM.Theme.getSize("default_margin").width property int comboboxHeight: UM.Theme.getSize("default_margin").height onClosing: manager.notifyClosed() onVisibleChanged: { if (visible) { machineResolveComboBox.currentIndex = 0 qualityChangesResolveComboBox.currentIndex = 0 materialResolveComboBox.currentIndex = 0 } } Flickable { clip: true width: parent.width height: parent.height contentHeight: dialogSummaryItem.height ScrollBar.vertical: UM.ScrollBar { id: verticalScrollBar } Item { id: dialogSummaryItem width: verticalScrollBar.visible ? parent.width - verticalScrollBar.width - UM.Theme.getSize("default_margin").width : parent.width height: childrenRect.height anchors.margins: 10 * screenScaleFactor UM.I18nCatalog { id: catalog name: "cura" } 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 { width: parent.width height: childrenRect.height spacing: UM.Theme.getSize("default_margin").height Column { width: parent.width height: childrenRect.height UM.Label { id: titleLabel text: catalog.i18nc("@action:title", "Summary - Cura Project") font: UM.Theme.getFont("large") } Rectangle { id: separator color: UM.Theme.getColor("text") width: parent.width height: UM.Theme.getSize("default_lining").height } } Item { width: parent.width height: childrenRect.height UM.TooltipArea { id: machineResolveStrategyTooltip anchors.top: parent.top anchors.right: parent.right width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: base.visible && machineResolveComboBox.model.count > 1 text: catalog.i18nc("@info:tooltip", "How should the conflict in the machine be resolved?") Cura.ComboBox { id: machineResolveComboBox model: manager.updatableMachinesModel visible: machineResolveStrategyTooltip.visible textRole: "displayName" width: parent.width height: UM.Theme.getSize("button").height onCurrentIndexChanged: { if (model.getItem(currentIndex).id == "new" && model.getItem(currentIndex).type == "default_option") { manager.setResolveStrategy("machine", "new") } else { manager.setResolveStrategy("machine", "override") manager.setMachineToOverride(model.getItem(currentIndex).id) } } onVisibleChanged: { if (!visible) {return} currentIndex = 0 // If the project printer exists in Cura, set it as the default dropdown menu option. // No need to check object 0, which is the "Create new" option for (var i = 1; i < model.count; i++) { if (model.getItem(i).name == manager.machineName) { currentIndex = i break } } // The project printer does not exist in Cura. If there is at least one printer of the same // type, select the first one, else set the index to "Create new" if (currentIndex == 0 && model.count > 1) { currentIndex = 1 } } } } Column { width: parent.width height: childrenRect.height UM.Label { id: printer_settings_label text: catalog.i18nc("@action:label", "Printer settings") font: UM.Theme.getFont("default_bold") } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Type") width: (parent.width / 3) | 0 } UM.Label { text: manager.machineType width: (parent.width / 3) | 0 } } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", manager.isPrinterGroup ? "Printer Group" : "Printer Name") width: (parent.width / 3) | 0 } UM.Label { text: manager.machineName width: (parent.width / 3) | 0 wrapMode: Text.WordWrap } } } } Item { width: parent.width height: childrenRect.height UM.TooltipArea { anchors.right: parent.right anchors.top: parent.top width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: manager.qualityChangesConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the profile be resolved?") Cura.ComboBox { model: resolveStrategiesModel textRole: "label" id: qualityChangesResolveComboBox width: parent.width height: UM.Theme.getSize("button").height onActivated: { manager.setResolveStrategy("quality_changes", resolveStrategiesModel.get(index).key) } } } Column { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Profile settings") font: UM.Theme.getFont("default_bold") } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Name") width: (parent.width / 3) | 0 } UM.Label { text: manager.qualityName width: (parent.width / 3) | 0 wrapMode: Text.WordWrap } } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Intent") width: (parent.width / 3) | 0 } UM.Label { text: manager.intentName width: (parent.width / 3) | 0 wrapMode: Text.WordWrap } } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Not in profile") visible: manager.numUserSettings != 0 width: (parent.width / 3) | 0 } UM.Label { text: catalog.i18ncp("@action:label", "%1 override", "%1 overrides", manager.numUserSettings).arg(manager.numUserSettings) visible: manager.numUserSettings != 0 width: (parent.width / 3) | 0 } } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Derivative from") visible: manager.numSettingsOverridenByQualityChanges != 0 width: (parent.width / 3) | 0 } UM.Label { text: catalog.i18ncp("@action:label", "%1, %2 override", "%1, %2 overrides", manager.numSettingsOverridenByQualityChanges).arg(manager.qualityType).arg(manager.numSettingsOverridenByQualityChanges) width: (parent.width / 3) | 0 visible: manager.numSettingsOverridenByQualityChanges != 0 wrapMode: Text.WordWrap } } } } Item { width: parent.width height: childrenRect.height UM.TooltipArea { id: materialResolveTooltip anchors.right: parent.right anchors.top: parent.top width: (parent.width / 3) | 0 height: visible ? comboboxHeight : 0 visible: manager.materialConflict text: catalog.i18nc("@info:tooltip", "How should the conflict in the material be resolved?") Cura.ComboBox { model: resolveStrategiesModel textRole: "label" id: materialResolveComboBox width: parent.width height: UM.Theme.getSize("button").height onActivated: { manager.setResolveStrategy("material", resolveStrategiesModel.get(index).key) } } } Column { width: parent.width height: childrenRect.height Row { height: childrenRect.height width: parent.width spacing: UM.Theme.getSize("narrow_margin").width UM.Label { text: catalog.i18nc("@action:label", "Material settings") font: UM.Theme.getFont("default_bold") width: (parent.width / 3) | 0 } } Repeater { model: manager.materialLabels delegate: Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Name") width: (parent.width / 3) | 0 } UM.Label { text: modelData width: (parent.width / 3) | 0 wrapMode: Text.WordWrap } } } } } Column { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Setting visibility") font: UM.Theme.getFont("default_bold") } Row { width: parent.width height: childrenRect.height UM.Label { text: catalog.i18nc("@action:label", "Mode") width: (parent.width / 3) | 0 } UM.Label { text: manager.activeMode width: (parent.width / 3) | 0 } } Row { width: parent.width height: childrenRect.height visible: manager.hasVisibleSettingsField UM.Label { text: catalog.i18nc("@action:label", "Visible settings:") width: (parent.width / 3) | 0 } UM.Label { text: catalog.i18nc("@action:label", "%1 out of %2" ).arg(manager.numVisibleSettings).arg(manager.totalNumberOfSettings) width: (parent.width / 3) | 0 } } } Row { width: parent.width height: childrenRect.height 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 + 2 * base.margin Column { height: childrenRect.height spacing: base.margin anchors.margins: base.margin anchors.left: parent.left anchors.right: parent.right anchors.top: parent.top RowLayout { id: warningRow height: childrenRect.height visible: warning spacing: base.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: "The material used in this project is currently not installed in Cura.
Install the material profile and reopen the project." } } Loader { width: parent.width height: childrenRect.height sourceComponent: buttonRow } } } buttonSpacing: UM.Theme.getSize("default_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 material") onClicked: manager.installMissingPackages() } ] onRejected: manager.onCancelButtonClicked() onAccepted: manager.onOkButtonClicked() }