Make QualityNode part of our normal tree structure

It now constructs itself and its contents automatically. No need for a QualityManager to keep it up to date any more.

Contributes to issue CURA-6600.
This commit is contained in:
Ghostkeeper 2019-08-06 16:46:28 +02:00
parent 8ec1c31b58
commit a0d3cb6742
No known key found for this signature in database
GPG Key ID: 86BEF881AE2CF276

View File

@ -1,38 +1,44 @@
# Copyright (c) 2018 Ultimaker B.V. # Copyright (c) 2019 Ultimaker B.V.
# Cura is released under the terms of the LGPLv3 or higher. # Cura is released under the terms of the LGPLv3 or higher.
from typing import Optional, Dict, cast, Any from typing import TYPE_CHECKING
from .ContainerNode import ContainerNode from UM.Settings.ContainerRegistry import ContainerRegistry
from .QualityChangesGroup import QualityChangesGroup from UM.Settings.Interfaces import ContainerInterface
from cura.Machines.ContainerNode import ContainerNode
from cura.Machines.IntentNode import IntentNode
from cura.Machines.MaterialNode import MaterialNode
if TYPE_CHECKING:
from typing import Dict
## Represents a material profile in the container tree.
# #
# QualityNode is used for BOTH quality and quality_changes containers. # Its subcontainers are intent profiles.
#
class QualityNode(ContainerNode): class QualityNode(ContainerNode):
def __init__(self, container_id: str, material: MaterialNode) -> None:
super().__init__(container_id)
self.material = material
self.intents = {} # type: Dict[str, IntentNode]
ContainerRegistry.getInstance().containerAdded.connect(self._intentAdded)
self._loadAll()
def __init__(self, metadata: Optional[Dict[str, Any]] = None) -> None: def _loadAll(self) -> None:
super().__init__(metadata = metadata) container_registry = ContainerRegistry.getInstance()
self.quality_type_map = {} # type: Dict[str, QualityNode] # quality_type -> QualityNode for InstanceContainer # Find all intent profiles that fit the current configuration.
for intent in container_registry.findInstanceContainersMetadata(type = "intent", definition = self.material.variant.machine.quality_definition, variant = self.material.variant.variant_name, material = self.material.base_file):
self.intents[intent["id"]] = IntentNode(intent["id"], quality = self)
def getChildNode(self, child_key: str) -> Optional["QualityNode"]: def _intentAdded(self, container: ContainerInterface) -> None:
return self.children_map.get(child_key) if container.getMetaDataEntry("type") != "intent":
return # Not interested if it's not an intent.
def addQualityMetadata(self, quality_type: str, metadata: Dict[str, Any]): if container.getMetaDataEntry("definition") != self.material.variant.machine.quality_definition:
if quality_type not in self.quality_type_map: return # Incorrect printer.
self.quality_type_map[quality_type] = QualityNode(metadata) if container.getMetaDataEntry("variant") != self.material.variant.variant_name:
return # Incorrect variant.
def getQualityNode(self, quality_type: str) -> Optional["QualityNode"]: if container.getMetaDataEntry("material") != self.material.base_file:
return self.quality_type_map.get(quality_type) return # Incorrect material.
container_id = container.getId()
def addQualityChangesMetadata(self, quality_type: str, metadata: Dict[str, Any]): if container_id in self.intents:
if quality_type not in self.quality_type_map: return # Already have this.
self.quality_type_map[quality_type] = QualityNode() self.intents[container_id] = IntentNode(container_id, quality = self)
quality_type_node = self.quality_type_map[quality_type]
name = metadata["name"]
if name not in quality_type_node.children_map:
quality_type_node.children_map[name] = QualityChangesGroup(name, quality_type)
quality_changes_group = quality_type_node.children_map[name]
cast(QualityChangesGroup, quality_changes_group).addNode(QualityNode(metadata))