diff --git a/cura/Machines/ContainerGroup.py b/cura/Machines/ContainerGroup.py index 5c34f0f123..1061abadda 100644 --- a/cura/Machines/ContainerGroup.py +++ b/cura/Machines/ContainerGroup.py @@ -1,10 +1,13 @@ +from typing import Optional + from PyQt5.Qt import QObject from cura.Machines.ContainerNode import ContainerNode class ContainerGroup(QObject): + def __init__(self, parent = None): super().__init__(parent) - self.node_for_global = None # type: ContainerNode + self.node_for_global = None # type: Optional[ContainerNode] self.nodes_for_extruders = dict() diff --git a/cura/Machines/ContainerNode.py b/cura/Machines/ContainerNode.py index b9ebaa698a..059bccba0d 100644 --- a/cura/Machines/ContainerNode.py +++ b/cura/Machines/ContainerNode.py @@ -3,25 +3,37 @@ from typing import Optional from collections import OrderedDict from UM.Logger import Logger +from UM.Settings.InstanceContainer import InstanceContainer -## A metadata / container combination. Use getContainer to get the container corresponding to the metadata +## +# A metadata / container combination. Use getContainer() to get the container corresponding to the metadata. +# +# ContainerNode is a multi-purpose class. It has two main purposes: +# 1. It encapsulates an InstanceContainer. It contains that InstanceContainer's +# - metadata (Always) +# - container (lazy-loaded when needed) +# 2. It also serves as a node in a hierarchical InstanceContainer lookup table/tree. +# This is used in Variant, Material, and Quality Managers. +# class ContainerNode: - def __init__(self, metadata = None): + __slots__ = ("metadata", "container", "children_map") + + def __init__(self, metadata: Optional[dict] = None): self.metadata = metadata self.container = None self.children_map = OrderedDict() - def getChildNode(self, child_key: str) -> Optional["QualityNode"]: + def getChildNode(self, child_key: str) -> Optional["ContainerNode"]: return self.children_map.get(child_key) def getContainer(self) -> "InstanceContainer": if self.metadata is None: - raise RuntimeError("Cannot get container for a QualityNode without metadata") + raise RuntimeError("Cannot get container for a ContainerNode without metadata") if self.container is None: container_id = self.metadata["id"] - Logger.log("d", "Lazy-loading container [%s]", container_id) + Logger.log("i", "Lazy-loading container [%s]", container_id) from UM.Settings.ContainerRegistry import ContainerRegistry container_list = ContainerRegistry.getInstance().findInstanceContainers(id = container_id) if not container_list: @@ -30,5 +42,5 @@ class ContainerNode: return self.container - def __str__(self): + def __str__(self) -> str: return "ContainerNode[%s]" % self.metadata.get("id")