Added checkPackageUsageAndUninstall and the package usage check. No confirmation dialog yet

This commit is contained in:
Jack Ha 2018-07-05 11:47:06 +02:00
parent 9fa8498162
commit 675c5064ed
5 changed files with 67 additions and 3 deletions

View file

@ -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

View file

@ -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
#

View file

@ -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)

View file

@ -83,7 +83,7 @@ Column
font: UM.Theme.getFont("default")
}
}
onClicked: toolbox.uninstall(model.id)
onClicked: toolbox.checkPackageUsageAndUninstall(model.id)
Connections
{
target: toolbox

View file

@ -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)