diff --git a/cura/PrinterOutput/ConfigurationModel.py b/cura/PrinterOutput/ConfigurationModel.py index 5102dff239..633986a65c 100644 --- a/cura/PrinterOutput/ConfigurationModel.py +++ b/cura/PrinterOutput/ConfigurationModel.py @@ -2,6 +2,11 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal +from typing import List + +MYPY = False +if MYPY: + from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel class ConfigurationModel(QObject): @@ -11,13 +16,13 @@ class ConfigurationModel(QObject): def __init__(self): super().__init__() self._printer_type = None - self._extruder_configurations = [] + self._extruder_configurations = [] # type: List[ExtruderConfigurationModel] self._buildplate_configuration = None def setPrinterType(self, printer_type): self._printer_type = printer_type - @pyqtProperty(str, fset = setPrinterType, constant = True) + @pyqtProperty(str, fset = setPrinterType, notify = configurationChanged) def printerType(self): return self._printer_type @@ -41,5 +46,5 @@ class ConfigurationModel(QObject): def __hash__(self): extruder_hash = hash(0) for configuration in self.extruderConfigurations: - extruder_hash ^= hash(frozenset(configuration.items())) + extruder_hash ^= configuration.__hash__() return hash(self.printerType) ^ extruder_hash ^ hash(self.buildplateConfiguration) \ No newline at end of file diff --git a/cura/PrinterOutput/ExtruderConfigurationModel.py b/cura/PrinterOutput/ExtruderConfigurationModel.py new file mode 100644 index 0000000000..4871dca3cc --- /dev/null +++ b/cura/PrinterOutput/ExtruderConfigurationModel.py @@ -0,0 +1,42 @@ +# Copyright (c) 2018 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +from PyQt5.QtCore import pyqtProperty, QObject, pyqtSignal + + +class ExtruderConfigurationModel(QObject): + + extruderConfigurationChanged = pyqtSignal() + + def __init__(self): + super().__init__() + self._position = -1 + self._material = None + self._hotend_id = None + + def setPosition(self, position): + self._position = position + + @pyqtProperty(int, fset = setPosition, notify = extruderConfigurationChanged) + def position(self): + return self._position + + def setMaterial(self, material): + self._material = material + + @pyqtProperty(str, fset = setMaterial, notify = extruderConfigurationChanged) + def material(self): + return self._material + + def setHotendID(self, hotend_id): + self._hotend_id = hotend_id + + @pyqtProperty(str, fset = setHotendID, notify = extruderConfigurationChanged) + def hotendID(self): + return self._hotend_id + + def __eq__(self, other): + return hash(self) == hash(other) + + def __hash__(self): + return hash(self.position) ^ hash(self.material) ^ hash(self.hotendID) \ No newline at end of file diff --git a/cura/PrinterOutput/ExtruderOutputModel.py b/cura/PrinterOutput/ExtruderOutputModel.py index 3e415fb47a..d74b3a90d5 100644 --- a/cura/PrinterOutput/ExtruderOutputModel.py +++ b/cura/PrinterOutput/ExtruderOutputModel.py @@ -2,6 +2,7 @@ # Cura is released under the terms of the LGPLv3 or higher. from PyQt5.QtCore import pyqtSignal, pyqtProperty, QObject, pyqtSlot +from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel from typing import Optional @@ -26,7 +27,7 @@ class ExtruderOutputModel(QObject): self._hotend_temperature = 0 self._hotend_id = "" self._active_material = None # type: Optional[MaterialOutputModel] - self._extruder_configuration = {} + self._extruder_configuration = ExtruderConfigurationModel() # Update the configuration every time the hotend or the active material change self.hotendIDChanged.connect(self._updateExtruderConfiguration) self.activeMaterialChanged.connect(self._updateExtruderConfiguration) @@ -74,15 +75,13 @@ class ExtruderOutputModel(QObject): self._hotend_id = id self.hotendIDChanged.emit() - @pyqtProperty("QVariantMap", notify = extruderConfigurationChanged) + @pyqtProperty(QObject, notify = extruderConfigurationChanged) def extruderConfiguration(self): return self._extruder_configuration def _updateExtruderConfiguration(self): - self._extruder_configuration = { - "position": self._position, - "material": self._active_material.type if self.activeMaterial is not None else None, - "hotendID": self._hotend_id - } + self._extruder_configuration.position = self._position + self._extruder_configuration.material = self._active_material.type if self.activeMaterial is not None else None + self._extruder_configuration.hotendID = self._hotend_id print("Recalculating extruder configuration:", self._extruder_configuration) self.extruderConfigurationChanged.emit() diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 0c0187ee98..7d5e00f0b5 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -30,6 +30,7 @@ from UM.Signal import postponeSignals, CompressTechnique from cura.QualityManager import QualityManager from cura.PrinterOutputDevice import PrinterOutputDevice from cura.PrinterOutput.ConfigurationModel import ConfigurationModel +from cura.PrinterOutput.ExtruderConfigurationModel import ExtruderConfigurationModel from cura.Settings.ExtruderManager import ExtruderManager from .CuraStackBuilder import CuraStackBuilder @@ -177,19 +178,21 @@ class MachineManager(QObject): return self._current_printer_configuration.printerType = self._global_container_stack.definition.getName() - extruder_configurations = [] + self._current_printer_configuration.extruderConfigurations = [] for extruder in self._global_container_stack.extruders.values(): - extruder_configurations.append({ - "position": int(extruder.getMetaDataEntry("position")), - "material": extruder.material.getName() if extruder.material != self._empty_material_container else None, - "hotendID": extruder.variant.getName() if extruder.variant != self._empty_variant_container else None - }) - self._current_printer_configuration.extruderConfigurations = extruder_configurations + extruder_configuration = ExtruderConfigurationModel() + extruder_configuration.position = int(extruder.getMetaDataEntry("position")) + extruder_configuration.material = extruder.material.getName() if extruder.material != self._empty_material_container else None + extruder_configuration.hotendID = extruder.variant.getName() if extruder.variant != self._empty_variant_container else None + self._current_printer_configuration.extruderConfigurations.append(extruder_configuration) + self._current_printer_configuration.buildplateConfiguration = self._global_container_stack.variant.getName() if self._global_container_stack.variant != self._empty_variant_container else None self.currentConfigurationChanged.emit() @pyqtSlot(QObject, result = bool) def matchesConfiguration(self, configuration: ConfigurationModel) -> bool: + # print("@@@@@@@@@@@@@@@@@@", configuration.extruderConfigurations) + # print("##################", self._current_printer_configuration.extruderConfigurations, configuration == self._current_printer_configuration) return self._current_printer_configuration == configuration @property diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml index 3bb14c3c26..b28c5b4812 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationItem.qml @@ -108,4 +108,11 @@ Rectangle configurationItem.selected = Cura.MachineManager.matchesConfiguration(configuration) } } + + Connections { + target: configuration + onConfigurationChanged: { + configurationItem.selected = Cura.MachineManager.matchesConfiguration(configuration) + } + } } \ No newline at end of file diff --git a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml index f962dbaa9f..bc257c8a61 100644 --- a/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml +++ b/resources/qml/Menus/ConfigurationMenu/ConfigurationListView.qml @@ -42,6 +42,15 @@ Column font: UM.Theme.getFont("default_bold") } + Connections { + target: outputDevice + onUniqueConfigurationsChanged: { + // FIXME For now the model should be removed and then created again, otherwise changes in the printer don't automatically update the UI + configurationList.model = null + configurationList.model = outputDevice.uniqueConfigurations + } + } + ListView { id: configurationList