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 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._container = None 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 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