From 324d1415d7fd12970c23b945599db11282e0aa8e Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 4 Aug 2016 17:55:16 +0200 Subject: [PATCH 1/4] Fix updating active quality Contributes to CURA-2006 --- cura/Settings/ContainerManager.py | 3 +++ cura/Settings/MachineManager.py | 2 ++ 2 files changed, 5 insertions(+) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 528248f7ae..797b5d7cec 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -377,6 +377,8 @@ class ContainerManager(QObject): for merge_into, merge in containers_to_merge: self._performMerge(merge_into, merge) + cura.Settings.MachineManager.getInstance().activeQualityChanged.emit() + @pyqtSlot() def clearUserContainers(self): global_stack = UM.Application.getInstance().getGlobalContainerStack() @@ -432,6 +434,7 @@ class ContainerManager(QObject): stack.replaceContainer(stack.getContainerIndex(quality_changes_container), new_quality_changes) stack.getTop().clear() + cura.Settings.MachineManager.getInstance().activeQualityChanged.emit() return True # Factory function, used by QML diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 3b239ce770..e1cc784d9e 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -605,6 +605,8 @@ class MachineManager(QObject): catalog.i18nc("@label", "If you transfer your settings they will override settings in the profile."), details, buttons = QMessageBox.Yes + QMessageBox.No, icon = QMessageBox.Question, callback = self._keepUserSettingsDialogCallback) + self.activeQualityChanged.emit() + def _keepUserSettingsDialogCallback(self, button): if button == QMessageBox.Yes: # Yes, keep the settings in the user profile with this profile From 7b9c982c62d4d54dc0ec15ea00505d4f7610504c Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 4 Aug 2016 18:04:32 +0200 Subject: [PATCH 2/4] Properly fix machinemanager access Contributes to CURA-2006 --- cura/Settings/ContainerManager.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 797b5d7cec..c340815212 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -362,7 +362,7 @@ class ContainerManager(QObject): UM.Logger.log("e", "Could not update quality of a nonexistant or read only quality profile") return False - cura.Settings.MachineManager.getInstance().blurSettings.emit() + UM.Application.getInstance().getMachineManager().blurSettings.emit() containers_to_merge.append((global_quality_changes, global_stack.getTop())) @@ -377,13 +377,13 @@ class ContainerManager(QObject): for merge_into, merge in containers_to_merge: self._performMerge(merge_into, merge) - cura.Settings.MachineManager.getInstance().activeQualityChanged.emit() + UM.Application.getInstance().getMachineManager().activeQualityChanged.emit() @pyqtSlot() def clearUserContainers(self): global_stack = UM.Application.getInstance().getGlobalContainerStack() - cura.Settings.MachineManager.getInstance().blurSettings.emit() + UM.Application.getInstance().getMachineManager().blurSettings.emit() for extruder in cura.Settings.ExtruderManager.getInstance().getMachineExtruders(global_stack.getId()): extruder.getTop().clear() @@ -401,7 +401,7 @@ class ContainerManager(QObject): UM.Logger.log("w", "No quality container found in stack %s, cannot create profile", global_stack.getId()) return False - cura.Settings.MachineManager.getInstance().blurSettings.emit() + UM.Application.getInstance().getMachineManager().blurSettings.emit() unique_name = UM.Settings.ContainerRegistry.getInstance().uniqueName(quality_container.getName()) unique_id = unique_name.lower() @@ -434,7 +434,7 @@ class ContainerManager(QObject): stack.replaceContainer(stack.getContainerIndex(quality_changes_container), new_quality_changes) stack.getTop().clear() - cura.Settings.MachineManager.getInstance().activeQualityChanged.emit() + UM.Application.getInstance().getMachineManager().activeQualityChanged.emit() return True # Factory function, used by QML From bc8c55f8fbef4a30c4f32ee532ead5662dc5b2ad Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 4 Aug 2016 18:05:45 +0200 Subject: [PATCH 3/4] Properly return True in updateQualityChanges Since it is declared as returning bool Contributes to CURA-2006 --- cura/Settings/ContainerManager.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index c340815212..c23823d71f 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -379,6 +379,8 @@ class ContainerManager(QObject): UM.Application.getInstance().getMachineManager().activeQualityChanged.emit() + return True + @pyqtSlot() def clearUserContainers(self): global_stack = UM.Application.getInstance().getGlobalContainerStack() From 4a02a9d1e3b6e3e6dfa85ba76444fc4fd4e25ce5 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Thu, 4 Aug 2016 18:11:36 +0200 Subject: [PATCH 4/4] Fix updating changed state for all stacks Contributes to CURA-2006 --- cura/Settings/MachineManager.py | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index e1cc784d9e..03268fb457 100644 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -211,6 +211,7 @@ class MachineManager(QObject): if self._global_container_stack: self._global_container_stack.nameChanged.disconnect(self._onMachineNameChanged) self._global_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + self._global_container_stack.propertyChanged.disconnect(self._onPropertyChanged) material = self._global_container_stack.findContainer({"type": "material"}) material.nameChanged.disconnect(self._onMaterialNameChanged) @@ -227,6 +228,7 @@ class MachineManager(QObject): Preferences.getInstance().setValue("cura/active_machine", self._global_container_stack.getId()) self._global_container_stack.nameChanged.connect(self._onMachineNameChanged) self._global_container_stack.containersChanged.connect(self._onInstanceContainersChanged) + self._global_container_stack.propertyChanged.connect(self._onPropertyChanged) material = self._global_container_stack.findContainer({"type": "material"}) material.nameChanged.connect(self._onMaterialNameChanged) @@ -237,9 +239,11 @@ class MachineManager(QObject): self.blurSettings.emit() # Ensure no-one has focus. if self._active_container_stack and self._active_container_stack != self._global_container_stack: self._active_container_stack.containersChanged.disconnect(self._onInstanceContainersChanged) + self._active_container_stack.propertyChanged.disconnect(self._onPropertyChanged) self._active_container_stack = ExtruderManager.getInstance().getActiveExtruderStack() if self._active_container_stack: self._active_container_stack.containersChanged.connect(self._onInstanceContainersChanged) + self._active_container_stack.propertyChanged.connect(self._onPropertyChanged) else: self._active_container_stack = self._global_container_stack self._active_stack_valid = not self._checkStackForErrors(self._active_container_stack) @@ -248,8 +252,6 @@ class MachineManager(QObject): def _onInstanceContainersChanged(self, container): container_type = container.getMetaDataEntry("type") - - if container_type == "material": self.activeMaterialChanged.emit() elif container_type == "variant": @@ -257,6 +259,9 @@ class MachineManager(QObject): elif container_type == "quality": self.activeQualityChanged.emit() + def _onPropertyChanged(self, key, property_name): + self.activeStackChanged.emit() + @pyqtSlot(str) def setActiveMachine(self, stack_id): containers = UM.Settings.ContainerRegistry.getInstance().findContainerStacks(id = stack_id) @@ -333,11 +338,17 @@ class MachineManager(QObject): ## Check if the global_container has instances in the user container @pyqtProperty(bool, notify = activeStackChanged) def hasUserSettings(self): - if not self._active_container_stack: + if not self._global_container_stack: return False - user_settings = self._active_container_stack.getTop().findInstances(**{}) - return len(user_settings) != 0 + if self._global_container_stack.getTop().findInstances(): + return True + + for stack in ExtruderManager.getInstance().getMachineExtruders(self._global_container_stack.getId()): + if stack.getTop().findInstances(): + return True + + return False ## Check if the global profile does not contain error states # Note that the _active_stack_valid is cached due to performance issues