diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index a4d6237d80..4b0308a861 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -63,6 +63,7 @@ class MachineManager(QObject): self._current_root_material_id = {} # type: Dict[str, str] self._default_extruder_position = "0" # to be updated when extruders are switched on and off + self._num_user_settings = 0 self._instance_container_timer = QTimer() # type: QTimer self._instance_container_timer.setInterval(250) @@ -126,6 +127,8 @@ class MachineManager(QObject): self.activeQualityGroupChanged.connect(self.activeQualityDisplayNameChanged) self.activeQualityChangesGroupChanged.connect(self.activeQualityDisplayNameChanged) + self.activeStackValueChanged.connect(self._reCalculateNumUserSettings) + activeQualityDisplayNameChanged = pyqtSignal() activeQualityGroupChanged = pyqtSignal() @@ -151,6 +154,22 @@ class MachineManager(QObject): printerConnectedStatusChanged = pyqtSignal() # Emitted every time the active machine change or the outputdevices change rootMaterialChanged = pyqtSignal() + numUserSettingsChanged = pyqtSignal() + + def _reCalculateNumUserSettings(self): + if not self._global_container_stack: + if self._num_user_settings != 0: + self.numUserSettingsChanged.emit() + self._num_user_settings = 0 + return + num_user_settings = self._global_container_stack.getTop().getNumInstances() + stacks = self._global_container_stack.extruderList + for stack in stacks: + num_user_settings += stack.getTop().getNumInstances() + + if self._num_user_settings != num_user_settings: + self._num_user_settings = num_user_settings + self.numUserSettingsChanged.emit() def setInitialActiveMachine(self) -> None: active_machine_id = self._application.getPreferences().getValue("cura/active_machine") @@ -415,31 +434,13 @@ class MachineManager(QObject): Logger.log("d", "Checking %s stacks for errors took %.2f s" % (count, time.time() - time_start)) return False - @pyqtProperty(bool, notify = activeStackValueChanged) + @pyqtProperty(bool, notify = numUserSettingsChanged) def hasUserSettings(self) -> bool: - """Check if the global_container has instances in the user container""" + return self._num_user_settings != 0 - if not self._global_container_stack: - return False - - if self._global_container_stack.getTop().getNumInstances() != 0: - return True - - for stack in self._global_container_stack.extruderList: - if stack.getTop().getNumInstances() != 0: - return True - - return False - - @pyqtProperty(int, notify = activeStackValueChanged) + @pyqtProperty(int, notify = numUserSettingsChanged) def numUserSettings(self) -> int: - if not self._global_container_stack: - return 0 - num_user_settings = self._global_container_stack.getTop().getNumInstances() - stacks = self._global_container_stack.extruderList - for stack in stacks: - num_user_settings += stack.getTop().getNumInstances() - return num_user_settings + return self._num_user_settings @pyqtSlot(str) def clearUserSettingAllCurrentStacks(self, key: str) -> None: @@ -967,11 +968,10 @@ class MachineManager(QObject): if self._global_container_stack is None: return - with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): - property_names = ["value", "resolve", "validationState"] - for container in [self._global_container_stack] + self._global_container_stack.extruderList: - for setting_key in container.getAllKeys(): - container.propertiesChanged.emit(setting_key, property_names) + property_names = ["value", "resolve", "validationState"] + for container in [self._global_container_stack] + self._global_container_stack.extruderList: + for setting_key in container.getAllKeys(): + container.propertiesChanged.emit(setting_key, property_names) @pyqtSlot(int, bool) def setExtruderEnabled(self, position: int, enabled: bool) -> None: @@ -985,10 +985,6 @@ class MachineManager(QObject): self.updateNumberExtrudersEnabled() self.correctExtruderSettings() - # In case this extruder is being disabled and it's the currently selected one, switch to the default extruder - if not enabled and position == ExtruderManager.getInstance().activeExtruderIndex: - ExtruderManager.getInstance().setActiveExtruderIndex(int(self._default_extruder_position)) - # Ensure that the quality profile is compatible with current combination, or choose a compatible one if available self._updateQualityWithMaterial() self.extruderChanged.emit() @@ -996,8 +992,7 @@ class MachineManager(QObject): self.activeQualityGroupChanged.emit() # Update items in SettingExtruder ExtruderManager.getInstance().extrudersChanged.emit(self._global_container_stack.getId()) - # Make sure the front end reflects changes - self.forceUpdateAllSettings() + # Also trigger the build plate compatibility to update self.activeMaterialChanged.emit() self.activeIntentChanged.emit() diff --git a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml index 010e2e77b0..b9b4d3261a 100644 --- a/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml +++ b/resources/qml/Menus/ConfigurationMenu/CustomConfiguration.qml @@ -222,11 +222,18 @@ Item OldControls.CheckBox { id: enabledCheckbox - checked: Cura.MachineManager.activeStack != null ? Cura.MachineManager.activeStack.isEnabled : false enabled: !checked || Cura.MachineManager.numberExtrudersEnabled > 1 //Disable if it's the last enabled extruder. height: parent.height style: UM.Theme.styles.checkbox + Binding + { + target: enabledCheckbox + property: "checked" + value: Cura.MachineManager.activeStack.isEnabled + when: Cura.MachineManger.activeStack != null + } + /* Use a MouseArea to process the click on this checkbox. This is necessary because actually clicking the checkbox causes the "checked" property to be overwritten. After @@ -235,8 +242,17 @@ Item MouseArea { anchors.fill: parent - onClicked: Cura.MachineManager.setExtruderEnabled(Cura.ExtruderManager.activeExtruderIndex, !parent.checked) - enabled: parent.enabled + onClicked: + { + if(!parent.enabled) + { + return + } + // Already update the visual indication + parent.checked = !parent.checked + // Update the settings on the background! + Cura.MachineManager.setExtruderEnabled(Cura.ExtruderManager.activeExtruderIndex, parent.checked) + } } } } diff --git a/tests/TestMachineManager.py b/tests/TestMachineManager.py index 2d8337ecd5..4f15a0670c 100644 --- a/tests/TestMachineManager.py +++ b/tests/TestMachineManager.py @@ -57,7 +57,7 @@ def test_hasUserSettings(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value = 12) mocked_stack.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert machine_manager.numUserSettings == 12 assert machine_manager.hasUserSettings @@ -74,7 +74,7 @@ def test_hasUserSettingsExtruder(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value=200) extruder.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert machine_manager.hasUserSettings assert machine_manager.numUserSettings == 200 @@ -91,7 +91,7 @@ def test_hasUserSettingsEmptyUserChanges(machine_manager, application): mocked_instance_container = MagicMock(name="UserSettingContainer") mocked_instance_container.getNumInstances = MagicMock(return_value=0) extruder.getTop = MagicMock(return_value = mocked_instance_container) - + machine_manager._reCalculateNumUserSettings() assert not machine_manager.hasUserSettings