PerObjectSettingVisibilityHandler.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from PyQt5.QtCore import QObject, pyqtProperty, pyqtSignal
  2. from UM.Application import Application
  3. from UM.Settings.SettingInstance import SettingInstance
  4. from UM.Logger import Logger
  5. import UM.Settings.Models
  6. from cura.Settings.SettingOverrideDecorator import SettingOverrideDecorator
  7. ## The per object setting visibility handler ensures that only setting defintions that have a matching instance Container
  8. # are returned as visible.
  9. class PerObjectSettingVisibilityHandler(UM.Settings.Models.SettingVisibilityHandler):
  10. def __init__(self, parent = None, *args, **kwargs):
  11. super().__init__(parent = parent, *args, **kwargs)
  12. self._selected_object_id = None
  13. self._node = None
  14. self._stack = None
  15. def setSelectedObjectId(self, id):
  16. if id != self._selected_object_id:
  17. self._selected_object_id = id
  18. self._node = Application.getInstance().getController().getScene().findObject(self._selected_object_id)
  19. if self._node:
  20. self._stack = self._node.callDecoration("getStack")
  21. self.visibilityChanged.emit()
  22. @pyqtProperty("quint64", fset = setSelectedObjectId)
  23. def selectedObjectId(self):
  24. return self._selected_object_id
  25. def setVisible(self, visible):
  26. if not self._node:
  27. return
  28. if not self._stack:
  29. self._node.addDecorator(SettingOverrideDecorator())
  30. self._stack = self._node.callDecoration("getStack")
  31. settings = self._stack.getTop()
  32. all_instances = settings.findInstances()
  33. visibility_changed = False # Flag to check if at the end the signal needs to be emitted
  34. # Remove all instances that are not in visibility list
  35. for instance in all_instances:
  36. if instance.definition.key not in visible:
  37. settings.removeInstance(instance.definition.key)
  38. visibility_changed = True
  39. # Add all instances that are not added, but are in visibility list
  40. for item in visible:
  41. if not settings.getInstance(item):
  42. definition = self._stack.getSettingDefinition(item)
  43. if definition:
  44. settings.addInstance(SettingInstance(definition, settings))
  45. visibility_changed = True
  46. else:
  47. Logger.log("w", "Unable to add instance (%s) to perobject visibility because we couldn't find the matching definition", item)
  48. if visibility_changed:
  49. self.visibilityChanged.emit()
  50. def getVisible(self):
  51. visible_settings = set()
  52. if not self._node:
  53. return visible_settings
  54. if not self._stack:
  55. return visible_settings
  56. settings = self._stack.getTop()
  57. if not settings:
  58. return visible_settings
  59. visible_settings = set(map(lambda i: i.definition.key, settings.findInstances()))
  60. return visible_settings