From 30b2f943fdad0d4c2248a0b735815a19b334c2b7 Mon Sep 17 00:00:00 2001 From: Ghostkeeper Date: Mon, 19 Aug 2019 15:13:19 +0200 Subject: [PATCH] Update material node when its metadata changes This should keep the tree up to date if anything is added, removed or changed in the container registry. Contributes to issue CURA-6600. --- cura/Machines/MaterialNode.py | 38 ++++++++++++++++++++++++++++++----- 1 file changed, 33 insertions(+), 5 deletions(-) diff --git a/cura/Machines/MaterialNode.py b/cura/Machines/MaterialNode.py index cae88a6730..5148007c7d 100644 --- a/cura/Machines/MaterialNode.py +++ b/cura/Machines/MaterialNode.py @@ -1,7 +1,7 @@ # Copyright (c) 2019 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. -from typing import TYPE_CHECKING +from typing import Any, TYPE_CHECKING from UM.Settings.ContainerRegistry import ContainerRegistry from UM.Settings.Interfaces import ContainerInterface @@ -23,8 +23,11 @@ class MaterialNode(ContainerNode): container_registry = ContainerRegistry.getInstance() my_metadata = container_registry.findContainersMetadata(id = container_id)[0] self.base_file = my_metadata["base_file"] + self.material_type = my_metadata["material"] + self.guid = my_metadata["guid"] self._loadAll() container_registry.containerRemoved.connect(self._onRemoved) + container_registry.containerMetaDataChanged(self._onMetadataChanged) def _loadAll(self) -> None: container_registry = ContainerRegistry.getInstance() @@ -33,14 +36,13 @@ class MaterialNode(ContainerNode): qualities = container_registry.findInstanceContainersMetadata(type = "quality", definition = "fdmprinter") else: # Need to find the qualities that specify a material profile with the same material type. - my_metadata = container_registry.findInstanceContainersMetadata(id = self.container_id)[0] - my_material_type = my_metadata.get("material") + my_material_type = self.material_type qualities = [] qualities_any_material = container_registry.findInstanceContainersMetadata(type = "quality", definition = self.variant.machine.quality_definition, variant = self.variant.variant_name) for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", material = my_material_type): qualities.extend((quality for quality in qualities_any_material if quality["material"] == material_metadata["id"])) if not qualities: # No quality profiles found. Go by GUID then. - my_guid = my_metadata.get("guid") + my_guid = self.guid for material_metadata in container_registry.findInstanceContainersMetadata(type = "material", guid = my_guid): qualities.extend((quality for quality in qualities_any_material if quality["material"] == material_metadata["id"])) @@ -56,4 +58,30 @@ class MaterialNode(ContainerNode): if container.getId() == self.container_id: # Remove myself from my parent. if self.base_file in self.variant.materials: - del self.variant.materials[self.base_file] \ No newline at end of file + del self.variant.materials[self.base_file] + + ## Triggered when any metadata changed in any container, but only handles + # it when the metadata of this node is changed. + # \param container The container whose metadata changed. + # \param kwargs Key-word arguments provided when changing the metadata. + # These are ignored. As far as I know they are never provided to this + # call. + def _onMetadataChanged(self, container: ContainerInterface, **kwargs: Any) -> None: + if container.getId() != self.container_id: + return + + new_metadata = container.getMetaData() + old_base_file = self.base_file + if new_metadata["base_file"] != old_base_file: + self.base_file = new_metadata["base_file"] + if old_base_file in self.variant.materials: # Move in parent node. + del self.variant.materials[old_base_file] + self.variant.materials[self.base_file] = self + + old_material_type = self.material_type + self.material_type = new_metadata["material"] + old_guid = self.guid + 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