QualitySettingsModel.py 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144
  1. # Copyright (c) 2018 Ultimaker B.V.
  2. # Cura is released under the terms of the LGPLv3 or higher.
  3. from PyQt5.QtCore import pyqtProperty, pyqtSignal, Qt
  4. from UM.Application import Application
  5. from UM.Qt.ListModel import ListModel
  6. from UM.Settings.ContainerRegistry import ContainerRegistry
  7. class QualitySettingsModel(ListModel):
  8. KeyRole = Qt.UserRole + 1
  9. LabelRole = Qt.UserRole + 2
  10. UnitRole = Qt.UserRole + 3
  11. ProfileValueRole = Qt.UserRole + 4
  12. ProfileValueSourceRole = Qt.UserRole + 5
  13. UserValueRole = Qt.UserRole + 6
  14. CategoryRole = Qt.UserRole + 7
  15. def __init__(self, parent = None):
  16. super().__init__(parent = parent)
  17. self.addRoleName(self.KeyRole, "key")
  18. self.addRoleName(self.LabelRole, "label")
  19. self.addRoleName(self.UnitRole, "unit")
  20. self.addRoleName(self.ProfileValueRole, "profile_value")
  21. self.addRoleName(self.ProfileValueSourceRole, "profile_value_source")
  22. self.addRoleName(self.UserValueRole, "user_value")
  23. self.addRoleName(self.CategoryRole, "category")
  24. self._container_registry = ContainerRegistry.getInstance()
  25. self._application = Application.getInstance()
  26. self._quality_manager = self._application._quality_manager
  27. self._extruder_position = ""
  28. self._quality_item = None
  29. self._i18n_catalog = None
  30. self._quality_manager.qualitiesUpdated.connect(self._update)
  31. self._update()
  32. extruderPositionChanged = pyqtSignal()
  33. qualityItemChanged = pyqtSignal()
  34. def setExtruderPosition(self, extruder_position):
  35. if extruder_position != self._extruder_position:
  36. self._extruder_position = extruder_position
  37. self.extruderPositionChanged.emit()
  38. self._update()
  39. @pyqtProperty(str, fset = setExtruderPosition, notify = extruderPositionChanged)
  40. def extruderPosition(self):
  41. return self._extruder_position
  42. def setQualityItem(self, quality_item):
  43. if quality_item != self._quality_item:
  44. self._quality_item = quality_item
  45. self.qualityItemChanged.emit()
  46. self._update()
  47. @pyqtProperty("QVariantMap", fset = setQualityItem, notify = qualityItemChanged)
  48. def qualityItem(self):
  49. return self._quality_item
  50. def _update(self):
  51. if self._quality_item is None:
  52. self.setItems([])
  53. return
  54. items = []
  55. global_container_stack = Application.getInstance().getGlobalContainerStack()
  56. definition_container = global_container_stack.definition
  57. quality_group = self._quality_item["quality_group"]
  58. quality_changes_group = self._quality_item["quality_changes_group"]
  59. if self._extruder_position == "":
  60. quality_node = quality_group.node_for_global
  61. else:
  62. quality_node = quality_group.nodes_for_extruders.get(self._extruder_position)
  63. settings_keys = quality_group.getAllKeys()
  64. quality_containers = [quality_node.getContainer()]
  65. if quality_changes_group is not None:
  66. if self._extruder_position == "":
  67. quality_changes_node = quality_changes_group.node_for_global
  68. else:
  69. quality_changes_node = quality_changes_group.nodes_for_extruders.get(self._extruder_position)
  70. if quality_changes_node is not None: # it can be None if number of extruders are changed during runtime
  71. quality_containers.insert(0, quality_changes_node.getContainer())
  72. settings_keys.update(quality_changes_group.getAllKeys())
  73. current_category = ""
  74. for definition in definition_container.findDefinitions():
  75. if definition.type == "category":
  76. current_category = definition.label
  77. if self._i18n_catalog:
  78. current_category = self._i18n_catalog.i18nc(definition.key + " label", definition.label)
  79. continue
  80. profile_value = None
  81. profile_value_source = ""
  82. for quality_container in quality_containers:
  83. new_value = quality_container.getProperty(definition.key, "value")
  84. if new_value is not None:
  85. profile_value_source = quality_container.getMetaDataEntry("type")
  86. profile_value = new_value
  87. # Global tab should use resolve (if there is one)
  88. if self._extruder_position == "":
  89. resolve_value = global_container_stack.getProperty(definition.key, "resolve")
  90. if resolve_value is not None and definition.key in settings_keys:
  91. profile_value = resolve_value
  92. if profile_value is not None:
  93. break
  94. if not self._extruder_position:
  95. user_value = global_container_stack.userChanges.getProperty(definition.key, "value")
  96. else:
  97. extruder_stack = global_container_stack.extruders[self._extruder_position]
  98. user_value = extruder_stack.userChanges.getProperty(definition.key, "value")
  99. if profile_value is None and user_value is None:
  100. continue
  101. label = definition.label
  102. if self._i18n_catalog:
  103. label = self._i18n_catalog.i18nc(definition.key + " label", label)
  104. items.append({
  105. "key": definition.key,
  106. "label": label,
  107. "unit": definition.unit,
  108. "profile_value": "" if profile_value is None else str(profile_value), # it is for display only
  109. "profile_value_source": profile_value_source,
  110. "user_value": "" if user_value is None else str(user_value),
  111. "category": current_category
  112. })
  113. self.setItems(items)