Browse Source

Rework Per Object Settings selection mechanism

fieldOfView 9 years ago
parent
commit
2ebeb72fac

+ 92 - 183
plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml

@@ -10,245 +10,154 @@ import UM 1.1 as UM
 
 Item {
     id: base;
+    property int currentIndex: UM.ActiveTool.properties.SelectedIndex;
 
-    width: 0;
-    height: 0;
+    width: childrenRect.width;
+    height: childrenRect.height;
 
-    property variant position: mapToItem(null, 0, 0)
+    Column {
+        id: items
+        anchors.top: parent.top;
+        anchors.left: parent.left;
 
-    property real viewportWidth: UM.Application.mainWindow.width * UM.Application.mainWindow.viewportRect.width;
-    property real viewportHeight: UM.Application.mainWindow.height * UM.Application.mainWindow.viewportRect.height;
+        spacing: UM.Theme.sizes.default_lining.height;
 
-    property int currentIndex;
+        UM.SettingItem {
+            id: profileSelection
 
-    Rectangle {
-        id: settingsPanel;
+            width: UM.Theme.sizes.setting.width;
+            height: UM.Theme.sizes.setting.height;
 
-        z: 3;
+            name: catalog.i18nc("@label", "Profile")
+            type: "enum"
+            indent: false
 
-        width: UM.Theme.sizes.per_object_settings_panel.width;
-        height: items.height + UM.Theme.sizes.default_margin.height * 2;
+            style: UM.Theme.styles.setting_item;
 
-        opacity: 0;
-        Behavior on opacity { NumberAnimation { } }
+            options: UM.ProfilesModel { addUseGlobal: true }
 
-        border.width: UM.Theme.sizes.per_object_settings_panel_border.width;
-        border.color: UM.Theme.colors.per_object_settings_panel_border;
+            value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile
 
-        color: UM.Theme.colors.per_object_settings_panel_background;
-
-        DropArea {
-            anchors.fill: parent;
-        }
-
-        Button {
-            id: closeButton;
-            width: UM.Theme.sizes.message_close.width;
-            height: UM.Theme.sizes.message_close.height;
-            anchors {
-                right: parent.right;
-                rightMargin: UM.Theme.sizes.default_margin.width / 2;
-                top: parent.top;
-                topMargin: UM.Theme.sizes.default_margin.width / 2;
-            }
-            UM.RecolorImage {
-                anchors.fill: parent;
-                sourceSize.width: width
-                sourceSize.height: width
-                color: UM.Theme.colors.message_dismiss
-                source: UM.Theme.icons.cross2;
+            onItemValueChanged: {
+                var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex);
+                UM.ActiveTool.properties.Model.setObjectProfile(item.id, value)
             }
+        }
 
-            onClicked: settingsPanel.opacity = 0
-
-            style: ButtonStyle {
-                background: Rectangle {
-                    color: UM.Theme.colors.message_background
-                }
-            }
+        Item
+        {
+            height: UM.Theme.sizes.default_margin.height
+            width: parent.width
         }
 
-        Column {
-            id: items
-            anchors.top: parent.top;
-            anchors.topMargin: UM.Theme.sizes.default_margin.height;
+        Repeater {
+            id: settings;
 
-            spacing: UM.Theme.sizes.default_lining.height;
+            model: UM.ActiveTool.properties.Model.getItem(base.currentIndex).settings
 
             UM.SettingItem {
-                id: profileSelection
-
-                x: UM.Theme.sizes.per_object_settings_panel_border.width + 1
-
                 width: UM.Theme.sizes.setting.width;
                 height: UM.Theme.sizes.setting.height;
 
-                name: catalog.i18nc("@label", "Profile")
-                type: "enum"
+                name: model.label;
+                type: model.type;
+                value: model.value;
+                description: model.description;
+                unit: model.unit;
+                valid: model.valid;
+                options: model.options
+                indent: false
 
                 style: UM.Theme.styles.setting_item;
 
-                options: UM.ProfilesModel { addUseGlobal: true }
-
-                value: UM.ActiveTool.properties.Model.getItem(base.currentIndex).profile
-
                 onItemValueChanged: {
-                    var item = UM.ActiveTool.properties.Model.getItem(base.currentIndex);
-                    UM.ActiveTool.properties.Model.setObjectProfile(item.id, value)
+                    settings.model.setSettingValue(model.key, value)
                 }
-            }
-
-            Repeater {
-                id: settings;
 
-                model: UM.ActiveTool.properties.Model.getItem(base.currentIndex).settings
+                Button
+                {
+                    anchors.left: parent.left;
+                    anchors.leftMargin: UM.Theme.sizes.default_margin.width;
 
-                UM.SettingItem {
-                    width: UM.Theme.sizes.setting.width;
+                    width: UM.Theme.sizes.setting.height;
                     height: UM.Theme.sizes.setting.height;
-                    x: UM.Theme.sizes.per_object_settings_panel_border.width + 1
-
-                    name: model.label;
-                    type: model.type;
-                    value: model.value;
-                    description: model.description;
-                    unit: model.unit;
-                    valid: model.valid;
-                    options: model.options
 
-                    style: UM.Theme.styles.setting_item;
+                    opacity: parent.hovered || hovered ? 1 : 0;
+                    onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key)
 
-                    onItemValueChanged: {
-                        settings.model.setSettingValue(model.key, value)
-                    }
-
-                    Button
+                    style: ButtonStyle
                     {
-                        anchors.left: parent.horizontalCenter;
-                        anchors.leftMargin: UM.Theme.sizes.default_margin.width;
-
-                        width: UM.Theme.sizes.setting.height;
-                        height: UM.Theme.sizes.setting.height;
-
-                        opacity: parent.hovered || hovered ? 1 : 0;
-                        onClicked: UM.ActiveTool.properties.Model.removeSettingOverride(UM.ActiveTool.properties.Model.getItem(base.currentIndex).id, model.key)
-
-                        style: ButtonStyle
+                        background: Rectangle
                         {
-                            background: Rectangle
+                            color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
+                            UM.RecolorImage
                             {
-                                color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor;
-                                UM.RecolorImage
-                                {
-                                    anchors.verticalCenter: parent.verticalCenter
-                                    anchors.horizontalCenter: parent.horizontalCenter
-                                    width: parent.width/2
-                                    height: parent.height/2
-                                    sourceSize.width: width
-                                    sourceSize.height: width
-                                    color: UM.Theme.colors.setting_control_revert
-                                    source: UM.Theme.icons.cross1
-                                }
+                                anchors.verticalCenter: parent.verticalCenter
+                                anchors.horizontalCenter: parent.horizontalCenter
+                                width: parent.width/2
+                                height: parent.height/2
+                                sourceSize.width: width
+                                sourceSize.height: width
+                                color: UM.Theme.colors.setting_control_revert
+                                source: UM.Theme.icons.cross1
                             }
                         }
                     }
                 }
             }
-
-            Item
-            {
-                height: UM.Theme.sizes.default_margin.height / 2
-                width: parent.width
-            }
-
-            Button
-            {
-                id: customise_settings_button;
-                anchors.right: profileSelection.right;
-                visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
-
-                text: catalog.i18nc("@action:button", "Customize Settings");
-
-                style: ButtonStyle
-                {
-                    background: Rectangle
-                    {
-                        width: control.width;
-                        height: control.height;
-                        color: control.hovered ? UM.Theme.colors.load_save_button_hover : UM.Theme.colors.load_save_button;
-                    }
-                    label: Label
-                    {
-                        text: control.text;
-                        color: UM.Theme.colors.load_save_button_text;
-                    }
-                }
-
-                onClicked: settingPickDialog.visible = true;
-
-                Connections
-                {
-                    target: UM.Preferences;
-
-                    onPreferenceChanged:
-                    {
-                        customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
-                    }
-                }
-            }
         }
 
-        UM.I18nCatalog { id: catalog; name: "uranium"; }
-    }
-
-    Repeater {
-        model: UM.ActiveTool.properties.Model;
-        delegate: Button {
-            x: ((model.x + 1.0) / 2.0) * base.viewportWidth - base.position.x - width / 2
-            y: -((model.y + 1.0) / 2.0) * base.viewportHeight + (base.viewportHeight - base.position.y) + height / 2
+        Item
+        {
+            height: UM.Theme.sizes.default_margin.height
+            width: parent.width
+        }
 
-            width: UM.Theme.sizes.per_object_settings_button.width
-            height: UM.Theme.sizes.per_object_settings_button.height
+        Button
+        {
+            id: customise_settings_button;
+            anchors.right: profileSelection.right;
+            height: UM.Theme.sizes.setting.height;
+            visible: parseInt(UM.Preferences.getValue("cura/active_mode")) == 1
 
-            tooltip: catalog.i18nc("@info:tooltip", "Customise settings for this object");
+            text: catalog.i18nc("@action:button", "Add Setting");
 
-            checkable: true;
-            onClicked: {
-                if(settingsPanel.opacity < 0.5) //Per-object panel is not currently displayed.
+            style: ButtonStyle
+            {
+                background: Rectangle
                 {
-                    base.currentIndex = index;
-
-                    settingsPanel.anchors.left = right;
-                    settingsPanel.anchors.top = top;
-
-                    settingsPanel.opacity = 1;
+                    width: control.width;
+                    height: control.height;
+                    border.width: UM.Theme.sizes.default_lining.width;
+                    border.color: control.pressed ? UM.Theme.colors.action_button_active_border :
+                                  control.hovered ? UM.Theme.colors.action_button_hovered_border : UM.Theme.colors.action_button_border
+                    color: control.pressed ? UM.Theme.colors.action_button_active :
+                           control.hovered ? UM.Theme.colors.action_button_hovered : UM.Theme.colors.action_button
                 }
-                else //Per-object panel is already displayed. Deactivate it (same behaviour as the close button).
+                label: Label
                 {
-                    settingsPanel.opacity = 0;
+                    text: control.text;
+                    color: UM.Theme.colors.setting_control_text;
+                    anchors.centerIn: parent
                 }
             }
 
-            style: ButtonStyle
+            onClicked: settingPickDialog.visible = true;
+
+            Connections
             {
-                background: Rectangle
-                {
-                    width: control.width;
-                    height: control.height;
+                target: UM.Preferences;
 
-                    color: control.hovered ? UM.Theme.colors.button_active : UM.Theme.colors.button_hover;
-                }
-                label: Image {
-                    width: control.width;
-                    height: control.height;
-                    sourceSize.width: width;
-                    sourceSize.height: height;
-                    source: UM.Theme.icons.plus;
+                onPreferenceChanged:
+                {
+                    customise_settings_button.visible = parseInt(UM.Preferences.getValue("cura/active_mode"))
                 }
             }
         }
     }
 
+    UM.I18nCatalog { id: catalog; name: "uranium"; }
+
     UM.Dialog {
         id: settingPickDialog
 

+ 7 - 1
plugins/PerObjectSettingsTool/PerObjectSettingsTool.py

@@ -2,6 +2,7 @@
 # Uranium is released under the terms of the AGPLv3 or higher.
 
 from UM.Tool import Tool
+from UM.Scene.Selection import Selection
 
 from . import PerObjectSettingsModel
 
@@ -9,10 +10,15 @@ class PerObjectSettingsTool(Tool):
     def __init__(self):
         super().__init__()
 
-        self.setExposedProperties("Model")
+        self.setExposedProperties("Model", "SelectedIndex")
 
     def event(self, event):
         return False
 
     def getModel(self):
         return PerObjectSettingsModel.PerObjectSettingsModel()
+
+    def getSelectedIndex(self):
+        selected_object_id = id(Selection.getSelectedObject(0));
+        index = self.getModel().find("id", selected_object_id)
+        return index