mirror of
https://github.com/Ultimaker/Cura.git
synced 2025-07-06 22:47:29 -06:00
Added checkPackageUsageAndUninstall and the package usage check. No confirmation dialog yet
This commit is contained in:
parent
9fa8498162
commit
675c5064ed
5 changed files with 67 additions and 3 deletions
|
@ -2,8 +2,12 @@
|
||||||
# Cura is released under the terms of the LGPLv3 or higher.
|
# Cura is released under the terms of the LGPLv3 or higher.
|
||||||
|
|
||||||
from cura.CuraApplication import CuraApplication #To find some resource types.
|
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.PackageManager import PackageManager #The class we're extending.
|
||||||
from UM.Resources import Resources #To find storage paths for some resource types.
|
from UM.Resources import Resources #To find storage paths for some resource types.
|
||||||
|
from UM.Settings.ContainerRegistry import ContainerRegistry
|
||||||
|
|
||||||
|
|
||||||
class CuraPackageManager(PackageManager):
|
class CuraPackageManager(PackageManager):
|
||||||
|
@ -15,3 +19,22 @@ class CuraPackageManager(PackageManager):
|
||||||
self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer)
|
self._installation_dirs_dict["qualities"] = Resources.getStoragePath(CuraApplication.ResourceTypes.QualityInstanceContainer)
|
||||||
|
|
||||||
super().initialize()
|
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
|
||||||
|
|
|
@ -340,6 +340,13 @@ class QualityManager(QObject):
|
||||||
|
|
||||||
return quality_group_dict
|
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
|
# Methods for GUI
|
||||||
#
|
#
|
||||||
|
|
|
@ -1392,8 +1392,13 @@ class MachineManager(QObject):
|
||||||
material_node = self._material_manager.getMaterialNode(machine_definition_id, variant_name, material_diameter, root_material_id)
|
material_node = self._material_manager.getMaterialNode(machine_definition_id, variant_name, material_diameter, root_material_id)
|
||||||
self.setMaterial(position, material_node)
|
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")
|
@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)
|
position = str(position)
|
||||||
self.blurSettings.emit()
|
self.blurSettings.emit()
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
|
@ -1434,8 +1439,14 @@ class MachineManager(QObject):
|
||||||
quality_group = quality_group_dict[quality_type]
|
quality_group = quality_group_dict[quality_type]
|
||||||
self.setQualityGroup(quality_group)
|
self.setQualityGroup(quality_group)
|
||||||
|
|
||||||
|
## Optionally provide global_stack if you want to use your own
|
||||||
|
# The active global_stack is treated differently.
|
||||||
@pyqtSlot(QObject)
|
@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()
|
self.blurSettings.emit()
|
||||||
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
with postponeSignals(*self._getContainerChangedSignals(), compress = CompressTechnique.CompressPerParameterValue):
|
||||||
self._setQualityGroup(quality_group)
|
self._setQualityGroup(quality_group)
|
||||||
|
|
|
@ -83,7 +83,7 @@ Column
|
||||||
font: UM.Theme.getFont("default")
|
font: UM.Theme.getFont("default")
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
onClicked: toolbox.uninstall(model.id)
|
onClicked: toolbox.checkPackageUsageAndUninstall(model.id)
|
||||||
Connections
|
Connections
|
||||||
{
|
{
|
||||||
target: toolbox
|
target: toolbox
|
||||||
|
|
|
@ -294,6 +294,29 @@ class Toolbox(QObject, Extension):
|
||||||
self._restart_required = True
|
self._restart_required = True
|
||||||
self.restartRequiredChanged.emit()
|
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)
|
@pyqtSlot(str)
|
||||||
def uninstall(self, plugin_id: str) -> None:
|
def uninstall(self, plugin_id: str) -> None:
|
||||||
self._package_manager.removePackage(plugin_id, force_add = True)
|
self._package_manager.removePackage(plugin_id, force_add = True)
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue