diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py index 381d45b1c2..57bff4f0de 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py +++ b/plugins/PerObjectSettingsTool/PerObjectSettingVisibilityHandler.py @@ -3,36 +3,44 @@ from UM.Application import Application from UM.Settings.SettingInstance import SettingInstance from UM.Logger import Logger +import UM.Settings.Models + from cura.SettingOverrideDecorator import SettingOverrideDecorator ## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container # are returned as visible. -class PerObjectSettingVisibilityHandler(QObject): +class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler): def __init__(self, parent = None, *args, **kwargs): super().__init__(parent = parent, *args, **kwargs) - self._selected_object_id = None - visibilityChanged = pyqtSignal() + self._selected_object_id = None + self._node = None + self._stack = None def setSelectedObjectId(self, id): - self._selected_object_id = id - self.visibilityChanged.emit() + if id != self._selected_object_id: + self._selected_object_id = id + + self._node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) + if self._node: + self._stack = self._node.callDecoration("getStack") + + self.visibilityChanged.emit() @pyqtProperty("quint64", fset = setSelectedObjectId) def selectedObjectId(self): - pass + return self._selected_object_id def setVisible(self, visible): - node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) - if not node: + if not self._node: return - stack = node.callDecoration("getStack") - if not stack: - node.addDecorator(SettingOverrideDecorator()) - stack = node.callDecoration("getStack") - settings = stack.getTop() - all_instances = settings.findInstances(**{}) + if not self._stack: + self._node.addDecorator(SettingOverrideDecorator()) + self._stack = self._node.callDecoration("getStack") + + settings = self._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 @@ -41,13 +49,12 @@ class PerObjectSettingVisibilityHandler(QObject): settings.removeInstance(instance.definition.key) visibility_changed = True - # Add all instances that are not added, but are in visiblity list + # Add all instances that are not added, but are in visibility 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)) + definition = self._stack.getSettingDefinition(item) + if definition: + settings.addInstance(SettingInstance(definition, 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) @@ -57,20 +64,16 @@ class PerObjectSettingVisibilityHandler(QObject): def getVisible(self): visible_settings = set() - node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) - if not node: + if not self._node: return visible_settings - stack = node.callDecoration("getStack") - if not stack: + if not self._stack: return visible_settings - settings = stack.getTop() + settings = self._stack.getTop() if not settings: return visible_settings - all_instances = settings.findInstances(**{}) - for instance in all_instances: - visible_settings.add(instance.definition.key) + visible_settings = set(map(lambda i: i.definition.key, settings.findInstances())) return visible_settings diff --git a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml index b237d60716..546b7086e6 100644 --- a/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml +++ b/plugins/PerObjectSettingsTool/PerObjectSettingsPanel.qml @@ -153,6 +153,8 @@ Item { { id: addedSettingsModel; containerId: Cura.MachineManager.activeDefinitionId + expanded: [ "*" ] + visibilityHandler: Cura.PerObjectSettingVisibilityHandler { selectedObjectId: UM.ActiveTool.properties.getValue("SelectedObjectId") @@ -215,9 +217,8 @@ Item { style: ButtonStyle { - background: Rectangle + background: Item { - color: control.hovered ? control.parent.style.controlHighlightColor : control.parent.style.controlColor; UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter @@ -340,6 +341,8 @@ Item { "settable_per_mesh": true } visibilityHandler: UM.SettingPreferenceVisibilityHandler {} + expanded: [ "*" ] + exclude: [ "machine_settings" ] } delegate:Loader { diff --git a/plugins/SliceInfoPlugin/SliceInfo.py b/plugins/SliceInfoPlugin/SliceInfo.py index a9cfe2d83a..50b6275bf0 100644 --- a/plugins/SliceInfoPlugin/SliceInfo.py +++ b/plugins/SliceInfoPlugin/SliceInfo.py @@ -92,7 +92,12 @@ class SliceInfo(Extension): } for container in global_container_stack.getContainers(): container_id = container.getId() - container_serialized = container.serialize() + try: + container_serialized = container.serialize() + except NotImplementedError: + Logger.log("w", "Container %s could not be serialized!", container_id) + continue + if container_serialized: submitted_data["settings_%s" %(container_id)] = container_serialized # This can be anything, eg. INI, JSON, etc. else: diff --git a/resources/qml/Preferences/MachinesPage.qml b/resources/qml/Preferences/MachinesPage.qml index 5d96361306..e214034659 100644 --- a/resources/qml/Preferences/MachinesPage.qml +++ b/resources/qml/Preferences/MachinesPage.qml @@ -36,13 +36,27 @@ UM.ManagementPage renameEnabled: base.currentItem != null activateEnabled: base.currentItem != null && base.currentItem.id != Cura.MachineManager.activeMachineId - Flow + Item { - anchors.fill: parent; - spacing: UM.Theme.getSize("default_margin").height; + visible: base.currentItem != null + anchors.fill: parent + + Label + { + id: machineName + text: base.currentItem && base.currentItem.name ? base.currentItem.name : "" + font: UM.Theme.getFont("large") + width: parent.width + elide: Text.ElideRight + } Row { + id: machineActions + anchors.left: parent.left + anchors.top: machineName.bottom + anchors.topMargin: UM.Theme.getSize("default_margin").height + Repeater { id: machineActionRepeater @@ -72,16 +86,18 @@ UM.ManagementPage } } - Label + Row { - text: base.currentItem && base.currentItem.name ? base.currentItem.name : "" - font: UM.Theme.getFont("large") - width: parent.width - elide: Text.ElideRight - } + anchors.top: machineActions.visible ? machineActions.bottom : machineActions.anchors.top + anchors.topMargin: UM.Theme.getSize("default_margin").height + anchors.left: parent.left + anchors.right: parent.right - Label { text: catalog.i18nc("@label", "Type"); width: parent.width * 0.2; } - Label { text: base.currentItem && base.currentItem.typeName ? base.currentItem.typeName : ""; width: parent.width * 0.7; } + spacing: UM.Theme.getSize("default_margin").height + + Label { text: catalog.i18nc("@label", "Type") } + Label { text: base.currentItem ? base.currentItem.metadata.definition_name : "" } + } UM.I18nCatalog { id: catalog; name: "uranium"; } diff --git a/resources/qml/Settings/SettingItem.qml b/resources/qml/Settings/SettingItem.qml index e98c06329d..1e69704995 100644 --- a/resources/qml/Settings/SettingItem.qml +++ b/resources/qml/Settings/SettingItem.qml @@ -34,34 +34,34 @@ Item { property string tooltipText: { - var affects = settingDefinitionsModel.getRequiredBy(definition.key, "value") - var affected_by = settingDefinitionsModel.getRequires(definition.key, "value") + var affects = settingDefinitionsModel.getRequiredBy(definition.key, "value") + var affected_by = settingDefinitionsModel.getRequires(definition.key, "value") - var affected_by_list = "" - for(var i in affected_by) - { - affected_by_list += "
%2
".arg(definition.label).arg(definition.description) + var tooltip = "%1\n%2
".arg(definition.label).arg(definition.description) - if(affects_list != "") - { - tooltip += "