ContainerSettingsModel.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. from UM.Application import Application
  2. from UM.Qt.ListModel import ListModel
  3. from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl
  4. from UM.Settings.ContainerRegistry import ContainerRegistry
  5. from UM.Settings.InstanceContainer import InstanceContainer
  6. class ContainerSettingsModel(ListModel):
  7. LabelRole = Qt.UserRole + 1
  8. CategoryRole = Qt.UserRole + 2
  9. UnitRole = Qt.UserRole + 3
  10. ValuesRole = Qt.UserRole + 4
  11. def __init__(self, parent = None):
  12. super().__init__(parent)
  13. self.addRoleName(self.LabelRole, "label")
  14. self.addRoleName(self.CategoryRole, "category")
  15. self.addRoleName(self.UnitRole, "unit")
  16. self.addRoleName(self.ValuesRole, "values")
  17. self._container_ids = []
  18. self._containers = []
  19. def _onPropertyChanged(self, key, property_name):
  20. if property_name == "value":
  21. self._update()
  22. def _update(self):
  23. self.clear()
  24. if len(self._container_ids) == 0:
  25. return
  26. keys = []
  27. for container in self._containers:
  28. keys = keys + list(container.getAllKeys())
  29. keys = list(set(keys)) # remove duplicate keys
  30. keys.sort()
  31. for key in keys:
  32. definition = None
  33. category = None
  34. values = []
  35. for container in self._containers:
  36. instance = container.getInstance(key)
  37. if instance:
  38. definition = instance.definition
  39. # Traverse up to find the category
  40. category = definition
  41. while category.type != "category":
  42. category = category.parent
  43. values.append(container.getProperty(key, "value"))
  44. else:
  45. values.append("")
  46. self.appendItem({
  47. "key": key,
  48. "values": values,
  49. "label": definition.label,
  50. "unit": definition.unit,
  51. "category": category.label
  52. })
  53. ## Set the ids of the containers which have the settings this model should list.
  54. # Also makes sure the model updates when the containers have property changes
  55. def setContainers(self, container_ids):
  56. for container in self._containers:
  57. container.propertyChanged.disconnect(self._onPropertyChanged)
  58. self._container_ids = container_ids
  59. self._containers = []
  60. for container_id in self._container_ids:
  61. containers = ContainerRegistry.getInstance().findContainers(id = container_id)
  62. if containers:
  63. containers[0].propertyChanged.connect(self._onPropertyChanged)
  64. self._containers.append(containers[0])
  65. self._update()
  66. containersChanged = pyqtSignal()
  67. @pyqtProperty("QVariantList", fset = setContainers, notify = containersChanged)
  68. def containers(self):
  69. return self.container_ids