From 8d68db9ff0169a1ce8ef3d1276932f1ebf933f99 Mon Sep 17 00:00:00 2001 From: Lipu Fei Date: Tue, 19 Mar 2019 12:08:42 +0100 Subject: [PATCH] WIP: Add first-start machine actions --- cura/CuraApplication.py | 2 - .../Models/FirstStartMachineActionsModel.py | 106 +- cura/UI/MachineSettingsManager.py | 10 +- cura/UI/WelcomePagesModel.py | 12 +- .../MachineSettingsAction.qml | 973 ++---------------- .../MachineSettingsExtruderTab.qml | 17 +- .../MachineSettingsPrinterTab.qml | 38 +- .../MachineSettings/ComboBoxWithOptions.qml | 15 +- .../MachineSettingsContent.qml | 55 - .../qml/MachineSettings/PolygonTextField.qml | 120 --- .../qml/MachineSettings/PrintSetupContent.qml | 272 ----- .../AddPrinterBySelectionContent.qml | 10 +- .../FirstStartMachineActionsContent.qml | 91 ++ resources/qml/WelcomePages/StepPanel.qml | 2 +- resources/qml/WelcomePages/TestContent.qml | 107 -- resources/qml/qmldir | 17 + 16 files changed, 288 insertions(+), 1559 deletions(-) rename {resources/qml/WelcomePages => plugins/MachineSettingsAction}/MachineSettingsExtruderTab.qml (93%) rename {resources/qml/WelcomePages => plugins/MachineSettingsAction}/MachineSettingsPrinterTab.qml (89%) delete mode 100644 resources/qml/MachineSettings/MachineSettingsContent.qml delete mode 100644 resources/qml/MachineSettings/PolygonTextField.qml delete mode 100644 resources/qml/MachineSettings/PrintSetupContent.qml create mode 100644 resources/qml/WelcomePages/FirstStartMachineActionsContent.qml delete mode 100644 resources/qml/WelcomePages/TestContent.qml diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 01b0e457ae..6a7295ba33 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -753,8 +753,6 @@ class CuraApplication(QtApplication): # Initialize setting visibility presets model. self._setting_visibility_presets_model = SettingVisibilityPresetsModel(self.getPreferences(), parent = self) - self._first_start_machine_actions_model.initialize() - # Initialize Cura API self._cura_API.initialize() diff --git a/cura/Machines/Models/FirstStartMachineActionsModel.py b/cura/Machines/Models/FirstStartMachineActionsModel.py index 8c2673c3a3..b7e806278c 100644 --- a/cura/Machines/Models/FirstStartMachineActionsModel.py +++ b/cura/Machines/Models/FirstStartMachineActionsModel.py @@ -1,52 +1,54 @@ -# Copyright (c) 2019 Ultimaker B.V. -# Cura is released under the terms of the LGPLv3 or higher. - -from typing import Optional - -from PyQt5.QtCore import QObject, Qt - -from UM.Qt.ListModel import ListModel - - -# -# This model holds all first-start machine actions for the currently active machine. It has 2 roles: -# - title : the title/name of the action -# - content : the QObject of the QML content of the action -# -class FirstStartMachineActionsModel(ListModel): - - TitleRole = Qt.UserRole + 1 - ContentRole = Qt.UserRole + 2 - - def __init__(self, parent: Optional[QObject] = None) -> None: - super().__init__(parent) - - self.addRoleName(self.TitleRole, "title") - self.addRoleName(self.ContentRole, "content") - - from cura.CuraApplication import CuraApplication - self._application = CuraApplication.getInstance() - - def initialize(self) -> None: - self._application.getMachineManager().globalContainerChanged.connect(self._update) - self._update() - - def _update(self) -> None: - global_stack = self._application.getMachineManager().activeMachine - if global_stack is None: - self.setItems([]) - return - - definition_id = global_stack.definition.getId() - first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id) - - item_list = [] - for item in first_start_actions: - item_list.append({"title": item.label, - "content": item.displayItem, - }) - - self.setItems(item_list) - - -__all__ = ["FirstStartMachineActionsModel"] +# Copyright (c) 2019 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from typing import Optional + +from PyQt5.QtCore import QObject, Qt + +from UM.Qt.ListModel import ListModel + + +# +# This model holds all first-start machine actions for the currently active machine. It has 2 roles: +# - title : the title/name of the action +# - content : the QObject of the QML content of the action +# +class FirstStartMachineActionsModel(ListModel): + + TitleRole = Qt.UserRole + 1 + ContentRole = Qt.UserRole + 2 + + def __init__(self, parent: Optional[QObject] = None) -> None: + super().__init__(parent) + + self.addRoleName(self.TitleRole, "title") + self.addRoleName(self.ContentRole, "content") + + from cura.CuraApplication import CuraApplication + self._application = CuraApplication.getInstance() + + self._application.initializationFinished.connect(self._initialize) + + def _initialize(self) -> None: + self._application.getMachineManager().globalContainerChanged.connect(self._update) + self._update() + + def _update(self) -> None: + global_stack = self._application.getMachineManager().activeMachine + if global_stack is None: + self.setItems([]) + return + + definition_id = global_stack.definition.getId() + first_start_actions = self._application.getMachineActionManager().getFirstStartActions(definition_id) + + item_list = [] + for item in first_start_actions: + item_list.append({"title": item.label, + "content": item.displayItem, + }) + + self.setItems(item_list) + + +__all__ = ["FirstStartMachineActionsModel"] diff --git a/cura/UI/MachineSettingsManager.py b/cura/UI/MachineSettingsManager.py index 3232323bcb..8fdbae09e1 100644 --- a/cura/UI/MachineSettingsManager.py +++ b/cura/UI/MachineSettingsManager.py @@ -25,10 +25,16 @@ class MachineSettingsManager(QObject): # an extruder's compatible material diameter. This ensures that after the modification, changes can be notified # and updated right away. @pyqtSlot(int) - def updateMaterialForDiameter(self, extruder_position: int): + def updateMaterialForDiameter(self, extruder_position: int) -> None: # Updates the material container to a material that matches the material diameter set for the printer self._application.getMachineManager().updateMaterialWithVariant(str(extruder_position)) + @pyqtSlot(int) + def setMachineExtruderCount(self, extruder_count: int) -> None: + # Note: this method was in this class before, but since it's quite generic and other plugins also need it + # it was moved to the machine manager instead. Now this method just calls the machine manager. + self._application.getMachineManager().setActiveMachineExtruderCount(extruder_count) + # FIXME(Lipu): Better document what this function does, especially the fuzzy gcode flavor and has_materials logic # regarding UM2 and UM2+ # Function for the Machine Settings panel (QML) to update after the usre changes "Number of Extruders". @@ -37,7 +43,7 @@ class MachineSettingsManager(QObject): machine_manager = self._application.getMachineManager() material_manager = self._application.getMaterialManager() - global_stack = material_manager.activeMachine + global_stack = machine_manager.activeMachine definition = global_stack.definition if definition.getProperty("machine_gcode_flavor", "value") != "UltiGCode" or definition.getMetaDataEntry( diff --git a/cura/UI/WelcomePagesModel.py b/cura/UI/WelcomePagesModel.py index 87158b35c3..222de27d17 100644 --- a/cura/UI/WelcomePagesModel.py +++ b/cura/UI/WelcomePagesModel.py @@ -30,13 +30,6 @@ class WelcomePagesModel(ListModel): def initialize(self) -> None: from cura.CuraApplication import CuraApplication - self._pages.append({"id": "test", - "page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, - os.path.join("WelcomePages", - "TestContent.qml"))), - }) - - # Add default welcome pages self._pages.append({"id": "welcome", "page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, @@ -68,6 +61,11 @@ class WelcomePagesModel(ListModel): os.path.join("WelcomePages", "AddPrinterByIpContent.qml"))), }) + self._pages.append({"id": "machine_actions", + "page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, + os.path.join("WelcomePages", + "FirstStartMachineActionsContent.qml"))), + }) self._pages.append({"id": "cloud", "page_url": QUrl.fromLocalFile(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, os.path.join("WelcomePages", diff --git a/plugins/MachineSettingsAction/MachineSettingsAction.qml b/plugins/MachineSettingsAction/MachineSettingsAction.qml index ef8fda224a..28eb37e939 100644 --- a/plugins/MachineSettingsAction/MachineSettingsAction.qml +++ b/plugins/MachineSettingsAction/MachineSettingsAction.qml @@ -1,939 +1,102 @@ -// Copyright (c) 2018 Ultimaker B.V. +// Copyright (c) 2019 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.2 -import QtQuick.Controls 1.1 -import QtQuick.Layouts 1.1 -import QtQuick.Window 2.1 +import QtQuick 2.10 +import QtQuick.Controls 2.3 +import QtQuick.Layouts 1.3 -import UM 1.2 as UM -import Cura 1.0 as Cura +import UM 1.3 as UM +import Cura 1.1 as Cura +// +// This component contains the content for the "Welcome" page of the welcome on-boarding process. +// Cura.MachineAction { - id: base - property var extrudersModel: Cura.ExtrudersModel{} // Do not retrieve the Model from a backend. Otherwise the tabs - // in tabView will not removed/updated. Probably QML bug - property int extruderTabsCount: 0 + UM.I18nCatalog { id: catalog; name: "cura" } - property var activeMachineId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.id : "" + anchors.fill: parent + anchors.margins: UM.Theme.getSize("default_margin").width + property var extrudersModel: Cura.ExtrudersModel {} + + // If we create a CuraTabButton for "Printer" and use Repeater for extruders, for some reason, once the component + // finishes it will automatically change "currentIndex = 1", and it is VERY difficult to change "currentIndex = 0" + // after that. Using a model and a Repeater to create both "Printer" and extruder CuraTabButtons seem to solve this + // problem. Connections { - target: base.extrudersModel - onModelChanged: - { - var extruderCount = base.extrudersModel.count; - base.extruderTabsCount = extruderCount; - } + target: extrudersModel + onItemsChanged: tabNameModel.update() } - Connections + ListModel { - target: dialog ? dialog : null - ignoreUnknownSignals: true - // Any which way this action dialog is dismissed, make sure it is properly finished - onNextClicked: finishAction() - onBackClicked: finishAction() - onAccepted: finishAction() - onRejected: finishAction() - onClosing: finishAction() - } + id: tabNameModel - function finishAction() - { - forceActiveFocus(); - manager.onFinishAction(); - } + Component.onCompleted: update() - anchors.fill: parent; - Item - { - id: machineSettingsAction - anchors.fill: parent; - - UM.I18nCatalog { id: catalog; name: "cura"; } - - Label + function update() { - id: pageTitle - width: parent.width - text: catalog.i18nc("@title", "Machine Settings") - wrapMode: Text.WordWrap - font.pointSize: 18; - } - - TabView - { - id: settingsTabs - height: parent.height - y - width: parent.width - anchors.left: parent.left - anchors.top: pageTitle.bottom - anchors.topMargin: UM.Theme.getSize("default_margin").height - - property real columnWidth: Math.round((width - 3 * UM.Theme.getSize("default_margin").width) / 2) - property real labelColumnWidth: Math.round(columnWidth / 2) - - Tab + clear() + append({ name: catalog.i18nc("@title:tab", "Printer") }) + for (var i = 0; i < extrudersModel.count; i++) { - title: catalog.i18nc("@title:tab", "Printer"); - anchors.margins: UM.Theme.getSize("default_margin").width + const m = extrudersModel.getItem(i) + append({ name: m.name }) + } + } + } - Column + Rectangle + { + anchors.fill: parent + border.color: tabBar.visible ? UM.Theme.getColor("lining") : "transparent" + border.width: UM.Theme.getSize("default_lining").width + radius: UM.Theme.getSize("default_radius").width + + UM.TabRow + { + id: tabBar + width: parent.width + + Repeater + { + model: tabNameModel + delegate: Cura.CuraTabButton { - spacing: UM.Theme.getSize("default_margin").height - - Row - { - width: parent.width - spacing: UM.Theme.getSize("default_margin").height - - Column - { - width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Printer Settings") - font.bold: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: buildAreaWidthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_width" - property string label: catalog.i18nc("@label", "X (Width)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Loader - { - id: buildAreaDepthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_depth" - property string label: catalog.i18nc("@label", "Y (Depth)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Loader - { - id: buildAreaHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_height" - property string label: catalog.i18nc("@label", "Z (Height)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: shapeComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_shape" - property string label: catalog.i18nc("@label", "Build plate shape") - property bool forceUpdateOnChange: true - } - - Loader - { - id: centerIsZeroCheckBox - sourceComponent: simpleCheckBox - property string settingKey: "machine_center_is_zero" - property string label: catalog.i18nc("@option:check", "Origin at center") - property bool forceUpdateOnChange: true - } - Loader - { - id: heatedBedCheckBox - sourceComponent: simpleCheckBox - property var settingKey: "machine_heated_bed" - property string label: catalog.i18nc("@option:check", "Heated bed") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: gcodeFlavorComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_gcode_flavor" - property string label: catalog.i18nc("@label", "G-code flavor") - property bool forceUpdateOnChange: true - property var afterOnActivate: manager.updateHasMaterialsMetadata - } - } - - Column - { - width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Printhead Settings") - font.bold: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: printheadXMinField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "X min") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "x" - property string side: "min" - } - - Loader - { - id: printheadYMinField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "Y min") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "y" - property string side: "min" - } - - Loader - { - id: printheadXMaxField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "X max") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "x" - property string side: "max" - } - - Loader - { - id: printheadYMaxField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "Y max") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "y" - property string side: "max" - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: gantryHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "gantry_height" - property string label: catalog.i18nc("@label", "Gantry height") - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - UM.TooltipArea - { - height: childrenRect.height - width: childrenRect.width - text: machineExtruderCountProvider.properties.description - visible: extruderCountModel.count >= 2 - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: catalog.i18nc("@label", "Number of Extruders") - elide: Text.ElideRight - width: Math.max(0, settingsTabs.labelColumnWidth) - anchors.verticalCenter: extruderCountComboBox.verticalCenter - } - ComboBox - { - id: extruderCountComboBox - model: ListModel - { - id: extruderCountModel - Component.onCompleted: - { - for(var i = 0; i < manager.definedExtruderCount; i++) - { - extruderCountModel.append({text: String(i + 1), value: i}); - } - } - } - - Connections - { - target: manager - onDefinedExtruderCountChanged: - { - extruderCountModel.clear(); - for(var i = 0; i < manager.definedExtruderCount; ++i) - { - extruderCountModel.append({text: String(i + 1), value: i}); - } - } - } - - currentIndex: machineExtruderCountProvider.properties.value - 1 - onActivated: - { - manager.setMachineExtruderCount(index + 1); - } - } - } - } - } - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.right: parent.right - height: parent.height - y - Column - { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "Start G-code") - font.bold: true - } - Loader - { - id: machineStartGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_start_gcode" - property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very start.") - } - } - - Column { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "End G-code") - font.bold: true - } - Loader - { - id: machineEndGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_end_gcode" - property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very end.") - } - } - } + text: model.name } } + } - onCurrentIndexChanged: + StackLayout + { + id: tabStack + anchors.top: tabBar.bottom + anchors.left: parent.left + anchors.right: parent.right + anchors.bottom: parent.bottom + + width: parent.width + currentIndex: tabBar.currentIndex + + MachineSettingsPrinterTab { - if(currentIndex > 0) - { - contentItem.forceActiveFocus(); - } + id: printerTab } Repeater { - id: extruderTabsRepeater - model: base.extruderTabsCount - - Tab + model: extrudersModel + delegate: MachineSettingsExtruderTab { - title: base.extrudersModel.getItem(index).name - anchors.margins: UM.Theme.getSize("default_margin").width - - Column - { - spacing: UM.Theme.getSize("default_lining").width - - Label - { - text: catalog.i18nc("@label", "Nozzle Settings") - font.bold: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: extruderNozzleSizeField - visible: !Cura.MachineManager.hasVariants - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_size" - property string label: catalog.i18nc("@label", "Nozzle size") - property string unit: catalog.i18nc("@label", "mm") - function afterOnEditingFinished() - { - // Somehow the machine_nozzle_size dependent settings are not updated otherwise - Cura.MachineManager.forceUpdateAllSettings() - } - property bool isExtruderSetting: true - } - - Loader - { - id: materialDiameterField - visible: Cura.MachineManager.hasMaterials - sourceComponent: numericTextFieldWithUnit - property string settingKey: "material_diameter" - property string label: catalog.i18nc("@label", "Compatible material diameter") - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The nominal diameter of filament supported by the printer. The exact diameter will be overridden by the material and/or the profile.") - function afterOnEditingFinished() - { - if (settingsTabs.currentIndex > 0) - { - manager.updateMaterialForDiameter(settingsTabs.currentIndex - 1) - } - } - function setValueFunction(value) - { - if (settingsTabs.currentIndex > 0) - { - const extruderIndex = index.toString() - Cura.MachineManager.activeMachine.extruders[extruderIndex].compatibleMaterialDiameter = value - } - } - property bool isExtruderSetting: true - } - - Loader - { - id: extruderOffsetXField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_offset_x" - property string label: catalog.i18nc("@label", "Nozzle offset X") - property string unit: catalog.i18nc("@label", "mm") - property bool isExtruderSetting: true - property bool forceUpdateOnChange: true - property bool allowNegative: true - } - - Loader - { - id: extruderOffsetYField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_nozzle_offset_y" - property string label: catalog.i18nc("@label", "Nozzle offset Y") - property string unit: catalog.i18nc("@label", "mm") - property bool isExtruderSetting: true - property bool forceUpdateOnChange: true - property bool allowNegative: true - } - - Loader - { - id: extruderCoolingFanNumberField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_extruder_cooling_fan_number" - property string label: catalog.i18nc("@label", "Cooling Fan Number") - property string unit: catalog.i18nc("@label", "") - property bool isExtruderSetting: true - property bool forceUpdateOnChange: true - property bool allowNegative: false - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.right: parent.right - height: parent.height - y - Column - { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "Extruder Start G-code") - font.bold: true - } - Loader - { - id: extruderStartGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_extruder_start_code" - property bool isExtruderSetting: true - } - } - Column { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "Extruder End G-code") - font.bold: true - } - Loader - { - id: extruderEndGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_extruder_end_code" - property bool isExtruderSetting: true - } - } - } - } + id: discoverTab + extruderPosition: model.index + extruderStackId: model.id } } } } - - Component - { - id: simpleCheckBox - UM.TooltipArea - { - height: checkBox.height - width: checkBox.width - text: _tooltip - - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting - property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false: forceUpdateOnChange - property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip - - UM.SettingPropertyProvider - { - id: propertyProvider - - containerStackId: { - if(_isExtruderSetting) - { - if(settingsTabs.currentIndex > 0) - { - return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; - } - return ""; - } - return base.activeMachineId - } - key: settingKey - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - CheckBox - { - id: checkBox - text: label - checked: String(propertyProvider.properties.value).toLowerCase() != 'false' - onClicked: - { - propertyProvider.setPropertyValue("value", checked); - if(_forceUpdateOnChange) - { - manager.forceUpdate(); - } - } - } - } - } - - Component - { - id: numericTextFieldWithUnit - UM.TooltipArea - { - height: childrenRect.height - width: childrenRect.width - text: _tooltip - - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false: isExtruderSetting - property bool _allowNegative: (typeof(allowNegative) === 'undefined') ? false : allowNegative - property var _afterOnEditingFinished: (typeof(afterOnEditingFinished) === 'undefined') ? undefined : afterOnEditingFinished - property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange - property string _label: (typeof(label) === 'undefined') ? "" : label - property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip - property var _setValueFunction: (typeof(setValueFunction) === 'undefined') ? undefined : setValueFunction - - UM.SettingPropertyProvider - { - id: propertyProvider - - containerStackId: { - if(_isExtruderSetting) - { - if(settingsTabs.currentIndex > 0) - { - return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; - } - return ""; - } - return base.activeMachineId - } - key: settingKey - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: _label - visible: _label != "" - elide: Text.ElideRight - width: Math.max(0, settingsTabs.labelColumnWidth) - anchors.verticalCenter: textFieldWithUnit.verticalCenter - } - - Item - { - width: textField.width - height: textField.height - - id: textFieldWithUnit - TextField - { - id: textField - text: { - const value = propertyProvider.properties.value; - return value ? value : ""; - } - validator: RegExpValidator { regExp: _allowNegative ? /-?[0-9\.,]{0,6}/ : /[0-9\.,]{0,6}/ } - onEditingFinished: - { - if (propertyProvider && text != propertyProvider.properties.value) - { - // For some properties like the extruder-compatible material diameter, they need to - // trigger many updates, such as the available materials, the current material may - // need to be switched, etc. Although setting the diameter can be done directly via - // the provider, all the updates that need to be triggered then need to depend on - // the metadata update, a signal that can be fired way too often. The update functions - // can have if-checks to filter out the irrelevant updates, but still it incurs unnecessary - // overhead. - // The ExtruderStack class has a dedicated function for this call "setCompatibleMaterialDiameter()", - // and it triggers the diameter update signals only when it is needed. Here it is optionally - // choose to use setCompatibleMaterialDiameter() or other more specific functions that - // are available. - if (_setValueFunction !== undefined) - { - _setValueFunction(text) - } - else - { - propertyProvider.setPropertyValue("value", text) - } - if(_forceUpdateOnChange) - { - manager.forceUpdate() - } - if(_afterOnEditingFinished) - { - _afterOnEditingFinished() - } - } - } - } - - Label - { - text: unit - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter - } - } - } - } - } - - Component - { - id: comboBoxWithOptions - UM.TooltipArea - { - height: childrenRect.height - width: childrenRect.width - text: _tooltip - - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting - property bool _forceUpdateOnChange: (typeof(forceUpdateOnChange) === 'undefined') ? false : forceUpdateOnChange - property var _afterOnActivate: (typeof(afterOnActivate) === 'undefined') ? undefined : afterOnActivate - property string _label: (typeof(label) === 'undefined') ? "" : label - property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip - - UM.SettingPropertyProvider - { - id: propertyProvider - - containerStackId: { - if(_isExtruderSetting) - { - if(settingsTabs.currentIndex > 0) - { - return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; - } - return ""; - } - return base.activeMachineId - } - key: settingKey - watchedProperties: [ "value", "options", "description" ] - storeIndex: manager.containerIndex - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: _label - visible: _label != "" - elide: Text.ElideRight - width: Math.max(0, settingsTabs.labelColumnWidth) - anchors.verticalCenter: comboBox.verticalCenter - } - ComboBox - { - id: comboBox - model: ListModel - { - id: optionsModel - Component.onCompleted: - { - // Options come in as a string-representation of an OrderedDict - var options = propertyProvider.properties.options.match(/^OrderedDict\(\[\((.*)\)\]\)$/); - if(options) - { - options = options[1].split("), (") - for(var i = 0; i < options.length; i++) - { - var option = options[i].substring(1, options[i].length - 1).split("', '") - optionsModel.append({text: option[1], value: option[0]}); - } - } - } - } - currentIndex: - { - var currentValue = propertyProvider.properties.value; - var index = 0; - for(var i = 0; i < optionsModel.count; i++) - { - if(optionsModel.get(i).value == currentValue) { - index = i; - break; - } - } - return index - } - onActivated: - { - if(propertyProvider.properties.value != optionsModel.get(index).value) - { - propertyProvider.setPropertyValue("value", optionsModel.get(index).value); - if(_forceUpdateOnChange) - { - manager.forceUpdate(); - } - if(_afterOnActivate) - { - _afterOnActivate(); - } - } - } - } - } - } - } - - Component - { - id: gcodeTextArea - - UM.TooltipArea - { - height: gcodeArea.height - width: gcodeArea.width - text: _tooltip - - property bool _isExtruderSetting: (typeof(isExtruderSetting) === 'undefined') ? false : isExtruderSetting - property string _tooltip: (typeof(tooltip) === 'undefined') ? propertyProvider.properties.description : tooltip - - UM.SettingPropertyProvider - { - id: propertyProvider - - containerStackId: { - if(_isExtruderSetting) - { - if(settingsTabs.currentIndex > 0) - { - return Cura.ExtruderManager.extruderIds[String(settingsTabs.currentIndex - 1)]; - } - return ""; - } - return base.activeMachineId - } - key: settingKey - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - TextArea - { - id: gcodeArea - width: areaWidth - height: areaHeight - font: UM.Theme.getFont("fixed") - text: (propertyProvider.properties.value) ? propertyProvider.properties.value : "" - onActiveFocusChanged: - { - if(!activeFocus) - { - propertyProvider.setPropertyValue("value", gcodeArea.text) - } - } - Component.onCompleted: - { - wrapMode = TextEdit.NoWrap; - } - } - } - } - - Component - { - id: headPolygonTextField - UM.TooltipArea - { - height: textField.height - width: textField.width - text: tooltip - - property string _label: (typeof(label) === 'undefined') ? "" : label - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - text: _label - visible: _label != "" - elide: Text.ElideRight - width: Math.max(0, settingsTabs.labelColumnWidth) - anchors.verticalCenter: textFieldWithUnit.verticalCenter - } - - Item - { - id: textFieldWithUnit - width: textField.width - height: textField.height - - TextField - { - id: textField - text: - { - var polygon = JSON.parse(machineHeadPolygonProvider.properties.value); - var item = (axis == "x") ? 0 : 1 - var result = polygon[0][item]; - for(var i = 1; i < polygon.length; i++) { - if (side == "min") { - result = Math.min(result, polygon[i][item]); - } else { - result = Math.max(result, polygon[i][item]); - } - } - result = Math.abs(result); - printHeadPolygon[axis][side] = result; - return result; - } - validator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ } - onEditingFinished: - { - printHeadPolygon[axis][side] = parseFloat(textField.text.replace(',','.')); - var polygon = []; - polygon.push([-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]]); - polygon.push([-printHeadPolygon["x"]["min"],-printHeadPolygon["y"]["min"]]); - polygon.push([ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]]); - polygon.push([ printHeadPolygon["x"]["max"],-printHeadPolygon["y"]["min"]]); - var polygon_string = JSON.stringify(polygon); - if(polygon_string != machineHeadPolygonProvider.properties.value) - { - machineHeadPolygonProvider.setPropertyValue("value", polygon_string); - manager.forceUpdate(); - } - } - } - - Label - { - text: catalog.i18nc("@label", "mm") - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter - } - } - } - } - } - - property var printHeadPolygon: - { - "x": { - "min": 0, - "max": 0, - }, - "y": { - "min": 0, - "max": 0, - }, - } - - - UM.SettingPropertyProvider - { - id: machineExtruderCountProvider - - containerStackId: base.activeMachineId - key: "machine_extruder_count" - watchedProperties: [ "value", "description" ] - storeIndex: manager.containerIndex - } - - UM.SettingPropertyProvider - { - id: machineHeadPolygonProvider - - containerStackId: base.activeMachineId - key: "machine_head_with_fans_polygon" - watchedProperties: [ "value" ] - storeIndex: manager.containerIndex - } } diff --git a/resources/qml/WelcomePages/MachineSettingsExtruderTab.qml b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml similarity index 93% rename from resources/qml/WelcomePages/MachineSettingsExtruderTab.qml rename to plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml index 3ed82a6dde..270bd7e828 100644 --- a/resources/qml/WelcomePages/MachineSettingsExtruderTab.qml +++ b/plugins/MachineSettingsAction/MachineSettingsExtruderTab.qml @@ -7,13 +7,10 @@ import QtQuick.Controls 2.3 import UM 1.3 as UM import Cura 1.1 as Cura -import "../MachineSettings" - // // This component contains the content for the "Welcome" page of the welcome on-boarding process. // - Item { id: base @@ -68,7 +65,7 @@ Item renderType: Text.NativeRendering } - NumericTextFieldWithUnit // "Nozzle size" + Cura.NumericTextFieldWithUnit // "Nozzle size" { id: extruderNozzleSizeField visible: !Cura.MachineManager.hasVariants @@ -83,7 +80,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Compatible material diameter" + Cura.NumericTextFieldWithUnit // "Compatible material diameter" { id: extruderCompatibleMaterialDiameterField containerStackId: base.extruderStackId @@ -99,7 +96,7 @@ Item afterOnEditingFinishedFunction: updateMaterialDiameter } - NumericTextFieldWithUnit // "Nozzle offset X" + Cura.NumericTextFieldWithUnit // "Nozzle offset X" { id: extruderNozzleOffsetXField containerStackId: base.extruderStackId @@ -113,7 +110,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Nozzle offset Y" + Cura.NumericTextFieldWithUnit // "Nozzle offset Y" { id: extruderNozzleOffsetYField containerStackId: base.extruderStackId @@ -127,7 +124,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Cooling Fan Number" + Cura.NumericTextFieldWithUnit // "Cooling Fan Number" { id: extruderNozzleCoolingFanNumberField containerStackId: base.extruderStackId @@ -152,7 +149,7 @@ Item anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").width - GcodeTextArea // "Extruder Start G-code" + Cura.GcodeTextArea // "Extruder Start G-code" { anchors.top: parent.top anchors.bottom: parent.bottom @@ -166,7 +163,7 @@ Item settingStoreIndex: propertyStoreIndex } - GcodeTextArea // "Extruder End G-code" + Cura.GcodeTextArea // "Extruder End G-code" { anchors.top: parent.top anchors.bottom: parent.bottom diff --git a/resources/qml/WelcomePages/MachineSettingsPrinterTab.qml b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml similarity index 89% rename from resources/qml/WelcomePages/MachineSettingsPrinterTab.qml rename to plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml index 6971ab74db..c952e4cfb3 100644 --- a/resources/qml/WelcomePages/MachineSettingsPrinterTab.qml +++ b/plugins/MachineSettingsAction/MachineSettingsPrinterTab.qml @@ -7,8 +7,6 @@ import QtQuick.Controls 2.3 import UM 1.3 as UM import Cura 1.1 as Cura -import "../MachineSettings" - // // This the content in the "Printer" tab in the Machine Settings dialog. @@ -62,7 +60,7 @@ Item renderType: Text.NativeRendering } - NumericTextFieldWithUnit // "X (Width)" + Cura.NumericTextFieldWithUnit // "X (Width)" { id: machineXWidthField containerStackId: machineStackId @@ -76,7 +74,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Y (Depth)" + Cura.NumericTextFieldWithUnit // "Y (Depth)" { id: machineYDepthField containerStackId: machineStackId @@ -90,7 +88,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Z (Height)" + Cura.NumericTextFieldWithUnit // "Z (Height)" { id: machineZHeightField containerStackId: machineStackId @@ -104,7 +102,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - ComboBoxWithOptions // "Build plate shape" + Cura.ComboBoxWithOptions // "Build plate shape" { id: buildPlateShapeComboBox containerStackId: machineStackId @@ -117,7 +115,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - SimpleCheckBox // "Origin at center" + Cura.SimpleCheckBox // "Origin at center" { id: originAtCenterCheckBox containerStackId: machineStackId @@ -129,7 +127,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - SimpleCheckBox // "Heated bed" + Cura.SimpleCheckBox // "Heated bed" { id: heatedBedCheckBox containerStackId: machineStackId @@ -141,7 +139,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - ComboBoxWithOptions // "G-code flavor" + Cura.ComboBoxWithOptions // "G-code flavor" { id: gcodeFlavorComboBox containerStackId: machineStackId @@ -177,7 +175,7 @@ Item renderType: Text.NativeRendering } - PrintHeadMinMaxTextField // "X min" + Cura.PrintHeadMinMaxTextField // "X min" { id: machineXMinField @@ -195,7 +193,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - PrintHeadMinMaxTextField // "Y min" + Cura.PrintHeadMinMaxTextField // "Y min" { id: machineYMinField @@ -213,7 +211,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - PrintHeadMinMaxTextField // "X max" + Cura.PrintHeadMinMaxTextField // "X max" { id: machineXMaxField @@ -231,7 +229,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - PrintHeadMinMaxTextField // "Y max" + Cura.PrintHeadMinMaxTextField // "Y max" { id: machineYMaxField @@ -251,7 +249,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - NumericTextFieldWithUnit // "Gantry Height" + Cura.NumericTextFieldWithUnit // "Gantry Height" { id: machineGantryHeightField containerStackId: machineStackId @@ -265,7 +263,7 @@ Item forceUpdateOnChangeFunction: forceUpdateFunction } - ComboBoxWithOptions // "Number of Extruders" + Cura.ComboBoxWithOptions // "Number of Extruders" { id: numberOfExtrudersComboBox containerStackId: machineStackId @@ -280,6 +278,7 @@ Item // This has something to do with UM2 and UM2+ regarding "has_material" and the gcode flavor settings. // I don't remember exactly what. afterOnEditingFinishedFunction: CuraApplication.getMachineSettingsManager().updateHasMaterialsMetadata + setValueFunction: CuraApplication.getMachineSettingsManager().setMachineExtruderCount optionModel: ListModel { @@ -289,7 +288,10 @@ Item extruderCountModel.clear() for (var i = 1; i <= Cura.MachineManager.activeMachine.maxExtruderCount; i++) { - extruderCountModel.append({text: String(i), value: i}) + // Use String as value. JavaScript only has Number. PropertyProvider.setPropertyValue() + // takes a QVariant as value, and Number gets translated into a float. This will cause problem + // for integer settings such as "Number of Extruders". + extruderCountModel.append({ text: String(i), value: String(i) }) } } } @@ -306,7 +308,7 @@ Item anchors.right: parent.right anchors.margins: UM.Theme.getSize("default_margin").width - GcodeTextArea // "Start G-code" + Cura.GcodeTextArea // "Start G-code" { anchors.top: parent.top anchors.bottom: parent.bottom @@ -320,7 +322,7 @@ Item settingStoreIndex: propertyStoreIndex } - GcodeTextArea // "End G-code" + Cura.GcodeTextArea // "End G-code" { anchors.top: parent.top anchors.bottom: parent.bottom diff --git a/resources/qml/MachineSettings/ComboBoxWithOptions.qml b/resources/qml/MachineSettings/ComboBoxWithOptions.qml index 6abc2bde22..012e36817b 100644 --- a/resources/qml/MachineSettings/ComboBoxWithOptions.qml +++ b/resources/qml/MachineSettings/ComboBoxWithOptions.qml @@ -41,6 +41,7 @@ UM.TooltipArea // callback functions property var forceUpdateOnChangeFunction: dummy_func property var afterOnEditingFinishedFunction: dummy_func + property var setValueFunction: null // a dummy function for default property values function dummy_func() {} @@ -76,7 +77,7 @@ UM.TooltipArea for (var i = 0; i < options.length; i++) { var option = options[i].substring(1, options[i].length - 1).split("', '") - append({text: option[1], value: option[0]}) + append({ text: option[1], value: option[0] }) } } } @@ -118,9 +119,17 @@ UM.TooltipArea onActivated: { - if (propertyProvider.properties.value != model.get(index).value) + var newValue = model.get(index).value + if (propertyProvider.properties.value != newValue) { - propertyProvider.setPropertyValue("value", model.get(index).value) + if (setValueFunction !== null) + { + setValueFunction(newValue) + } + else + { + propertyProvider.setPropertyValue("value", newValue) + } forceUpdateOnChangeFunction() afterOnEditingFinishedFunction() } diff --git a/resources/qml/MachineSettings/MachineSettingsContent.qml b/resources/qml/MachineSettings/MachineSettingsContent.qml deleted file mode 100644 index daa41d4c5d..0000000000 --- a/resources/qml/MachineSettings/MachineSettingsContent.qml +++ /dev/null @@ -1,55 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 -import QtQuick.Layouts 1.3 - - -Item -{ - id: base - anchors.fill: parent - - TabBar - { - id: bar - width: parent.width - TabButton - { - text: "Printer" - } - - Repeater - { - id: extrudersTabsRepeater - model: ["Extruder 1", "Extruder 2", "Extruder 3"] - - TabButton - { - text: modelData - } - } - } - - StackLayout - { - width: parent.width - currentIndex: bar.currentIndex - Item - { - id: printerTab - } - Repeater - { - model: ["Extruder 1", "Extruder 2", "Extruder 3"] - Item - { - anchors.centerIn: parent - - Label // TODO: this is a dummy - { - anchors.centerIn: parent - text: modelData - } - } - } - } -} diff --git a/resources/qml/MachineSettings/PolygonTextField.qml b/resources/qml/MachineSettings/PolygonTextField.qml deleted file mode 100644 index 59664b9f23..0000000000 --- a/resources/qml/MachineSettings/PolygonTextField.qml +++ /dev/null @@ -1,120 +0,0 @@ -// Copyright (c) 2019 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 UM 1.3 as UM -import Cura 1.1 as Cura - - -// -// TextField for editing polygon data in the Machine Settings dialog. -// -UM.TooltipArea -{ - UM.I18nCatalog { id: catalog; name: "cura"; } - - height: textField.height - width: textField.width - text: tooltip - - property alias containerStackId: propertyProvider.containerStackId - property alias settingKey: propertyProvider.key - property alias settingStoreIndex: propertyProvider.storeIndex - - property alias labelText: fieldLabel.text - property alias labelWidth: fieldLabel.width - property string unitText: catalog.i18nc("@label", "mm") - - // callback functions - property var forceUpdateOnChangeFunction: dummy_func - - // a dummy function for default property values - function dummy_func() {} - - property var printHeadPolygon: - { - "x": { - "min": 0, - "max": 0, - }, - "y": { - "min": 0, - "max": 0, - }, - } - - UM.SettingPropertyProvider - { - id: propertyProvider - watchedProperties: [ "value" ] - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - id: fieldLabel - anchors.verticalCenter: textFieldWithUnit.verticalCenter - visible: text != "" - elide: Text.ElideRight - //width: Math.max(0, settingsTabs.labelColumnWidth) - } - - Item - { - id: textFieldWithUnit - width: textField.width - height: textField.height - - TextField - { - id: textField - text: - { - var polygon = JSON.parse(propertyProvider.properties.value) - var item = (axis == "x") ? 0 : 1 - var result = polygon[0][item] - for (var i = 1; i < polygon.length; i++) { - result = (side == "min") - ? Math.min(result, polygon[i][item]) - : Math.max(result, polygon[i][item]) - } - result = Math.abs(result) - printHeadPolygon[axis][side] = result - return result - } - validator: RegExpValidator { regExp: /[0-9\.,]{0,6}/ } - onEditingFinished: - { - printHeadPolygon[axis][side] = parseFloat(textField.text.replace(',','.')) - var polygon = [ - [-printHeadPolygon["x"]["min"], printHeadPolygon["y"]["max"]], - [-printHeadPolygon["x"]["min"], -printHeadPolygon["y"]["min"]], - [ printHeadPolygon["x"]["max"], printHeadPolygon["y"]["max"]], - [ printHeadPolygon["x"]["max"], -printHeadPolygon["y"]["min"]] - ] - var polygon_string = JSON.stringify(polygon) - if (polygon_string != propertyProvider.properties.value) - { - propertyProvider.setPropertyValue("value", polygon_string) - forceUpdateOnChangeFunction() - } - } - } - - Label - { - id: unitLabel - text: unitText - anchors.right: textField.right - anchors.rightMargin: y - textField.y - anchors.verticalCenter: textField.verticalCenter - } - } - } -} diff --git a/resources/qml/MachineSettings/PrintSetupContent.qml b/resources/qml/MachineSettings/PrintSetupContent.qml deleted file mode 100644 index d2469ff71d..0000000000 --- a/resources/qml/MachineSettings/PrintSetupContent.qml +++ /dev/null @@ -1,272 +0,0 @@ -import QtQuick 2.10 -import QtQuick.Controls 2.3 -import QtQuick.Layouts 1.3 - - -Column -{ - spacing: UM.Theme.getSize("default_margin").height - - Row - { - width: parent.width - spacing: UM.Theme.getSize("default_margin").height - - Column - { - width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Printer Settings") - font.bold: true - renderType: Text.NativeRendering - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: buildAreaWidthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_width" - property string label: catalog.i18nc("@label", "X (Width)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Loader - { - id: buildAreaDepthField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_depth" - property string label: catalog.i18nc("@label", "Y (Depth)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Loader - { - id: buildAreaHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "machine_height" - property string label: catalog.i18nc("@label", "Z (Height)") - property string unit: catalog.i18nc("@label", "mm") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: shapeComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_shape" - property string label: catalog.i18nc("@label", "Build plate shape") - property bool forceUpdateOnChange: true - } - - Loader - { - id: centerIsZeroCheckBox - sourceComponent: simpleCheckBox - property string settingKey: "machine_center_is_zero" - property string label: catalog.i18nc("@option:check", "Origin at center") - property bool forceUpdateOnChange: true - } - Loader - { - id: heatedBedCheckBox - sourceComponent: simpleCheckBox - property var settingKey: "machine_heated_bed" - property string label: catalog.i18nc("@option:check", "Heated bed") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: gcodeFlavorComboBox - sourceComponent: comboBoxWithOptions - property string settingKey: "machine_gcode_flavor" - property string label: catalog.i18nc("@label", "G-code flavor") - property bool forceUpdateOnChange: true - property var afterOnActivate: manager.updateHasMaterialsMetadata - } - } - - Column - { - width: settingsTabs.columnWidth - spacing: UM.Theme.getSize("default_lining").height - - Label - { - text: catalog.i18nc("@label", "Printhead Settings") - font.bold: true - renderType: Text.NativeRendering - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: printheadXMinField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "X min") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the left of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "x" - property string side: "min" - } - - Loader - { - id: printheadYMinField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "Y min") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the front of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "y" - property string side: "min" - } - - Loader - { - id: printheadXMaxField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "X max") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the right of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "x" - property string side: "max" - } - - Loader - { - id: printheadYMaxField - sourceComponent: headPolygonTextField - property string label: catalog.i18nc("@label", "Y max") - property string tooltip: catalog.i18nc("@tooltip", "Distance from the rear of the printhead to the center of the nozzle. Used to prevent colissions between previous prints and the printhead when printing \"One at a Time\".") - property string axis: "y" - property string side: "max" - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - Loader - { - id: gantryHeightField - sourceComponent: numericTextFieldWithUnit - property string settingKey: "gantry_height" - property string label: catalog.i18nc("@label", "Gantry height") - property string unit: catalog.i18nc("@label", "mm") - property string tooltip: catalog.i18nc("@tooltip", "The height difference between the tip of the nozzle and the gantry system (X and Y axes). Used to prevent collisions between previous prints and the gantry when printing \"One at a Time\".") - property bool forceUpdateOnChange: true - } - - Item { width: UM.Theme.getSize("default_margin").width; height: UM.Theme.getSize("default_margin").height } - - UM.TooltipArea - { - height: childrenRect.height - width: childrenRect.width - text: machineExtruderCountProvider.properties.description - visible: extruderCountModel.count >= 2 - - Row - { - spacing: UM.Theme.getSize("default_margin").width - - Label - { - anchors.verticalCenter: extruderCountComboBox.verticalCenter - width: Math.max(0, settingsTabs.labelColumnWidth) - text: catalog.i18nc("@label", "Number of Extruders") - elide: Text.ElideRight - renderType: Text.NativeRendering - } - ComboBox - { - id: extruderCountComboBox - model: ListModel - { - id: extruderCountModel - Component.onCompleted: - { - for(var i = 0; i < manager.definedExtruderCount; i++) - { - extruderCountModel.append({text: String(i + 1), value: i}) - } - } - } - - Connections - { - target: manager - onDefinedExtruderCountChanged: - { - extruderCountModel.clear(); - for(var i = 0; i < manager.definedExtruderCount; ++i) - { - extruderCountModel.append({text: String(i + 1), value: i}); - } - } - } - - currentIndex: machineExtruderCountProvider.properties.value - 1 - onActivated: - { - manager.setMachineExtruderCount(index + 1); - } - } - } - } - } - } - - Row - { - spacing: UM.Theme.getSize("default_margin").width - anchors.left: parent.left - anchors.right: parent.right - height: parent.height - y - Column - { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "Start G-code") - font.bold: true - } - Loader - { - id: machineStartGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_start_gcode" - property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very start.") - } - } - - Column { - height: parent.height - width: settingsTabs.columnWidth - Label - { - text: catalog.i18nc("@label", "End G-code") - font.bold: true - } - Loader - { - id: machineEndGcodeField - sourceComponent: gcodeTextArea - property int areaWidth: parent.width - property int areaHeight: parent.height - y - property string settingKey: "machine_end_gcode" - property string tooltip: catalog.i18nc("@tooltip", "G-code commands to be executed at the very end.") - } - } - } -} diff --git a/resources/qml/WelcomePages/AddPrinterBySelectionContent.qml b/resources/qml/WelcomePages/AddPrinterBySelectionContent.qml index 3282b219c9..faa2d259be 100644 --- a/resources/qml/WelcomePages/AddPrinterBySelectionContent.qml +++ b/resources/qml/WelcomePages/AddPrinterBySelectionContent.qml @@ -137,18 +137,18 @@ Item // Create a network printer const networkPrinterItem = addNetworkPrinterDropDown.contentItem.currentItem CuraApplication.getDiscoveredPrintersModel().createMachineFromDiscoveredPrinter(networkPrinterItem) + + // If we have created a machine, go to the last page, which is the "cloud" page. + base.gotoPage("cloud") } else { // Create a local printer const localPrinterItem = addLocalPrinterDropDown.contentItem.currentItem Cura.MachineManager.addMachine(localPrinterItem.id) + + base.gotoPage("machine_actions") } - - // TODO: implement machine actions - - // If we have created a machine, go to the last page, which is the "cloud" page. - base.gotoPage("cloud") } } } diff --git a/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml b/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml new file mode 100644 index 0000000000..84f5f5acac --- /dev/null +++ b/resources/qml/WelcomePages/FirstStartMachineActionsContent.qml @@ -0,0 +1,91 @@ +// Copyright (c) 2019 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 or higher. + +import QtQuick 2.10 +import QtQuick.Controls 2.3 + +import UM 1.3 as UM +import Cura 1.1 as Cura + + +// +// This component contains the content for the "What's new in Ultimaker Cura" page of the welcome on-boarding process. +// +Item +{ + UM.I18nCatalog { id: catalog; name: "cura" } + + property var machineActionsModel: CuraApplication.getFirstStartMachineActionsModel() + + property int currentActionIndex: 0 + property var currentActionItem: currentActionIndex >= machineActionsModel.count + ? null : machineActionsModel.getItem(currentActionIndex) + property bool hasActions: machineActionsModel.count > 0 + + // Reset to the first page if the model gets changed. + Connections + { + target: machineActionsModel + onItemsChanged: currentActionIndex = 0 + } + + onVisibleChanged: + { + if (visible) + { + currentActionIndex = 0 + if (!hasActions) + { + base.showNextPage() + } + } + } + + Label + { + id: titleLabel + anchors.top: parent.top + anchors.topMargin: 40 + anchors.horizontalCenter: parent.horizontalCenter + horizontalAlignment: Text.AlignHCenter + text: currentActionItem.title + color: UM.Theme.getColor("primary_button") + font: UM.Theme.getFont("large_bold") + renderType: Text.NativeRendering + } + + Item + { + anchors.top: titleLabel.bottom + anchors.bottom: nextButton.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.bottomMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.right: parent.right + + data: currentActionItem == undefined ? null : currentActionItem.content + } + + Cura.PrimaryButton + { + id: nextButton + anchors.right: parent.right + anchors.bottom: parent.bottom + anchors.margins: 40 + text: catalog.i18nc("@button", "Next") + width: 140 + fixedWidthMode: true + onClicked: + { + // If no more first-start actions to show, go to the next page. + if (currentActionIndex + 1 >= machineActionsModel.count) + { + currentActionIndex = 0 + base.showNextPage() + return + } + + currentActionIndex++ + } + } +} diff --git a/resources/qml/WelcomePages/StepPanel.qml b/resources/qml/WelcomePages/StepPanel.qml index bc99320e02..daca9bcb90 100644 --- a/resources/qml/WelcomePages/StepPanel.qml +++ b/resources/qml/WelcomePages/StepPanel.qml @@ -67,7 +67,7 @@ Item break } } - if (page_index > 0) + if (page_index >= 0) { currentStep = page_index } diff --git a/resources/qml/WelcomePages/TestContent.qml b/resources/qml/WelcomePages/TestContent.qml deleted file mode 100644 index 6071f965b2..0000000000 --- a/resources/qml/WelcomePages/TestContent.qml +++ /dev/null @@ -1,107 +0,0 @@ -// Copyright (c) 2019 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 UM 1.3 as UM -import Cura 1.1 as Cura - -import "../MachineSettings" -import "../Widgets" - - -// -// This component contains the content for the "Welcome" page of the welcome on-boarding process. -// - -Item -{ - id: base - UM.I18nCatalog { id: catalog; name: "cura" } - - anchors.fill: parent - anchors.margins: UM.Theme.getSize("default_margin").width - - property var extrudersModel: Cura.ExtrudersModel {} - - // If we create a CuraTabButton for "Printer" and use Repeater for extruders, for some reason, once the component - // finishes it will automatically change "currentIndex = 1", and it is VERY difficult to change "currentIndex = 0" - // after that. Using a model and a Repeater to create both "Printer" and extruder CuraTabButtons seem to solve this - // problem. - Connections - { - target: extrudersModel - onItemsChanged: tabNameModel.update() - } - - ListModel - { - id: tabNameModel - - Component.onCompleted: update() - - function update() - { - clear() - append({ name: catalog.i18nc("@title:tab", "Printer") }) - for (var i = 0; i < extrudersModel.count; i++) - { - const m = extrudersModel.getItem(i) - append({ name: m.name }) - } - } - } - - Rectangle - { - anchors.fill: parent - border.color: tabBar.visible ? UM.Theme.getColor("lining") : "transparent" - border.width: UM.Theme.getSize("default_lining").width - radius: UM.Theme.getSize("default_radius").width - - UM.TabRow - { - id: tabBar - width: parent.width - - Repeater - { - model: tabNameModel - delegate: CuraTabButton - { - text: model.name - } - } - } - - StackLayout - { - id: tabStack - anchors.top: tabBar.bottom - anchors.left: parent.left - anchors.right: parent.right - anchors.bottom: parent.bottom - - width: parent.width - currentIndex: tabBar.currentIndex - - MachineSettingsPrinterTab - { - id: printerTab - } - - Repeater - { - model: extrudersModel - delegate: MachineSettingsExtruderTab - { - id: discoverTab - extruderPosition: model.index - extruderStackId: model.id - } - } - } - } -} diff --git a/resources/qml/qmldir b/resources/qml/qmldir index 62997cc27a..6de563e2a0 100644 --- a/resources/qml/qmldir +++ b/resources/qml/qmldir @@ -17,3 +17,20 @@ SettingView 1.0 SettingView.qml ProfileMenu 1.0 ProfileMenu.qml CheckBoxWithTooltip 1.0 CheckBoxWithTooltip.qml ToolTip 1.0 ToolTip.qml + + +# Cura/Widgets + +CuraCheckBox 1.0 CuraCheckBox.qml +CuraComboBox 1.0 CuraComboBox.qml +CuraProgressBar 1.0 CuraProgressBar.qml +CuraTabButton 1.0 CuraTabButton.qml + + +# Cura/MachineSettings + +ComboBoxWithOptions 1.0 ComboBoxWithOptions.qml +GcodeTextArea 1.0 GcodeTextArea.qml +NumericTextFieldWithUnit 1.0 NumericTextFieldWithUnit.qml +PrintHeadMinMaxTextField 1.0 PrintHeadMinMaxTextField.qml +SimpleCheckBox 1.0 SimpleCheckBox.qml