Browse Source

Merge branch 'CURA--6683_icons_per_object_settings'

Ghostkeeper 5 years ago
parent
commit
8b8429d629

+ 152 - 276
plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml

@@ -4,22 +4,68 @@
 import QtQuick 2.2
 import QtQuick.Controls 1.2
 import QtQuick.Controls.Styles 1.2
-import QtQuick.Window 2.2
 
 import UM 1.2 as UM
 import Cura 1.0 as Cura
 import ".."
 
-Item {
-    id: base;
 
-    UM.I18nCatalog { id: catalog; name: "cura"; }
-
-    width: childrenRect.width;
-    height: childrenRect.height;
-    property var all_categories_except_support: [ "machine_settings", "resolution", "shell", "infill", "material", "speed",
+Item
+{
+    id: base
+    width: childrenRect.width
+    height: childrenRect.height
+    property var allCategoriesExceptSupport: [ "machine_settings", "resolution", "shell", "infill", "material", "speed",
                                     "travel", "cooling", "platform_adhesion", "dual", "meshfix", "blackmagic", "experimental"]
 
+    readonly property string normalMeshType: ""
+    readonly property string supportMeshType: "support_mesh"
+    readonly property string cuttingMeshType: "cutting_mesh"
+    readonly property string infillMeshType: "infill_mesh"
+    readonly property string antiOverhangMeshType: "anti_overhang_mesh"
+
+    property var currentMeshType: UM.ActiveTool.properties.getValue("MeshType")
+
+    // Update the view every time the currentMeshType changes
+    onCurrentMeshTypeChanged:
+    {
+        var type = currentMeshType
+
+        // set checked state of mesh type buttons
+        normalButton.checked = type === normalMeshType
+        supportMeshButton.checked = type === supportMeshType
+        overhangMeshButton.checked = type === infillMeshType || type === cuttingMeshType
+        antiOverhangMeshButton.checked = type === antiOverhangMeshType
+
+        // update active type label
+        for (var button in meshTypeButtons.children)
+        {
+            if (meshTypeButtons.children[button].checked){
+                meshTypeLabel.text = catalog.i18nc("@label", "Mesh Type") + ": " + meshTypeButtons.children[button].text
+                break
+            }
+        }
+    }
+
+    function setOverhangsMeshType()
+    {
+        if (infillOnlyCheckbox.checked)
+        {
+            setMeshType(infillMeshType)
+        }
+        else
+        {
+            setMeshType(cuttingMeshType)
+        }
+    }
+
+    function setMeshType(type)
+    {
+        UM.ActiveTool.setProperty("MeshType", type)
+    }
+
+    UM.I18nCatalog { id: catalog; name: "uranium"}
+
     Column
     {
         id: items
@@ -28,123 +74,97 @@ Item {
 
         spacing: UM.Theme.getSize("default_margin").height
 
-        Row
+        Row // Mesh type buttons
         {
+            id: meshTypeButtons
             spacing: UM.Theme.getSize("default_margin").width
 
-            Label
+            Button
             {
-                text: catalog.i18nc("@label","Mesh Type")
-                font: UM.Theme.getFont("default")
-                color: UM.Theme.getColor("text")
-                height: UM.Theme.getSize("setting").height
-                verticalAlignment: Text.AlignVCenter
+                id: normalButton
+                text: catalog.i18nc("@label", "Normal model")
+                iconSource: UM.Theme.getIcon("pos_normal");
+                property bool needBorder: true
+                checkable: true
+                onClicked: setMeshType(normalMeshType);
+                style: UM.Theme.styles.tool_button;
+                z: 4
             }
 
-            UM.SettingPropertyProvider
+            Button
             {
-                id: meshTypePropertyProvider
-                containerStack: Cura.MachineManager.activeMachine
-                watchedProperties: [ "enabled" ]
+                id: supportMeshButton
+                text: catalog.i18nc("@label", "Print as support")
+                iconSource: UM.Theme.getIcon("pos_print_as_support");
+                property bool needBorder: true
+                checkable:true
+                onClicked: setMeshType(supportMeshType)
+                style: UM.Theme.styles.tool_button;
+                z: 3
             }
 
-            ComboBox
+            Button
             {
-                id: meshTypeSelection
-                style: UM.Theme.styles.combobox
-                onActivated: {
-                    UM.ActiveTool.setProperty("MeshType", model.get(index).type)
-                }
-                model: ListModel
-                {
-                    id: meshTypeModel
-                    Component.onCompleted: meshTypeSelection.populateModel()
-                }
-
-                function populateModel()
-                {
-                    meshTypeModel.append({
-                        type:  "",
-                        text: catalog.i18nc("@label", "Normal model")
-                    });
-                    meshTypePropertyProvider.key = "support_mesh";
-                    if(meshTypePropertyProvider.properties.enabled == "True")
-                    {
-                        meshTypeModel.append({
-                            type:  "support_mesh",
-                            text: catalog.i18nc("@label", "Print as support")
-                        });
-                    }
-                    meshTypePropertyProvider.key = "anti_overhang_mesh";
-                    if(meshTypePropertyProvider.properties.enabled == "True")
-                    {
-                        meshTypeModel.append({
-                            type:  "anti_overhang_mesh",
-                            text: catalog.i18nc("@label", "Don't support overlap with other models")
-                        });
-                    }
-                    meshTypePropertyProvider.key = "cutting_mesh";
-                    if(meshTypePropertyProvider.properties.enabled == "True")
-                    {
-                        meshTypeModel.append({
-                            type:  "cutting_mesh",
-                            text: catalog.i18nc("@label", "Modify settings for overlap with other models")
-                        });
-                    }
-                    meshTypePropertyProvider.key = "infill_mesh";
-                    if(meshTypePropertyProvider.properties.enabled == "True")
-                    {
-                        meshTypeModel.append({
-                            type:  "infill_mesh",
-                            text: catalog.i18nc("@label", "Modify settings for infill of other models")
-                        });
-                    }
-
-                    meshTypeSelection.updateCurrentIndex();
-                }
-
-                function updateCurrentIndex()
-                {
-                    var mesh_type = UM.ActiveTool.properties.getValue("MeshType");
-                    meshTypeSelection.currentIndex = -1;
-                    for(var index=0; index < meshTypeSelection.model.count; index++)
-                    {
-                        if(meshTypeSelection.model.get(index).type == mesh_type)
-                        {
-                            meshTypeSelection.currentIndex = index;
-                            return;
-                        }
-                    }
-                    meshTypeSelection.currentIndex = 0;
-                }
+                id: overhangMeshButton
+                text: catalog.i18nc("@label", "Modify settings for overlaps")
+                iconSource: UM.Theme.getIcon("pos_modify_overlaps");
+                property bool needBorder: true
+                checkable:true
+                onClicked: setMeshType(infillMeshType)
+                style: UM.Theme.styles.tool_button;
+                z: 2
             }
 
-            Connections
+            Button
             {
-                target: Cura.MachineManager
-                onGlobalContainerChanged:
-                {
-                    meshTypeSelection.model.clear();
-                    meshTypeSelection.populateModel();
-                }
+                id: antiOverhangMeshButton
+                text:  catalog.i18nc("@label", "Don't support overlaps")
+                iconSource: UM.Theme.getIcon("pos_modify_dont_support_overlap");
+                property bool needBorder: true
+                checkable: true
+                onClicked: setMeshType(antiOverhangMeshType)
+                style: UM.Theme.styles.tool_button;
+                z: 1
             }
 
-            Connections
+        }
+
+         Label
+        {
+            id: meshTypeLabel
+            font: UM.Theme.getFont("default")
+            color: UM.Theme.getColor("text")
+            height: UM.Theme.getSize("setting").height
+            verticalAlignment: Text.AlignVCenter
+        }
+
+        CheckBox
+        {
+            id: infillOnlyCheckbox
+
+            text: catalog.i18nc("@action:checkbox", "Infill only");
+
+            style: UM.Theme.styles.checkbox;
+
+            visible: currentMeshType === infillMeshType || currentMeshType === cuttingMeshType
+            onClicked: setOverhangsMeshType()
+
+            Binding
             {
-                target: UM.Selection
-                onSelectionChanged: meshTypeSelection.updateCurrentIndex()
+                target: infillOnlyCheckbox
+                property: "checked"
+                value: currentMeshType === infillMeshType
             }
-
         }
 
-        Column
+        Column // Settings Dialog
         {
             // This is to ensure that the panel is first increasing in size up to 200 and then shows a scrollbar.
             // It kinda looks ugly otherwise (big panel, no content on it)
             id: currentSettings
             property int maximumHeight: 200 * screenScaleFactor
             height: Math.min(contents.count * (UM.Theme.getSize("section").height + UM.Theme.getSize("default_lining").height), maximumHeight)
-            visible: meshTypeSelection.model.get(meshTypeSelection.currentIndex).type != "anti_overhang_mesh"
+            visible: currentMeshType != "anti_overhang_mesh"
 
             ScrollView
             {
@@ -159,26 +179,26 @@ Item {
 
                     model: UM.SettingDefinitionsModel
                     {
-                        id: addedSettingsModel;
+                        id: addedSettingsModel
                         containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
                         expanded: [ "*" ]
                         filter:
                         {
                             if (printSequencePropertyProvider.properties.value == "one_at_a_time")
                             {
-                                return {"settable_per_meshgroup": true};
+                                return {"settable_per_meshgroup": true}
                             }
-                            return {"settable_per_mesh": true};
+                            return {"settable_per_mesh": true}
                         }
                         exclude:
                         {
-                            var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ];
+                            var excluded_settings = [ "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]
 
-                            if(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
+                            if (currentMeshType == "support_mesh")
                             {
-                                excluded_settings = excluded_settings.concat(base.all_categories_except_support);
+                                excluded_settings = excluded_settings.concat(base.allCategoriesExceptSupport)
                             }
-                            return excluded_settings;
+                            return excluded_settings
                         }
 
                         visibilityHandler: Cura.PerObjectSettingVisibilityHandler
@@ -188,8 +208,9 @@ Item {
 
                         // For some reason the model object is updated after removing him from the memory and
                         // it happens only on Windows. For this reason, set the destroyed value manually.
-                        Component.onDestruction: {
-                            setDestroyed(true);
+                        Component.onDestruction:
+                        {
+                            setDestroyed(true)
                         }
                     }
 
@@ -213,7 +234,8 @@ Item {
                             //causing nasty issues when selecting different options. So disable asynchronous loading of enum type completely.
                             asynchronous: model.type != "enum" && model.type != "extruder"
 
-                            onLoaded: {
+                            onLoaded:
+                            {
                                 settingLoader.item.showRevertButton = false
                                 settingLoader.item.showInheritButton = false
                                 settingLoader.item.showLinkedSettingIcon = false
@@ -299,7 +321,7 @@ Item {
                             target: inheritStackProvider
                             onPropertiesChanged:
                             {
-                                provider.forcePropertiesChanged();
+                                provider.forcePropertiesChanged()
                             }
                         }
 
@@ -312,22 +334,22 @@ Item {
                                 // so here we connect to the signal and update the those values.
                                 if (typeof UM.ActiveTool.properties.getValue("SelectedObjectId") !== "undefined")
                                 {
-                                    const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId");
+                                    const selectedObjectId = UM.ActiveTool.properties.getValue("SelectedObjectId")
                                     if (addedSettingsModel.visibilityHandler.selectedObjectId != selectedObjectId)
                                     {
-                                        addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId;
+                                        addedSettingsModel.visibilityHandler.selectedObjectId = selectedObjectId
                                     }
                                 }
                                 if (typeof UM.ActiveTool.properties.getValue("ContainerID") !== "undefined")
                                 {
-                                    const containerId = UM.ActiveTool.properties.getValue("ContainerID");
+                                    const containerId = UM.ActiveTool.properties.getValue("ContainerID")
                                     if (provider.containerStackId != containerId)
                                     {
-                                        provider.containerStackId = containerId;
+                                        provider.containerStackId = containerId
                                     }
                                     if (inheritStackProvider.containerStackId != containerId)
                                     {
-                                        inheritStackProvider.containerStackId = containerId;
+                                        inheritStackProvider.containerStackId = containerId
                                     }
                                 }
                             }
@@ -337,7 +359,7 @@ Item {
             }
         }
 
-        Button
+        Cura.SecondaryButton
         {
             id: customiseSettingsButton;
             height: UM.Theme.getSize("setting_control").height;
@@ -345,33 +367,12 @@ Item {
 
             text: catalog.i18nc("@action:button", "Select settings");
 
-            style: ButtonStyle
-            {
-                background: Rectangle
-                {
-                    width: control.width;
-                    height: control.height;
-                    border.width: UM.Theme.getSize("default_lining").width;
-                    border.color: control.pressed ? UM.Theme.getColor("action_button_active_border") :
-                                  control.hovered ? UM.Theme.getColor("action_button_hovered_border") : UM.Theme.getColor("action_button_border")
-                    color: control.pressed ? UM.Theme.getColor("action_button_active") :
-                           control.hovered ? UM.Theme.getColor("action_button_hovered") : UM.Theme.getColor("action_button")
-                }
-                label: Label
-                {
-                    text: control.text;
-                    color: UM.Theme.getColor("setting_control_text");
-                    font: UM.Theme.getFont("default")
-                    anchors.centerIn: parent
-                }
-            }
-
             onClicked:
             {
                 settingPickDialog.visible = true;
-                if (meshTypeSelection.model.get(meshTypeSelection.currentIndex).type == "support_mesh")
+                if (currentMeshType == "support_mesh")
                 {
-                    settingPickDialog.additional_excluded_settings = base.all_categories_except_support;
+                    settingPickDialog.additional_excluded_settings = base.allCategoriesExceptSupport;
                 }
                 else
                 {
@@ -379,138 +380,12 @@ Item {
                 }
             }
         }
-    }
 
+    }
 
-    UM.Dialog {
+    SettingPickDialog
+    {
         id: settingPickDialog
-
-        title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
-        width: screenScaleFactor * 360
-
-        property var additional_excluded_settings
-
-        onVisibilityChanged:
-        {
-            // force updating the model to sync it with addedSettingsModel
-            if(visible)
-            {
-                // Set skip setting, it will prevent from resetting selected mesh_type
-                contents.model.visibilityHandler.addSkipResetSetting(meshTypeSelection.model.get(meshTypeSelection.currentIndex).type)
-                listview.model.forceUpdate()
-
-                updateFilter()
-            }
-        }
-
-        function updateFilter()
-        {
-            var new_filter = {};
-            new_filter["settable_per_mesh"] = true;
-            // Don't filter on "settable_per_meshgroup" any more when `printSequencePropertyProvider.properties.value`
-            //   is set to "one_at_a_time", because the current backend architecture isn't ready for that.
-
-            if(filterInput.text != "")
-            {
-                new_filter["i18n_label"] = "*" + filterInput.text;
-            }
-
-            listview.model.filter = new_filter;
-        }
-
-        TextField {
-            id: filterInput
-
-            anchors {
-                top: parent.top
-                left: parent.left
-                right: toggleShowAll.left
-                rightMargin: UM.Theme.getSize("default_margin").width
-            }
-
-            placeholderText: catalog.i18nc("@label:textbox", "Filter...");
-
-            onTextChanged: settingPickDialog.updateFilter()
-        }
-
-        CheckBox
-        {
-            id: toggleShowAll
-
-            anchors {
-                top: parent.top
-                right: parent.right
-            }
-
-            text: catalog.i18nc("@label:checkbox", "Show all")
-            checked: listview.model.showAll
-            onClicked:
-            {
-                listview.model.showAll = checked;
-            }
-        }
-
-        ScrollView
-        {
-            id: scrollView
-
-            anchors
-            {
-                top: filterInput.bottom;
-                left: parent.left;
-                right: parent.right;
-                bottom: parent.bottom;
-            }
-            ListView
-            {
-                id:listview
-                model: UM.SettingDefinitionsModel
-                {
-                    id: definitionsModel;
-                    containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
-                    visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
-                    expanded: [ "*" ]
-                    exclude:
-                    {
-                        var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ];
-                        excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings);
-                        return excluded_settings;
-                    }
-                }
-                delegate:Loader
-                {
-                    id: loader
-
-                    width: parent.width
-                    height: model.type != undefined ? UM.Theme.getSize("section").height : 0;
-
-                    property var definition: model
-                    property var settingDefinitionsModel: definitionsModel
-
-                    asynchronous: true
-                    source:
-                    {
-                        switch(model.type)
-                        {
-                            case "category":
-                                return "PerObjectCategory.qml"
-                            default:
-                                return "PerObjectItem.qml"
-                        }
-                    }
-                }
-                Component.onCompleted: settingPickDialog.updateFilter()
-            }
-        }
-
-        rightButtons: [
-            Button {
-                text: catalog.i18nc("@action:button", "Close");
-                onClicked: {
-                    settingPickDialog.visible = false;
-                }
-            }
-        ]
     }
 
     UM.SettingPropertyProvider
@@ -533,25 +408,25 @@ Item {
         storeIndex: 0
     }
 
-    SystemPalette { id: palette; }
+    SystemPalette { id: palette }
 
     Component
     {
-        id: settingTextField;
+        id: settingTextField
 
         Cura.SettingTextField { }
     }
 
     Component
     {
-        id: settingComboBox;
+        id: settingComboBox
 
         Cura.SettingComboBox { }
     }
 
     Component
     {
-        id: settingExtruder;
+        id: settingExtruder
 
         Cura.SettingExtruder { }
     }
@@ -565,22 +440,23 @@ Item {
 
     Component
     {
-        id: settingCheckBox;
+        id: settingCheckBox
 
         Cura.SettingCheckBox { }
     }
 
     Component
     {
-        id: settingCategory;
+        id: settingCategory
 
         Cura.SettingCategory { }
     }
 
     Component
     {
-        id: settingUnknown;
+        id: settingUnknown
 
         Cura.SettingUnknown { }
     }
+
 }

+ 14 - 12
plugins/PerObjectSettingsTool/PerObjectSettingsTool.py

@@ -1,6 +1,6 @@
 # Copyright (c) 2016 Ultimaker B.V.
 # Uranium is released under the terms of the LGPLv3 or higher.
-
+from UM.Logger import Logger
 from UM.Tool import Tool
 from UM.Scene.Selection import Selection
 from UM.Scene.Iterator.DepthFirstIterator import DepthFirstIterator
@@ -20,15 +20,11 @@ class PerObjectSettingsTool(Tool):
 
         self.setExposedProperties("SelectedObjectId", "ContainerID", "SelectedActiveExtruder", "MeshType")
 
-        self._advanced_mode = False
         self._multi_extrusion = False
         self._single_model_selected = False
 
         Selection.selectionChanged.connect(self.propertyChanged)
 
-        Application.getInstance().getPreferences().preferenceChanged.connect(self._onPreferenceChanged)
-        self._onPreferenceChanged("cura/active_mode")
-
         Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerChanged)
         self._onGlobalContainerChanged()
         Selection.selectionChanged.connect(self._updateEnabled)
@@ -70,8 +66,16 @@ class PerObjectSettingsTool(Tool):
             selected_object.addDecorator(SettingOverrideDecorator())
         selected_object.callDecoration("setActiveExtruder", extruder_stack_id)
 
-    def setMeshType(self, mesh_type):
+    ## Returns True when the mesh_type was changed, False when current mesh_type == mesh_type
+    def setMeshType(self, mesh_type: str) -> bool:
+        if self.getMeshType() == mesh_type:
+            return False
+
         selected_object = Selection.getSelectedObject(0)
+        if selected_object is None:
+            Logger.log("w", "Tried setting the mesh type of the selected object, but no object was selected")
+            return False
+
         stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway.
         if not stack:
             selected_object.addDecorator(SettingOverrideDecorator())
@@ -90,6 +94,9 @@ class PerObjectSettingsTool(Tool):
                     new_instance.resetState()  # Ensure that the state is not seen as a user state.
                     settings.addInstance(new_instance)
 
+        self.propertyChanged.emit()
+        return True
+
     def getMeshType(self):
         selected_object = Selection.getSelectedObject(0)
         stack = selected_object.callDecoration("getStack") #Don't try to get the active extruder since it may be None anyway.
@@ -103,11 +110,6 @@ class PerObjectSettingsTool(Tool):
 
         return ""
 
-    def _onPreferenceChanged(self, preference):
-        if preference == "cura/active_mode":
-            self._advanced_mode = Application.getInstance().getPreferences().getValue(preference) == 1
-            self._updateEnabled()
-
     def _onGlobalContainerChanged(self):
         global_container_stack = Application.getInstance().getGlobalContainerStack()
         if global_container_stack:
@@ -140,4 +142,4 @@ class PerObjectSettingsTool(Tool):
             self._single_model_selected = False # Group is selected, so tool needs to be disabled
         else:
             self._single_model_selected = True
-        Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._advanced_mode and self._single_model_selected)
+        Application.getInstance().getController().toolEnabledChanged.emit(self._plugin_id, self._single_model_selected)

+ 139 - 0
plugins/PerObjectSettingsTool/SettingPickDialog.qml

@@ -0,0 +1,139 @@
+import QtQuick 2.2
+import QtQuick.Controls 1.2
+import QtQuick.Controls.Styles 1.2
+
+import UM 1.2 as UM
+import Cura 1.0 as Cura
+import ".."
+
+UM.Dialog
+    {
+        id: settingPickDialog
+
+        title: catalog.i18nc("@title:window", "Select Settings to Customize for this model")
+        width: screenScaleFactor * 360
+
+        property var additional_excluded_settings
+
+        onVisibilityChanged:
+        {
+            // force updating the model to sync it with addedSettingsModel
+            if (visible)
+            {
+                // Set skip setting, it will prevent from resetting selected mesh_type
+                contents.model.visibilityHandler.addSkipResetSetting(currentMeshType)
+                listview.model.forceUpdate()
+
+                updateFilter()
+            }
+        }
+
+        function updateFilter()
+        {
+            var new_filter = {}
+            new_filter["settable_per_mesh"] = true
+            // Don't filter on "settable_per_meshgroup" any more when `printSequencePropertyProvider.properties.value`
+            //   is set to "one_at_a_time", because the current backend architecture isn't ready for that.
+
+            if (filterInput.text != "")
+            {
+                new_filter["i18n_label"] = "*" + filterInput.text
+            }
+
+            listview.model.filter = new_filter
+        }
+
+        TextField {
+            id: filterInput
+
+            anchors {
+                top: parent.top
+                left: parent.left
+                right: toggleShowAll.left
+                rightMargin: UM.Theme.getSize("default_margin").width
+            }
+
+            placeholderText: catalog.i18nc("@label:textbox", "Filter...")
+
+            onTextChanged: settingPickDialog.updateFilter()
+        }
+
+        CheckBox
+        {
+            id: toggleShowAll
+
+            anchors {
+                top: parent.top
+                right: parent.right
+            }
+
+            text: catalog.i18nc("@label:checkbox", "Show all")
+            checked: listview.model.showAll
+            onClicked:
+            {
+                listview.model.showAll = checked
+            }
+        }
+
+        ScrollView
+        {
+            id: scrollView
+
+            anchors
+            {
+                top: filterInput.bottom
+                left: parent.left
+                right: parent.right
+                bottom: parent.bottom
+            }
+            ListView
+            {
+                id:listview
+                model: UM.SettingDefinitionsModel
+                {
+                    id: definitionsModel
+                    containerId: Cura.MachineManager.activeMachine != null ? Cura.MachineManager.activeMachine.definition.id: ""
+                    visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
+                    expanded: [ "*" ]
+                    exclude:
+                    {
+                        var excluded_settings = [ "machine_settings", "command_line_settings", "support_mesh", "anti_overhang_mesh", "cutting_mesh", "infill_mesh" ]
+                        excluded_settings = excluded_settings.concat(settingPickDialog.additional_excluded_settings)
+                        return excluded_settings
+                    }
+                }
+                delegate:Loader
+                {
+                    id: loader
+
+                    width: parent.width
+                    height: model.type != undefined ? UM.Theme.getSize("section").height : 0
+
+                    property var definition: model
+                    property var settingDefinitionsModel: definitionsModel
+
+                    asynchronous: true
+                    source:
+                    {
+                        switch(model.type)
+                        {
+                            case "category":
+                                return "PerObjectCategory.qml"
+                            default:
+                                return "PerObjectItem.qml"
+                        }
+                    }
+                }
+                Component.onCompleted: settingPickDialog.updateFilter()
+            }
+        }
+
+        rightButtons: [
+            Button {
+                text: catalog.i18nc("@action:button", "Close")
+                onClicked: {
+                    settingPickDialog.visible = false
+                }
+            }
+        ]
+    }

+ 22 - 3
plugins/PerObjectSettingsTool/tool_icon.svg

@@ -1,3 +1,22 @@
-<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 30 30">
-    <path d="M30 20L25.1 6.7 27.6 0H12.9l1.6 5H6.4l2.3 6H2.4l2.4 6.2L0 30h19.5l-1.7-4H26l-2.3-6H30zm-12.5 5l-2.8-7.5 2.4-6.5H9.6L7.7 6h14.7L20 12.4l2.9 7.6 2 5h-7.4z"/>
-</svg>
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="30px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>per_model_settings</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <path d="M9.73076923,0 L9.226,1.345 L0.449,11 L0,11 L0.639,9.084 L8.896,0 L9.73076923,0 Z M8.49,3.472 L8.907,4.721 L3.199,11 L1.647,11 L8.49,3.472 Z M9.228,5.685 L9.645,6.935 L5.949,11 L4.397,11 L9.228,5.685 Z M9.966,7.899 L10.382,9.148 L8.699,11 L7.147,11 L9.966,7.899 Z M10.704,10.112 L11,11 L9.896,11 L10.704,10.112 Z M7.698,0 L1.332,7.004 L2.23,4.308 L6.146,0 L7.698,0 Z M4.948,0 L2.344,2.866 L1.89,1.656 L3.396,0 L4.948,0 Z M2.198,0 L1.54,0.724 L1.26923077,0 L2.198,0 Z" id="path-1"></path>
+    </defs>
+    <g id="per_model_settings" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Per-model" transform="translate(2.000000, 2.000000)">
+            <polygon id="Path-Copy-5" fill="#000" points="1.26923077 0 9.73076923 0 8.46153846 3.38461538 11 11 0 11 2.53846154 3.38461538"></polygon>
+            <polygon id="Path-Copy-8" fill="#000" points="14.2692308 13 22.7307692 13 21.4615385 16.3846154 24 24 13 24 15.5384615 16.3846154"></polygon>
+            <g id="stripe" transform="translate(13.000000, 0.000000)">
+                <mask id="mask-2" fill="white">
+                    <use xlink:href="#path-1"></use>
+                </mask>
+                <use id="Combined-Shape" fill="#000" xlink:href="#path-1"></use>
+            </g>
+            <path d="M1.990731,13.5 L3.06878027,16.374798 L0.693712943,23.5 L10.3062871,23.5 L7.93121973,16.374798 L9.009269,13.5 L1.990731,13.5 Z" id="Path-Copy-7" stroke="#000"></path>
+        </g>
+    </g>
+</svg>

+ 11 - 8
plugins/SupportEraser/tool_icon.svg

@@ -1,11 +1,14 @@
-<svg width="30px" height="30px" viewBox="0 0 30 30" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
-    <!-- Generator: Sketch 48.2 (47327) - http://www.bohemiancoding.com/sketch -->
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="30px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>support_blocker</title>
     <desc>Created with Sketch.</desc>
-    <defs></defs>
-    <g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
-        <g id="Cura-Icon" fill="#000000">
-            <path d="M19,27 L12,27 L3,27 L3,3 L12,3 L12,11 L19,11 L19,19 L27,19 L27,27 L19,27 Z M4,4 L4,26 L11,26 L11,4 L4,4 Z" id="Combined-Shape"></path>
-            <polygon id="Path" points="10 17.1441441 9.18918919 17.954955 7.52252252 16.3333333 5.85585586 18 5.04504505 17.1891892 6.66666667 15.4774775 5 13.8558559 5.81081081 13.045045 7.52252252 14.6666667 9.18918919 13 10 13.8108108 8.33333333 15.4774775"></polygon>
+    <g id="support_blocker" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Group-3" transform="translate(3.000000, 2.000000)">
+            <g id="Print-as-support-Copy" fill="#000">
+                <path d="M0.833,19.65 L0.833,22.342 L0,22.3428571 L0.833,19.65 Z M4.166,8.879 L4.166,22.342 L2.499,22.342 L2.499,14.266 L4.166,8.879 Z M7.5,0.8 L7.5,22.342 L5.833,22.342 L5.833,0.8 L7.5,0.8 Z M10.833,0.8 L10.833,22.342 L9.166,22.342 L9.166,0.8 L10.833,0.8 Z M14.166,0.8 L14.166,14 L12.499,14 L12.499,0.8 L14.166,0.8 Z M15.833,8.879 L17.418,14 L15.833,14 L15.833,8.879 Z M4.166,0.8 L4.166,6.139 L2.499,1.351 L2.499,0.8 L4.166,0.8 Z M17.5,0.8 L17.5,1.351 L15.833,6.139 L15.833,0.8 L17.5,0.8 Z" id="Combined-Shape"></path>
+            </g>
+            <path d="M12,14 L22,14 L22,24 L12,24 L12,14 Z" id="Rectangle" stroke="#000" stroke-dasharray="1,1"></path>
         </g>
     </g>
-</svg>
+</svg>

+ 26 - 0
resources/themes/cura-light/icons/pos_modify_dont_support_overlap.svg

@@ -0,0 +1,26 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="30px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>pms_modify_dont_support_overlap</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <circle id="path-1" cx="21.5" cy="6.5" r="6.5"></circle>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="13" height="13" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+    </defs>
+    <g id="pms_modify_dont_support_overlap" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Group-4" transform="translate(0.000000, 2.000000)">
+            <polygon id="4" fill="#000" transform="translate(11.000000, 12.000000) scale(1, -1) translate(-11.000000, -12.000000) " points="2 3.34399175e-13 20 3.34399175e-13 13 17.5384615 22 24 0 24 9 17.5384615"></polygon>
+            <rect id="Rectangle" fill="#000" x="1" y="0" width="1" height="24"></rect>
+            <rect id="Rectangle-Copy-9" fill="#000" x="3" y="0" width="1" height="24"></rect>
+            <rect id="Rectangle-Copy-10" fill="#000" x="5" y="0" width="1" height="24"></rect>
+            <rect id="Rectangle-Copy-11" fill="#000" x="7" y="0" width="1" height="24"></rect>
+            <rect id="Rectangle-Copy-24" fill="#000" x="14" y="0" width="1" height="24"></rect>
+            <rect id="Rectangle-Copy-25" fill="#000" x="16" y="10" width="1" height="14"></rect>
+            <rect id="Rectangle-Copy-27" fill="#000" x="18" y="12" width="1" height="12"></rect>
+            <rect id="Rectangle-Copy-28" fill="#000" x="20" y="12" width="1" height="12"></rect>
+            <use id="Oval" stroke="#000" mask="url(#mask-2)" stroke-width="2" stroke-dasharray="2,2" xlink:href="#path-1"></use>
+        </g>
+    </g>
+</svg>

+ 17 - 0
resources/themes/cura-light/icons/pos_modify_overlaps.svg

@@ -0,0 +1,17 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="28px" height="28px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>pms_modify_overlaps</title>
+    <desc>Created with Sketch.</desc>
+    <defs>
+        <polygon id="path-1" points="1 25 6 9 4 2 18 2 25 2 22 8.27272727 28 25 21 25"></polygon>
+        <mask id="mask-2" maskContentUnits="userSpaceOnUse" maskUnits="objectBoundingBox" x="0" y="0" width="27" height="23" fill="white">
+            <use xlink:href="#path-1"></use>
+        </mask>
+    </defs>
+    <g id="pms_modify_overlaps" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <path d="M10.1109336,2 L12.6179373,9.07692308 L7.60392993,25 L-4.79616347e-14,25 L4.84615385,9.07692308 L2.42307692,2 L10.1109336,2 Z" id="Combined-Shape" fill="#000"></path>
+        <path d="M17.717,14.213 L18.026,15.23 L9.635,25 L8.453,25 L17.717,14.213 Z M18.427,16.547 L18.737,17.565 L12.351,25 L11.169,25 L18.427,16.547 Z M19.138,18.882 L19.447,19.899 L15.067,25 L13.885,25 L19.138,18.882 Z M19.849,21.218 L20.158,22.234 L17.783,25 L16.601,25 L19.849,21.218 Z M20.559,23.553 L20.869,24.569 L20.499,25 L19.317,25 L20.559,23.553 Z M17.006,11.878 L17.315,12.894 L8,23.743 L8.684,21.57 L17.006,11.878 Z M16.295,9.544 L16.605,10.559 L9.572,18.749 L10.256,16.577 L16.295,9.544 Z M17.594,4.867 L16.81,7.157 L11.144,13.756 L11.828,11.583 L17.594,4.867 Z M18.522,2 L12.567,8.935 L12.222,7.961 L17.341,2 L18.522,2 Z M15.806,2 L11.774,6.696 L11.429,5.722 L14.625,2 L15.806,2 Z M13.091,2 L10.981,4.458 L10.635,3.483 L11.909,2 L13.091,2 Z M10.375,2 L10.188,2.219 L10.1109336,2 L10.375,2 Z" id="Combined-Shape" fill="#000"></path>
+        <use id="Path-4" stroke="#000" mask="url(#mask-2)" stroke-width="2" stroke-dasharray="2,2" xlink:href="#path-1"></use>
+    </g>
+</svg>

+ 9 - 0
resources/themes/cura-light/icons/pos_normal.svg

@@ -0,0 +1,9 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="30px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>pms_Normal</title>
+    <desc>Created with Sketch.</desc>
+    <g id="pms_Normal" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <polygon id="Path" fill="#000" points="6.30769231 3 21.6923077 3 19.3846154 9.76923077 24 25 4 25 8.61538462 9.76923077"></polygon>
+    </g>
+</svg>

+ 14 - 0
resources/themes/cura-light/icons/pos_print_as_support.svg

@@ -0,0 +1,14 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="30px" height="30px" viewBox="0 0 28 28" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 57.1 (83088) - https://sketch.com -->
+    <title>pms_printassupport</title>
+    <desc>Created with Sketch.</desc>
+    <g id="pms_printassupport" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
+        <g id="Print-as-support" transform="translate(4.000000, 3.000000)">
+            <g id="Group">
+                <path d="M0.833,19.251 L0.833333333,22 L-7.59392549e-14,22 L0.833,19.251 Z M4.166,8.251 L4.16666667,22 L2.5,22 L2.5,13.749 L4.166,8.251 Z M7.5,0 L7.5,22 L5.83333333,22 L5.83333333,0 L7.5,0 Z M10.8333333,0 L10.8333333,22 L9.16666667,22 L9.16666667,0 L10.8333333,0 Z M15.833,8.251 L17.5,13.751 L17.5,22 L15.8333333,22 L15.833,8.251 Z M14.1666667,0 L14.1666667,22 L12.5,22 L12.5,0 L14.1666667,0 Z M19.166,19.248 L20,22 L19.1666667,22 L19.166,19.248 Z M17.5,0 L17.5,0.563 L15.833,5.452 L15.8333333,0 L17.5,0 Z M4.16666667,0 L4.166,5.452 L2.5,0.566 L2.5,0 L4.16666667,0 Z" id="Combined-Shape" fill="#000"></path>
+                <g transform="translate(0.833333, 0.000000)"></g>
+            </g>
+        </g>
+    </g>
+</svg>

+ 1 - 1
resources/themes/cura-light/styles.qml

@@ -240,7 +240,7 @@ QtObject
                     }
                     Behavior on color { ColorAnimation { duration: 50; } }
 
-                    border.width: (control.hasOwnProperty("needBorder") && control.needBorder) ? (control.checked ? Theme.getSize("thick_lining").width : Theme.getSize("default_lining").width) : 0
+                    border.width: (control.hasOwnProperty("needBorder") && control.needBorder) ? Theme.getSize("default_lining").width : 0
                     border.color: control.checked ? Theme.getColor("icon") : Theme.getColor("lining")
                 }
             }