Browse Source

Initial changes for perobject stuff

CURA-1278
Jaime van Kessel 8 years ago
parent
commit
c914446060

+ 2 - 2
cura/SettingOverrideDecorator.py

@@ -14,8 +14,8 @@ from UM.Application import Application
 class SettingOverrideDecorator(SceneNodeDecorator):
 class SettingOverrideDecorator(SceneNodeDecorator):
     def __init__(self):
     def __init__(self):
         super().__init__()
         super().__init__()
-        self._stack = ContainerStack(id = "SettingOverrideStack")
-        self._instance = InstanceContainer(id = "SettingOverrideInstanceContainer")
+        self._stack = ContainerStack(stack_id = "SettingOverrideStack")
+        self._instance = InstanceContainer(container_id = "SettingOverrideInstanceContainer")
         self._stack.addContainer(self._instance)
         self._stack.addContainer(self._instance)
 
 
         Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)
         Application.getInstance().globalContainerStackChanged.connect(self._onGlobalContainerStackChanged)

+ 2 - 2
plugins/PerObjectSettingsTool/PerObjectItem.qml

@@ -16,13 +16,13 @@ UM.TooltipArea
     width: childrenRect.width;
     width: childrenRect.width;
     height: childrenRect.height;
     height: childrenRect.height;
 
 
-    Button
+    CheckBox
     {
     {
         id: check
         id: check
 
 
         text: definition.label
         text: definition.label
 
 
-        //onClicked: delegateItem.settingsModel.setSettingVisible(model.key, checked);
+        onClicked: addedSettingsModel.setVisible(model.key, checked);
     }
     }
 }
 }
 
 

+ 76 - 0
plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py

@@ -0,0 +1,76 @@
+from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
+from UM.Application import Application
+from UM.Settings.SettingInstance import SettingInstance
+from UM.Logger import Logger
+
+from cura.SettingOverrideDecorator import SettingOverrideDecorator
+
+
+class PerObjectSettingVisibilityHandler(QObject):
+    def __init__(self, parent = None, *args, **kwargs):
+        super().__init__(parent = parent, *args, **kwargs)
+        self._selected_object_id = None
+
+    visibilityChanged = pyqtSignal()
+
+    def setSelectedObjectId(self, id):
+        self._selected_object_id = id
+        self.visibilityChanged.emit()
+
+    @pyqtProperty("quint64", fset = setSelectedObjectId)
+    def selectedObjectId(self):
+        pass
+
+    def setVisible(self, visible):
+        node = Application.getInstance().getController().getScene().findObject(self._selected_object_id)
+        if not node:
+            return
+        stack = node.callDecoration("getStack")
+        if not stack:
+            node.addDecorator(SettingOverrideDecorator())
+            stack = node.callDecoration("getStack")
+
+        settings = stack.getTop()
+        all_instances = settings.findInstances(**{})
+        visibility_changed = False  # Flag to check if at the end the signal needs to be emitted
+
+        # Remove all instances that are not in visibility list
+        for instance in all_instances:
+            if instance.definition.key not in visible:
+                settings.removeInstance(instance.definition.key)
+                visibility_changed = True
+
+        # Add all instances that are not added, but are in visiblity list
+        for item in visible:
+            if not settings.getInstance(item):
+                definition_container = Application.getInstance().getGlobalContainerStack().getBottom()
+                definitions = definition_container.findDefinitions(key = item)
+                if definitions:
+                    settings.addInstance(SettingInstance(definitions[0], settings))
+                    visibility_changed = True
+                else:
+                    Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item)
+
+        if visibility_changed:
+            self.visibilityChanged.emit()
+        #settings.addInstance(SettingInstance())
+
+    def getVisible(self):
+        visible_settings = set()
+        node = Application.getInstance().getController().getScene().findObject(self._selected_object_id)
+        if not node:
+            return visible_settings
+
+        stack = node.callDecoration("getStack")
+        if not stack:
+            return visible_settings
+
+        settings = stack.getTop()
+        if not settings:
+            return visible_settings
+
+        all_instances = settings.findInstances(**{})
+        for instance in all_instances:
+            visible_settings.add(instance.definition.key)
+        return visible_settings
+

+ 12 - 23
plugins/PerObjectSettingsTool/PerObjectSettingsModel.py

@@ -13,21 +13,14 @@ from UM.Scene.SceneNode import SceneNode
 from . import SettingOverrideModel
 from . import SettingOverrideModel
 
 
 class PerObjectSettingsModel(ListModel):
 class PerObjectSettingsModel(ListModel):
-    IdRole = Qt.UserRole + 1
-    XRole = Qt.UserRole + 2
-    YRole = Qt.UserRole + 3
-    MaterialRole = Qt.UserRole + 4
-    ProfileRole = Qt.UserRole + 5
-    SettingsRole = Qt.UserRole + 6
+    IdRole = Qt.UserRole + 1  # ID of the node
 
 
     def __init__(self, parent = None):
     def __init__(self, parent = None):
         super().__init__(parent)
         super().__init__(parent)
         self._scene = Application.getInstance().getController().getScene()
         self._scene = Application.getInstance().getController().getScene()
         self._root = self._scene.getRoot()
         self._root = self._scene.getRoot()
         self.addRoleName(self.IdRole,"id")
         self.addRoleName(self.IdRole,"id")
-        self.addRoleName(self.MaterialRole, "material")
-        self.addRoleName(self.ProfileRole, "profile")
-        self.addRoleName(self.SettingsRole, "settings")
+
         self._updateModel()
         self._updateModel()
 
 
     @pyqtSlot("quint64", str)
     @pyqtSlot("quint64", str)
@@ -48,7 +41,7 @@ class PerObjectSettingsModel(ListModel):
                 node.removeDecorator(ProfileOverrideDecorator)'''
                 node.removeDecorator(ProfileOverrideDecorator)'''
 
 
     @pyqtSlot("quint64", str)
     @pyqtSlot("quint64", str)
-    def addSettingOverride(self, object_id, key):
+    def addOverride(self, object_id, key):
         machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
         machine = Application.getInstance().getMachineManager().getActiveMachineInstance()
         if not machine:
         if not machine:
             return
             return
@@ -60,7 +53,7 @@ class PerObjectSettingsModel(ListModel):
         node.callDecoration("addSetting", key)
         node.callDecoration("addSetting", key)
 
 
     @pyqtSlot("quint64", str)
     @pyqtSlot("quint64", str)
-    def removeSettingOverride(self, object_id, key):
+    def removerOverride(self, object_id, key):
         node = self._scene.findObject(object_id)
         node = self._scene.findObject(object_id)
         node.callDecoration("removeSetting", key)
         node.callDecoration("removeSetting", key)
 
 
@@ -69,18 +62,14 @@ class PerObjectSettingsModel(ListModel):
 
 
     def _updateModel(self):
     def _updateModel(self):
         self.clear()
         self.clear()
+
         for node in BreadthFirstIterator(self._root):
         for node in BreadthFirstIterator(self._root):
             if type(node) is not SceneNode or not node.isSelectable():
             if type(node) is not SceneNode or not node.isSelectable():
                 continue
                 continue
-            node_profile = node.callDecoration("getProfile")
-            if not node_profile:
-                node_profile = "global"
-            else:
-                node_profile = node_profile.getName()
-
-            self.appendItem({
-                "id": id(node),
-                "material": "",
-                "profile": node_profile,
-                "settings": SettingOverrideModel.SettingOverrideModel(node)
-            })
+
+            node_stack = node.callDecoration("getStack")
+
+            if not node_stack:
+                self.appendItem({
+                    "id": id(node)
+                })

+ 22 - 56
plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml

@@ -20,73 +20,38 @@ Item {
     width: childrenRect.width;
     width: childrenRect.width;
     height: childrenRect.height;
     height: childrenRect.height;
 
 
-    Column {
+    Column
+    {
         id: items
         id: items
         anchors.top: parent.top;
         anchors.top: parent.top;
         anchors.left: parent.left;
         anchors.left: parent.left;
 
 
         spacing: UM.Theme.getSize("default_margin").height;
         spacing: UM.Theme.getSize("default_margin").height;
-
-        Column {
-            id: customisedSettings
+        height: childrenRect.height;
+        ListView
+        {
+            id: contents
             spacing: UM.Theme.getSize("default_lining").height;
             spacing: UM.Theme.getSize("default_lining").height;
-            width: UM.Theme.getSize("setting").width + UM.Theme.getSize("setting").height/2;
-
-            Repeater {
-                id: settings;
-
-                model: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).settings
-
-                UM.SettingItem {
-                    width: UM.Theme.getSize("setting").width;
-                    height: UM.Theme.getSize("setting").height;
-
-                    name: model.label;
-                    type: model.type;
-                    value: model.value;
-                    description: model.description;
-                    unit: model.unit;
-                    valid: model.valid;
-                    visible: !model.global_only
-                    options: model.options
-                    indent: false
-
-                    style: UM.Theme.styles.setting_item;
-
-                    onItemValueChanged: {
-                        settings.model.setSettingValue(model.key, value)
-                    }
+            height: childrenRect.height;
 
 
-                    Button
-                    {
-                        anchors.left: parent.right;
+            model: UM.SettingDefinitionsModel {
+                id: addedSettingsModel;
+                containerId: Cura.MachineManager.activeDefinitionId
+                visibilityHandler: Cura.PerObjectSettingVisibilityHandler {
+                selectedObjectId: UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id
+                }
+            }
 
 
-                        width: UM.Theme.getSize("setting").height;
-                        height: UM.Theme.getSize("setting").height;
+            delegate:Button
+            {
+                anchors.left: parent.right;
 
 
-                        onClicked: UM.ActiveTool.properties.getValue("Model").removeSettingOverride(UM.ActiveTool.properties.getValue("Model").getItem(base.currentIndex).id, model.key)
+                width: 150
+                height:50
 
 
-                        style: ButtonStyle
-                        {
-                            background: Rectangle
-                            {
-                                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: control.hovered ? UM.Theme.getColor("setting_control_button_hover") : UM.Theme.getColor("setting_control_button")
-                                    source: UM.Theme.getIcon("cross1")
-                                }
-                            }
-                        }
-                    }
-                }
+                text: model.label
             }
             }
+
         }
         }
 
 
         Button
         Button
@@ -184,6 +149,7 @@ Item {
                     {
                     {
                         "global_only": false
                         "global_only": false
                     }
                     }
+                    visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
                 }
                 }
                 delegate:Loader
                 delegate:Loader
                 {
                 {

+ 4 - 0
plugins/PerObjectSettingsTool/__init__.py

@@ -2,6 +2,8 @@
 # Uranium is released under the terms of the AGPLv3 or higher.
 # Uranium is released under the terms of the AGPLv3 or higher.
 
 
 from . import PerObjectSettingsTool
 from . import PerObjectSettingsTool
+from . import PerObjectSettingVisibilityHandler
+from PyQt5.QtQml import qmlRegisterType
 
 
 from UM.i18n import i18nCatalog
 from UM.i18n import i18nCatalog
 i18n_catalog = i18nCatalog("cura")
 i18n_catalog = i18nCatalog("cura")
@@ -25,4 +27,6 @@ def getMetaData():
     }
     }
 
 
 def register(app):
 def register(app):
+    qmlRegisterType(PerObjectSettingVisibilityHandler.PerObjectSettingVisibilityHandler, "Cura", 1, 0,
+                    "PerObjectSettingVisibilityHandler")
     return { "tool": PerObjectSettingsTool.PerObjectSettingsTool() }
     return { "tool": PerObjectSettingsTool.PerObjectSettingsTool() }