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.
This commit is contained in:
Ghostkeeper 2019-08-19 15:13:19 +02:00
parent 41c573b087
commit 30b2f943fd
No known key found for this signature in database
GPG key ID: 86BEF881AE2CF276

View file

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