Browse Source

Hide materials belong to a to-be-removed package

Lipu Fei 6 years ago
parent
commit
76417b7fb2

+ 2 - 3
cura/CuraPackageManager.py

@@ -6,7 +6,6 @@ from cura.Settings.GlobalStack import GlobalStack
 
 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):
@@ -25,14 +24,14 @@ class CuraPackageManager(PackageManager):
     #   The list consists of 3-tuples: (global_stack, extruder_nr, container_id)
     def getMachinesUsingPackage(self, package_id: str):
         ids = self.getPackageContainerIds(package_id)
-        container_stacks = ContainerRegistry.getInstance().findContainerStacks()
+        container_stacks = self._application.getContainerRegistry().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"):
+                    if container_id in (extruder_stack.material.getId(), extruder_stack.material.getMetaData().get("base_file")):
                         machine_with_materials.append((global_stack, extruder_nr, container_id))
                     if container_id == extruder_stack.quality.getId():
                         machine_with_qualities.append((global_stack, extruder_nr, container_id))

+ 8 - 5
cura/Machines/MaterialGroup.py

@@ -1,8 +1,11 @@
 # Copyright (c) 2018 Ultimaker B.V.
 # Cura is released under the terms of the LGPLv3 or higher.
 
-from typing import List
-from cura.Machines.MaterialNode import MaterialNode #For type checking.
+from typing import List, TYPE_CHECKING
+
+if TYPE_CHECKING:
+    from cura.Machines.MaterialNode import MaterialNode
+
 
 ## A MaterialGroup represents a group of material InstanceContainers that are derived from a single material profile.
 # The main InstanceContainer which has the ID of the material profile file name is called the "root_material". For
@@ -18,11 +21,11 @@ from cura.Machines.MaterialNode import MaterialNode #For type checking.
 class MaterialGroup:
     __slots__ = ("name", "is_read_only", "root_material_node", "derived_material_node_list")
 
-    def __init__(self, name: str, root_material_node: MaterialNode) -> None:
+    def __init__(self, name: str, root_material_node: "MaterialNode") -> None:
         self.name = name
         self.is_read_only = False
-        self.root_material_node = root_material_node # type: MaterialNode
-        self.derived_material_node_list = [] #type: List[MaterialNode]
+        self.root_material_node = root_material_node  # type: MaterialNode
+        self.derived_material_node_list = []  # type: List[MaterialNode]
 
     def __str__(self) -> str:
         return "%s[%s]" % (self.__class__.__name__, self.name)

+ 4 - 0
cura/Machines/Models/BrandMaterialsModel.py

@@ -109,6 +109,10 @@ class BrandMaterialsModel(ListModel):
             if brand.lower() == "generic":
                 continue
 
+            # Do not include the materials from a to-be-removed package
+            if bool(metadata.get("removed", False)):
+                continue
+
             if brand not in brand_group_dict:
                 brand_group_dict[brand] = {}
 

+ 5 - 0
cura/Machines/Models/GenericMaterialsModel.py

@@ -41,10 +41,15 @@ class GenericMaterialsModel(BaseMaterialsModel):
         item_list = []
         for root_material_id, container_node in available_material_dict.items():
             metadata = container_node.metadata
+
             # Only add results for generic materials
             if metadata["brand"].lower() != "generic":
                 continue
 
+            # Do not include the materials from a to-be-removed package
+            if bool(metadata.get("removed", False)):
+                continue
+
             item = {"root_material_id": root_material_id,
                     "id": metadata["id"],
                     "name": metadata["name"],

+ 24 - 2
plugins/Toolbox/src/Toolbox.py

@@ -360,16 +360,38 @@ class Toolbox(QObject, Extension):
         material_manager = application.getMaterialManager()
         quality_manager = application.getQualityManager()
         machine_manager = application.getMachineManager()
-        for global_stack, extruder_nr, _ in self._package_used_materials:
+
+        for global_stack, extruder_nr, container_id in self._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 self._package_used_qualities:
+        for global_stack, extruder_nr, container_id in self._package_used_qualities:
             default_quality_group = quality_manager.getDefaultQualityType(global_stack)
             machine_manager.setQualityGroup(default_quality_group, global_stack = global_stack)
+
+        self._markPackageMaterialsAsRemove(self._package_id_to_uninstall)
+
         self.uninstall(self._package_id_to_uninstall)
         self._resetUninstallVariables()
         self.closeConfirmResetDialog()
 
+    def _markPackageMaterialsAsRemove(self, package_id: str) -> None:
+        container_registry = self._application.getContainerRegistry()
+
+        all_containers = self._package_manager.getPackageContainerIds(package_id)
+        for container_id in all_containers:
+            containers = container_registry.findInstanceContainers(id = container_id)
+            if not containers:
+                continue
+            container = containers[0]
+            if container.getMetaDataEntry("type") != "material":
+                continue
+            root_material_id = container.getMetaDataEntry("base_file")
+            root_material_containers = container_registry.findInstanceContainers(id = root_material_id)
+            if not root_material_containers:
+                continue
+            root_material_container = root_material_containers[0]
+            root_material_container.setMetaDataEntry("removed", True)
+
     @pyqtSlot(str)
     def uninstall(self, package_id: str) -> None:
         self._package_manager.removePackage(package_id, force_add = True)

+ 3 - 0
plugins/XmlMaterialProfile/XmlMaterialProfile.py

@@ -63,6 +63,7 @@ class XmlMaterialProfile(InstanceContainer):
 
         # Prevent recursion
         if not apply_to_all:
+            super().addMetaDataEntry(key, value)
             super().setMetaDataEntry(key, value)
             return
 
@@ -74,12 +75,14 @@ class XmlMaterialProfile(InstanceContainer):
         # Update the root material container
         root_material_container = material_group.root_material_node.getContainer()
         if root_material_container is not None:
+            root_material_container.addMetaDataEntry(key, value)
             root_material_container.setMetaDataEntry(key, value, apply_to_all = False)
 
         # Update all containers derived from it
         for node in material_group.derived_material_node_list:
             container = node.getContainer()
             if container is not None:
+                container.addMetaDataEntry(key, value)
                 container.setMetaDataEntry(key, value, apply_to_all = False)
 
     ##  Overridden from InstanceContainer, similar to setMetaDataEntry.