Make PerObjectSettingVisiblityHandler inherit SettingVisiblityHandler and some other cleanup

This commit is contained in:
Arjen Hiemstra 2016-06-23 13:33:51 +02:00
parent 8c8caa2cac
commit 38ce6cd4b8

View file

@ -3,36 +3,44 @@ from UM.Application import Application
from UM.Settings.SettingInstance import SettingInstance from UM.Settings.SettingInstance import SettingInstance
from UM.Logger import Logger from UM.Logger import Logger
import UM.Settings.Models
from cura.SettingOverrideDecorator import SettingOverrideDecorator from cura.SettingOverrideDecorator import SettingOverrideDecorator
## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container ## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container
# are returned as visible. # are returned as visible.
class PerObjectSettingVisibilityHandler(QObject): class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler):
def __init__(self, parent = None, *args, **kwargs): def __init__(self, parent = None, *args, **kwargs):
super().__init__(parent = parent, *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): def setSelectedObjectId(self, id):
self._selected_object_id = id if id != self._selected_object_id:
self.visibilityChanged.emit() 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) @pyqtProperty("quint64", fset = setSelectedObjectId)
def selectedObjectId(self): def selectedObjectId(self):
pass return self._selected_object_id
def setVisible(self, visible): def setVisible(self, visible):
node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) if not self._node:
if not node:
return return
stack = node.callDecoration("getStack")
if not stack:
node.addDecorator(SettingOverrideDecorator())
stack = node.callDecoration("getStack")
settings = stack.getTop() if not self._stack:
all_instances = settings.findInstances(**{}) 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 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 # Remove all instances that are not in visibility list
@ -41,13 +49,12 @@ class PerObjectSettingVisibilityHandler(QObject):
settings.removeInstance(instance.definition.key) settings.removeInstance(instance.definition.key)
visibility_changed = True 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: for item in visible:
if not settings.getInstance(item): if not settings.getInstance(item):
definition_container = Application.getInstance().getGlobalContainerStack().getBottom() definition = self._stack.getSettingDefinition(item)
definitions = definition_container.findDefinitions(key = item) if definition:
if definitions: settings.addInstance(SettingInstance(definition, settings))
settings.addInstance(SettingInstance(definitions[0], settings))
visibility_changed = True visibility_changed = True
else: else:
Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item) 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): def getVisible(self):
visible_settings = set() visible_settings = set()
node = Application.getInstance().getController().getScene().findObject(self._selected_object_id) if not self._node:
if not node:
return visible_settings return visible_settings
stack = node.callDecoration("getStack") if not self._stack:
if not stack:
return visible_settings return visible_settings
settings = stack.getTop() settings = self._stack.getTop()
if not settings: if not settings:
return visible_settings return visible_settings
all_instances = settings.findInstances(**{}) visible_settings = set(map(lambda i: i.definition.key, settings.findInstances()))
for instance in all_instances:
visible_settings.add(instance.definition.key)
return visible_settings return visible_settings