Browse Source

WIP: Add first-start machine actions

Lipu Fei 6 years ago
parent
commit
8d68db9ff0

+ 0 - 2
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()
 

+ 54 - 52
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"]

+ 8 - 2
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(

+ 5 - 7
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",

+ 56 - 893
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
 
-    Connections
-    {
-        target: base.extrudersModel
-        onModelChanged:
-        {
-            var extruderCount = base.extrudersModel.count;
-            base.extruderTabsCount = extruderCount;
-        }
-    }
+    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: 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()
+        target: extrudersModel
+        onItemsChanged: tabNameModel.update()
     }
 
-    function finishAction()
+    ListModel
     {
-        forceActiveFocus();
-        manager.onFinishAction();
-    }
-
-    anchors.fill: parent;
-    Item
-    {
-        id: machineSettingsAction
-        anchors.fill: parent;
+        id: tabNameModel
 
-        UM.I18nCatalog { id: catalog; name: "cura"; }
-
-        Label
-        {
-            id: pageTitle
-            width: parent.width
-            text: catalog.i18nc("@title", "Machine Settings")
-            wrapMode: Text.WordWrap
-            font.pointSize: 18;
-        }
+        Component.onCompleted: update()
 
-        TabView
+        function update()
         {
-            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
-
-                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
-                            }
-
-                            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.")
-                            }
-                        }
-                    }
-                }
-            }
-
-            onCurrentIndexChanged:
-            {
-                if(currentIndex > 0)
-                {
-                    contentItem.forceActiveFocus();
-                }
-            }
-
-            Repeater
-            {
-                id: extruderTabsRepeater
-                model: base.extruderTabsCount
-
-                Tab
-                {
-                    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
-                                }
-                            }
-                        }
-                    }
-                }
+                const m = extrudersModel.getItem(i)
+                append({ name: m.name })
             }
         }
     }
 
-    Component
+    Rectangle
     {
-        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
+        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.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
+        UM.TabRow
         {
-            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
-            }
+            id: tabBar
+            width: parent.width
 
-            Row
+            Repeater
             {
-                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
+                model: tabNameModel
+                delegate: Cura.CuraTabButton
                 {
-                    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();
-                            }
-                        }
-                    }
+                    text: model.name
                 }
             }
         }
-    }
-
-    Component
-    {
-        id: gcodeTextArea
 
-        UM.TooltipArea
+        StackLayout
         {
-            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
+            id: tabStack
+            anchors.top: tabBar.bottom
+            anchors.left: parent.left
+            anchors.right: parent.right
+            anchors.bottom: parent.bottom
 
-                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
-            }
+            width: parent.width
+            currentIndex: tabBar.currentIndex
 
-            TextArea
+            MachineSettingsPrinterTab
             {
-                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;
-                }
+                id: printerTab
             }
-        }
-    }
-
-    Component
-    {
-        id: headPolygonTextField
-        UM.TooltipArea
-        {
-            height: textField.height
-            width: textField.width
-            text: tooltip
-
-            property string _label: (typeof(label) === 'undefined') ? "" : label
 
-            Row
+            Repeater
             {
-                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
+                model: extrudersModel
+                delegate: MachineSettingsExtruderTab
                 {
-                    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
-                    }
+                    id: discoverTab
+                    extruderPosition: model.index
+                    extruderStackId: model.id
                 }
             }
         }
     }
-
-    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
-    }
 }

+ 7 - 10
resources/qml/WelcomePages/MachineSettingsExtruderTab.qml → 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

+ 20 - 18
resources/qml/WelcomePages/MachineSettingsPrinterTab.qml → 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

+ 12 - 3
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()
             }

+ 0 - 55
resources/qml/MachineSettings/MachineSettingsContent.qml

@@ -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
-                }
-            }
-        }
-    }
-}

+ 0 - 120
resources/qml/MachineSettings/PolygonTextField.qml

@@ -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
-            }
-        }
-    }
-}

Some files were not shown because too many files changed in this diff