From 6c6dd0efad01b3bc2e0059b0fcc48d693db0c118 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Wed, 21 Aug 2019 16:48:47 +0200 Subject: [PATCH] Add signals to signal that a material got changed or removed The material models need to know this. Contributes to issue CURA-6600. --- cura/Machines/ContainerTree.py | 7 ++++++- cura/Machines/MachineNode.py | 4 ++++ cura/Machines/MaterialNode.py | 7 ++++++- cura/Machines/VariantNode.py | 7 ++++++- 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/cura/Machines/ContainerTree.py b/cura/Machines/ContainerTree.py index ca24950c78..e069734ef7 100644 --- a/cura/Machines/ContainerTree.py +++ b/cura/Machines/ContainerTree.py @@ -6,6 +6,7 @@ from UM.Settings.ContainerRegistry import ContainerRegistry # To listen to cont from UM.Settings.DefinitionContainer import DefinitionContainer from UM.Settings.Interfaces import ContainerInterface import cura.CuraApplication # Imported like this to prevent circular dependencies. +from UM.Signal import Signal from cura.Machines.MachineNode import MachineNode from typing import Dict, List, TYPE_CHECKING @@ -30,6 +31,8 @@ class ContainerTree: def __init__(self) -> None: self.machines = {} # type: Dict[str, MachineNode] # Mapping from definition ID to machine nodes. + self.materialsChanged = Signal() # Emitted when any of the material nodes in the tree got changed. + container_registry = ContainerRegistry.getInstance() container_registry.containerAdded.connect(self._machineAdded) self._loadAll() @@ -58,6 +61,7 @@ class ContainerTree: definition_id = stack.definition.getId() if definition_id not in self.machines: self.machines[definition_id] = MachineNode(definition_id) + self.machines[definition_id].materialsChanged.connect(self.materialsChanged) Logger.log("d", "Building the container tree took %s seconds", time.time() - start_time) @@ -69,4 +73,5 @@ class ContainerTree: if definition_id in self.machines: return # Already have this definition ID. - self.machines[definition_id] = MachineNode(definition_id) \ No newline at end of file + self.machines[definition_id] = MachineNode(definition_id) + self.machines[definition_id].materialsChanged.connect(self.materialsChanged) \ No newline at end of file diff --git a/cura/Machines/MachineNode.py b/cura/Machines/MachineNode.py index 567ec1deab..840c49ff08 100644 --- a/cura/Machines/MachineNode.py +++ b/cura/Machines/MachineNode.py @@ -4,6 +4,7 @@ from typing import Dict, List from UM.Logger import Logger +from UM.Signal import Signal from UM.Util import parseBool from UM.Settings.ContainerRegistry import ContainerRegistry # To find all the variants for this machine. from cura.Machines.ContainerNode import ContainerNode @@ -19,6 +20,8 @@ class MachineNode(ContainerNode): super().__init__(container_id) self.variants = {} # type: Dict[str, VariantNode] # Mapping variant names to their nodes. self.global_qualities = {} # type: Dict[str, QualityNode] # Mapping quality types to the global quality for those types. + self.materialsChanged = Signal() # Emitted when one of the materials underneath this machine has been changed. + container_registry = ContainerRegistry.getInstance() try: my_metadata = container_registry.findContainersMetadata(id = container_id)[0] @@ -93,6 +96,7 @@ class MachineNode(ContainerNode): variant_name = variant["name"] if variant_name not in self.variants: self.variants[variant_name] = VariantNode(variant["id"], machine = self) + self.variants[variant_name].materialsChanged.connect(self.materialsChanged) # Find the global qualities for this printer. global_qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.container_id, global_quality = True) # First try specific to this printer. diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index 9421448287..6a0621b366 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -5,6 +5,7 @@ from typing import Any, TYPE_CHECKING from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import ContainerInterface +from UM.Signal import Signal from cura.Machines.ContainerNode import ContainerNode from cura.Machines.QualityNode import QualityNode @@ -20,6 +21,8 @@ class MaterialNode(ContainerNode): super().__init__(container_id) self.variant = variant self.qualities = {} # type: Dict[str, QualityNode] # Mapping container IDs to quality profiles. + self.materialChanged = Signal() # Triggered when the material is removed or its metadata is updated. + container_registry = ContainerRegistry.getInstance() my_metadata = container_registry.findContainersMetadata(id = container_id)[0] self.base_file = my_metadata["base_file"] @@ -59,6 +62,7 @@ class MaterialNode(ContainerNode): # Remove myself from my parent. if self.base_file in self.variant.materials: del self.variant.materials[self.base_file] + self.materialChanged.emit(self) ## Triggered when any metadata changed in any container, but only handles # it when the metadata of this node is changed. @@ -84,4 +88,5 @@ class MaterialNode(ContainerNode): self.guid = new_metadata["GUID"] if self.base_file != old_base_file or self.material_type != old_material_type or self.guid != old_guid: # List of quality profiles could've changed. self.qualities = {} - self._loadAll() # Re-load the quality profiles for this node. \ No newline at end of file + self._loadAll() # Re-load the quality profiles for this node. + self.materialChanged.emit(self) \ No newline at end of file diff --git a/cura/Machines/VariantNode.py b/cura/Machines/VariantNode.py index 9d170933c5..b265cf5cdb 100644 --- a/cura/Machines/VariantNode.py +++ b/cura/Machines/VariantNode.py @@ -5,6 +5,7 @@ from typing import TYPE_CHECKING from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import ContainerInterface +from UM.Signal import Signal from cura.Machines.ContainerNode import ContainerNode from cura.Machines.MaterialNode import MaterialNode @@ -26,6 +27,8 @@ class VariantNode(ContainerNode): super().__init__(container_id) self.machine = machine self.materials = {} # type: Dict[str, MaterialNode] # Mapping material base files to their nodes. + self.materialsChanged = Signal() + container_registry = ContainerRegistry.getInstance() self.variant_name = container_registry.findContainersMetadata(id = container_id)[0]["name"] # Store our own name so that we can filter more easily. container_registry.containerAdded.connect(self._materialAdded) @@ -55,6 +58,7 @@ class VariantNode(ContainerNode): base_file = material["base_file"] if base_file not in self.materials: self.materials[base_file] = MaterialNode(material["id"], variant = self) + self.materials[base_file].materialChanged.connect(self.materialsChanged) ## When a material gets added to the set of profiles, we need to update our # tree here. @@ -85,4 +89,5 @@ class VariantNode(ContainerNode): if original_variant != "empty" or container.getMetaDataEntry("variant", "empty") == "empty": return # Original was already specific or just as unspecific as the new one. - self.materials[base_file] = MaterialNode(container.getId(), variant = self) \ No newline at end of file + self.materials[base_file] = MaterialNode(container.getId(), variant = self) + self.materials[base_file].materialChanged.connect(self.materialsChanged) \ No newline at end of file