diff --git a/cura/Machines/Models/QualityProfilesModel.py b/cura/Machines/Models/QualityProfilesModel.py index 3bfccd409d..519213e8e2 100644 --- a/cura/Machines/Models/QualityProfilesModel.py +++ b/cura/Machines/Models/QualityProfilesModel.py @@ -35,6 +35,7 @@ class QualityProfilesModel(ListModel): # connect signals Application.getInstance().globalContainerStackChanged.connect(self._update) Application.getInstance().getMachineManager().activeQualityGroupChanged.connect(self._update) + Application.getInstance().getMachineManager().extruderChanged.connect(self._update) self._quality_manager = Application.getInstance()._quality_manager self._quality_manager.qualitiesUpdated.connect(self._update) diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index eb8a3611c1..08f565ac66 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -237,9 +237,9 @@ class QualityManager(QObject): # Updates the given quality groups' availabilities according to which extruders are being used/ enabled. def _updateQualityGroupsAvailability(self, machine: "GlobalStack", quality_group_list): used_extruders = set() - # TODO: This will change after the Machine refactoring for i in range(machine.getProperty("machine_extruder_count", "value")): - used_extruders.add(str(i)) + if machine.extruders[str(i)].isEnabled: + used_extruders.add(str(i)) # Update the "is_available" flag for each quality group. for quality_group in quality_group_list: diff --git a/cura/Settings/ExtruderStack.py b/cura/Settings/ExtruderStack.py index 2995aae795..2a4207c3f3 100644 --- a/cura/Settings/ExtruderStack.py +++ b/cura/Settings/ExtruderStack.py @@ -3,7 +3,7 @@ from typing import Any, TYPE_CHECKING, Optional -from PyQt5.QtCore import pyqtProperty +from PyQt5.QtCore import pyqtProperty, pyqtSignal from UM.Decorators import override from UM.MimeTypeDatabase import MimeType, MimeTypeDatabase @@ -28,9 +28,12 @@ class ExtruderStack(CuraContainerStack): super().__init__(container_id, *args, **kwargs) self.addMetaDataEntry("type", "extruder_train") # For backward compatibility + self._enabled = True self.propertiesChanged.connect(self._onPropertiesChanged) + enabledChanged = pyqtSignal() + ## Overridden from ContainerStack # # This will set the next stack and ensure that we register this stack as an extruder. @@ -47,6 +50,14 @@ class ExtruderStack(CuraContainerStack): def getNextStack(self) -> Optional["GlobalStack"]: return super().getNextStack() + def setEnabled(self, enabled): + self._enabled = enabled + self.enabledChanged.emit() + + @pyqtProperty(bool, notify = enabledChanged) + def isEnabled(self): + return self._enabled + @classmethod def getLoadingPriority(cls) -> int: return 3 diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 5abd5d4649..b3a2a7ed9e 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -135,6 +135,7 @@ class MachineManager(QObject): activeVariantChanged = pyqtSignal() activeQualityChanged = pyqtSignal() activeStackChanged = pyqtSignal() # Emitted whenever the active stack is changed (ie: when changing between extruders, changing a profile, but not when changing a value) + extruderChanged = pyqtSignal() globalValueChanged = pyqtSignal() # Emitted whenever a value inside global container is changed. activeStackValueChanged = pyqtSignal() # Emitted whenever a value inside the active stack is changed. @@ -764,6 +765,13 @@ class MachineManager(QObject): extruder = self._global_container_stack.extruders.get(str(position)) return extruder + @pyqtSlot(int, bool) + def setExtruderEnabled(self, position: int, enabled) -> None: + extruder = self.getExtruder(position) + extruder.setEnabled(enabled) + + self.extruderChanged.emit() + def _onMachineNameChanged(self): self.globalContainerChanged.emit() diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index aeb75a79c5..5764ff0628 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -200,8 +200,21 @@ UM.MainWindow MenuItem { text: catalog.i18nc("@action:inmenu", "Set as Active Extruder") - onTriggered: Cura.ExtruderManager.setActiveExtruderIndex(model.index) + onTriggered: Cura.MachineManager.setExtruderIndex(model.index) } + + MenuItem { + text: catalog.i18nc("@action:inmenu", "Enable Extruder") + onTriggered: Cura.MachineManager.setExtruderEnabled(model.index, true) + visible: !Cura.MachineManager.getExtruder(model.index).isEnabled + } + + MenuItem { + text: catalog.i18nc("@action:inmenu", "Disable Extruder") + onTriggered: Cura.MachineManager.setExtruderEnabled(model.index, false) + visible: Cura.MachineManager.getExtruder(model.index).isEnabled + } + } onObjectAdded: settingsMenu.insertItem(index, object) onObjectRemoved: settingsMenu.removeItem(object) diff --git a/resources/qml/ExtruderButton.qml b/resources/qml/ExtruderButton.qml index e4350e0a2c..2c1b80047e 100644 --- a/resources/qml/ExtruderButton.qml +++ b/resources/qml/ExtruderButton.qml @@ -19,7 +19,7 @@ Button iconSource: UM.Theme.getIcon("extruder_button") checked: Cura.ExtruderManager.selectedObjectExtruders.indexOf(extruder.id) != -1 - enabled: UM.Selection.hasSelection + enabled: UM.Selection.hasSelection && extruder.stack.isEnabled property color customColor: base.hovered ? UM.Theme.getColor("button_hover") : UM.Theme.getColor("button"); diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index 5d9cbe2ad1..a9aefe4848 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -114,6 +114,18 @@ Column Behavior on color { ColorAnimation { duration: 50; } } } + function buttonColor(index) { + var extruder = Cura.MachineManager.getExtruder(index); + if (extruder.isEnabled) { + return ( + control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : + control.hovered ? UM.Theme.getColor("action_button_hovered_text") : + UM.Theme.getColor("action_button_text"); + } else { + return UM.Theme.getColor("action_button_disabled"); + } + } + Item { id: extruderButtonFace @@ -131,9 +143,7 @@ Column anchors.verticalCenter: parent.verticalCenter anchors.left: parent.left - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") + color: buttonColor(index) font: UM.Theme.getFont("large_nonbold") text: catalog.i18nc("@label", "Extruder") @@ -176,9 +186,7 @@ Column id: extruderNumberText anchors.centerIn: parent text: index + 1; - color: (control.checked || control.pressed) ? UM.Theme.getColor("action_button_active_text") : - control.hovered ? UM.Theme.getColor("action_button_hovered_text") : - UM.Theme.getColor("action_button_text") + color: buttonColor(index) font: UM.Theme.getFont("default_bold") } diff --git a/resources/qml/SidebarSimple.qml b/resources/qml/SidebarSimple.qml index 877e3a1557..4181e9df73 100644 --- a/resources/qml/SidebarSimple.qml +++ b/resources/qml/SidebarSimple.qml @@ -67,10 +67,8 @@ Item Connections { - target: Cura.MachineManager - onActiveQualityChanged: qualityModel.update() - onActiveMaterialChanged: qualityModel.update() - onActiveVariantChanged: qualityModel.update() + target: Cura.QualityProfilesModel + onItemsChanged: qualityModel.update() } Connections {