QualitySettingsModel.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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. #
  8. # This model is used to show details settings of the selected quality in the quality management page.
  9. #
  10. class QualitySettingsModel(ListModel):
  11. KeyRole = Qt.UserRole + 1
  12. LabelRole = Qt.UserRole + 2
  13. UnitRole = Qt.UserRole + 3
  14. ProfileValueRole = Qt.UserRole + 4
  15. ProfileValueSourceRole = Qt.UserRole + 5
  16. UserValueRole = Qt.UserRole + 6
  17. CategoryRole = Qt.UserRole + 7
  18. def __init__(self, parent = None):
  19. super().__init__(parent = parent)
  20. self.addRoleName(self.KeyRole, "key")
  21. self.addRoleName(self.LabelRole, "label")
  22. self.addRoleName(self.UnitRole, "unit")
  23. self.addRoleName(self.ProfileValueRole, "profile_value")
  24. self.addRoleName(self.ProfileValueSourceRole, "profile_value_source")
  25. self.addRoleName(self.UserValueRole, "user_value")
  26. self.addRoleName(self.CategoryRole, "category")
  27. self._container_registry = ContainerRegistry.getInstance()
  28. self._application = Application.getInstance()
  29. self._quality_manager = self._application._quality_manager
  30. self._extruder_position = ""
  31. self._selected_quality_item = None # The selected quality in the quality management page
  32. self._i18n_catalog = None
  33. self._quality_manager.qualitiesUpdated.connect(self._update)
  34. self._update()
  35. extruderPositionChanged = pyqtSignal()
  36. selectedQualityItemChanged = pyqtSignal()
  37. def setExtruderPosition(self, extruder_position):
  38. if extruder_position != self._extruder_position:
  39. self._extruder_position = extruder_position
  40. self.extruderPositionChanged.emit()
  41. self._update()
  42. @pyqtProperty(str, fset = setExtruderPosition, notify = extruderPositionChanged)
  43. def extruderPosition(self):
  44. return self._extruder_position
  45. def setSelectedQualityItem(self, selected_quality_item):
  46. if selected_quality_item != self._selected_quality_item:
  47. self._selected_quality_item = selected_quality_item
  48. self.selectedQualityItemChanged.emit()
  49. self._update()
  50. @pyqtProperty("QVariantMap", fset = setSelectedQualityItem, notify = selectedQualityItemChanged)
  51. def selectedQualityItem(self):
  52. return self._selected_quality_item
  53. def _update(self):
  54. if self._selected_quality_item is None:
  55. self.setItems([])
  56. return
  57. items = []
  58. global_container_stack = Application.getInstance().getGlobalContainerStack()
  59. definition_container = global_container_stack.definition
  60. quality_group = self._selected_quality_item["quality_group"]
  61. quality_changes_group = self._selected_quality_item["quality_changes_group"]
  62. if self._extruder_position == "":
  63. quality_node = quality_group.node_for_global
  64. else:
  65. quality_node = quality_group.nodes_for_extruders.get(self._extruder_position)
  66. settings_keys = quality_group.getAllKeys()
  67. quality_containers = [quality_node.getContainer()]
  68. if quality_changes_group is not None:
  69. if self._extruder_position == "":
  70. quality_changes_node = quality_changes_group.node_for_global
  71. else:
  72. quality_changes_node = quality_changes_group.nodes_for_extruders.get(self._extruder_position)
  73. if quality_changes_node is not None: # it can be None if number of extruders are changed during runtime
  74. try:
  75. quality_containers.insert(0, quality_changes_node.getContainer())
  76. except:
  77. # FIXME: This is to prevent incomplete update of QualityManager
  78. return
  79. settings_keys.update(quality_changes_group.getAllKeys())
  80. current_category = ""
  81. for definition in definition_container.findDefinitions():
  82. if definition.type == "category":
  83. current_category = definition.label
  84. if self._i18n_catalog:
  85. current_category = self._i18n_catalog.i18nc(definition.key + " label", definition.label)
  86. continue
  87. profile_value = None
  88. profile_value_source = ""
  89. for quality_container in quality_containers:
  90. new_value = quality_container.getProperty(definition.key, "value")
  91. if new_value is not None:
  92. profile_value_source = quality_container.getMetaDataEntry("type")
  93. profile_value = new_value
  94. # Global tab should use resolve (if there is one)
  95. if self._extruder_position == "":
  96. resolve_value = global_container_stack.getProperty(definition.key, "resolve")
  97. if resolve_value is not None and definition.key in settings_keys:
  98. profile_value = resolve_value
  99. if profile_value is not None:
  100. break
  101. if not self._extruder_position:
  102. user_value = global_container_stack.userChanges.getProperty(definition.key, "value")
  103. else:
  104. extruder_stack = global_container_stack.extruders[self._extruder_position]
  105. user_value = extruder_stack.userChanges.getProperty(definition.key, "value")
  106. if profile_value is None and user_value is None:
  107. continue
  108. label = definition.label
  109. if self._i18n_catalog:
  110. label = self._i18n_catalog.i18nc(definition.key + " label", label)
  111. items.append({
  112. "key": definition.key,
  113. "label": label,
  114. "unit": definition.unit,
  115. "profile_value": "" if profile_value is None else str(profile_value), # it is for display only
  116. "profile_value_source": profile_value_source,
  117. "user_value": "" if user_value is None else str(user_value),
  118. "category": current_category
  119. })
  120. self.setItems(items)