From 675c5064ed965f1f90d8b20f24737a1c186d3296 Mon Sep 17 00:00:00 2001 From: Jack Ha Date: Thu, 5 Jul 2018 11:47:06 +0200 Subject: [PATCH] Added checkPackageUsageAndUninstall and the package usage check. No confirmation dialog yet --- cura/CuraPackageManager.py | 23 +++++++++++++++++++ cura/Machines/QualityManager.py | 7 ++++++ cura/Settings/MachineManager.py | 15 ++++++++++-- .../qml/ToolboxInstalledTileActions.qml | 2 +- plugins/Toolbox/src/Toolbox.py | 23 +++++++++++++++++++ 5 files changed, 67 insertions(+), 3 deletions(-) diff --git a/cura/CuraPackageManager.py b/cura/CuraPackageManager.py index f65633ed66..0dfac6b84f 100644 --- a/cura/CuraPackageManager.py +++ b/cura/CuraPackageManager.py @@ -2,8 +2,12 @@ # Cura is released under the terms of the LGPLv3 or higher. from cura.CuraApplication import CuraApplication #To find some resource types. +from cura.Settings.GlobalStack import GlobalStack + +from UM.Logger import Logger from UM.PackageManager import PackageManager #The class we're extending. from UM.Resources import Resources #To find storage paths for some resource types. +from UM.Settings.ContainerRegistry import ContainerRegistry class CuraPackageManager(PackageManager): @@ -15,3 +19,22 @@ class CuraPackageManager(PackageManager): self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer) super().initialize() + + ## Returns a list of where the package is used + # empty if it is never used. + # It loops through all the package contents and see if some of the ids are used. + def packageUsed(self, package_id: str): + ids = self.packageContainerIds(package_id) + container_stacks = ContainerRegistry.getInstance().findContainerStacks() + global_stacks = [container_stack for container_stack in container_stacks if isinstance(container_stack, GlobalStack)] + machine_with_materials = [] + machine_with_qualities = [] + for container_id in ids: + for global_stack in global_stacks: + for extruder_nr, extruder_stack in global_stack.extruders.items(): + if container_id == extruder_stack.material.getId() or container_id == extruder_stack.material.getMetaData().get("base_file"): + machine_with_materials.append((global_stack, extruder_nr)) + if container_id == extruder_stack.quality.getId(): + machine_with_qualities.append((global_stack, extruder_nr)) + + return machine_with_materials, machine_with_qualities diff --git a/cura/Machines/QualityManager.py b/cura/Machines/QualityManager.py index 8033057f77..d5d9c0e727 100644 --- a/cura/Machines/QualityManager.py +++ b/cura/Machines/QualityManager.py @@ -340,6 +340,13 @@ class QualityManager(QObject): return quality_group_dict + def getDefaultQualityType(self, machine: "GlobalStack") -> QualityGroup: + preferred_quality_type = machine.definition.getMetaDataEntry("preferred_quality_type") + quality_group_dict = self.getQualityGroups(machine) + quality_group = quality_group_dict.get(preferred_quality_type) + return quality_group + + # # Methods for GUI # diff --git a/cura/Settings/MachineManager.py b/cura/Settings/MachineManager.py index 065dc84df1..10d32b0a70 100755 --- a/cura/Settings/MachineManager.py +++ b/cura/Settings/MachineManager.py @@ -1392,8 +1392,13 @@ class MachineManager(QObject): material_node = self._material_manager.getMaterialNode(machine_definition_id, variant_name, material_diameter, root_material_id) self.setMaterial(position, material_node) + ## global_stack: if you want to provide your own global_stack instead of the current active one + # if you update an active machine, special measures have to be taken. @pyqtSlot(str, "QVariant") - def setMaterial(self, position: str, container_node) -> None: + def setMaterial(self, position: str, container_node, global_stack: Optional["GlobalStack"] = None) -> None: + if global_stack is not None and global_stack != self._global_container_stack: + global_stack.extruders[position].material = container_node.getContainer() + return position = str(position) self.blurSettings.emit() with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): @@ -1434,8 +1439,14 @@ class MachineManager(QObject): quality_group = quality_group_dict[quality_type] self.setQualityGroup(quality_group) + ## Optionally provide global_stack if you want to use your own + # The active global_stack is treated differently. @pyqtSlot(QObject) - def setQualityGroup(self, quality_group: QualityGroup, no_dialog: bool = False) -> None: + def setQualityGroup(self, quality_group: QualityGroup, no_dialog: bool = False, global_stack: Optional["GlobalStack"] = None) -> None: + if global_stack is not None and global_stack != self._global_container_stack: + global_stack.quality = quality_group.node_for_global.getContainer() + return + self.blurSettings.emit() with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue): self._setQualityGroup(quality_group) diff --git a/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml b/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml index b0aecfc9a2..8fd88b1cfd 100644 --- a/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml +++ b/plugins/Toolbox/resources/qml/ToolboxInstalledTileActions.qml @@ -83,7 +83,7 @@ Column font: UM.Theme.getFont("default") } } - onClicked: toolbox.uninstall(model.id) + onClicked: toolbox.checkPackageUsageAndUninstall(model.id) Connections { target: toolbox diff --git a/plugins/Toolbox/src/Toolbox.py b/plugins/Toolbox/src/Toolbox.py index 0d0060e48c..3e0749d612 100644 --- a/plugins/Toolbox/src/Toolbox.py +++ b/plugins/Toolbox/src/Toolbox.py @@ -294,6 +294,29 @@ class Toolbox(QObject, Extension): self._restart_required = True self.restartRequiredChanged.emit() + ## Check package usage and uninstall + # If the package is in use, you'll get a confirmation dialog to set everything to default + @pyqtSlot(str) + def checkPackageUsageAndUninstall(self, plugin_id: str) -> None: + print("checkPackageUsageAndUninstall...") + package_used_materials, package_used_qualities = self._package_manager.packageUsed(plugin_id) + if package_used_materials or package_used_qualities: + # Ask change to default material / profile + # Cancel: just return + # Confirm: change to default material / profile + material_manager = CuraApplication.getInstance().getMaterialManager() + quality_manager = CuraApplication.getInstance().getQualityManager() + machine_manager = CuraApplication.getInstance().getMachineManager() + for global_stack, extruder_nr in package_used_materials: + default_material_node = material_manager.getDefaultMaterial(global_stack, extruder_nr, global_stack.extruders[extruder_nr].variant.getName()) + machine_manager.setMaterial(extruder_nr, default_material_node, global_stack = global_stack) + for global_stack, extruder_nr in package_used_qualities: + default_quality_group = quality_manager.getDefaultQualityType(global_stack) + machine_manager.setQualityGroup(default_quality_group, global_stack = global_stack) + # Change to default material / profile + self.uninstall(plugin_id) + return + @pyqtSlot(str) def uninstall(self, plugin_id: str) -> None: self._package_manager.removePackage(plugin_id, force_add = True)