123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293 |
- from UM.Application import Application
- from UM.Qt.ListModel import ListModel
- from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl
- from UM.Settings.ContainerRegistry import ContainerRegistry
- from UM.Settings.InstanceContainer import InstanceContainer
- from UM.Settings.SettingFunction import SettingFunction
- class ContainerSettingsModel(ListModel):
- LabelRole = Qt.UserRole + 1
- CategoryRole = Qt.UserRole + 2
- UnitRole = Qt.UserRole + 3
- ValuesRole = Qt.UserRole + 4
- def __init__(self, parent = None):
- super().__init__(parent)
- self.addRoleName(self.LabelRole, "label")
- self.addRoleName(self.CategoryRole, "category")
- self.addRoleName(self.UnitRole, "unit")
- self.addRoleName(self.ValuesRole, "values")
- self._container_ids = []
- self._containers = []
- def _onPropertyChanged(self, key, property_name):
- if property_name == "value":
- self._update()
- def _update(self):
- self.clear()
- if len(self._container_ids) == 0:
- return
- keys = []
- for container in self._containers:
- keys = keys + list(container.getAllKeys())
- keys = list(set(keys)) # remove duplicate keys
- keys.sort()
- for key in keys:
- definition = None
- category = None
- values = []
- for container in self._containers:
- instance = container.getInstance(key)
- if instance:
- definition = instance.definition
- # Traverse up to find the category
- category = definition
- while category.type != "category":
- category = category.parent
- value = container.getProperty(key, "value")
- if type(value) == SettingFunction:
- values.append("=\u0192")
- else:
- values.append(container.getProperty(key, "value"))
- else:
- values.append("")
- self.appendItem({
- "key": key,
- "values": values,
- "label": definition.label,
- "unit": definition.unit,
- "category": category.label
- })
- ## Set the ids of the containers which have the settings this model should list.
- # Also makes sure the model updates when the containers have property changes
- def setContainers(self, container_ids):
- for container in self._containers:
- container.propertyChanged.disconnect(self._onPropertyChanged)
- self._container_ids = container_ids
- self._containers = []
- for container_id in self._container_ids:
- containers = ContainerRegistry.getInstance().findContainers(id = container_id)
- if containers:
- containers[0].propertyChanged.connect(self._onPropertyChanged)
- self._containers.append(containers[0])
- self._update()
- containersChanged = pyqtSignal()
- @pyqtProperty("QVariantList", fset = setContainers, notify = containersChanged)
- def containers(self):
- return self.container_ids
|