diff --git a/cura/Settings/ContainerManager.py b/cura/Settings/ContainerManager.py index 216637db21..2b8ff4a234 100644 --- a/cura/Settings/ContainerManager.py +++ b/cura/Settings/ContainerManager.py @@ -46,19 +46,21 @@ class ContainerManager(QObject): self._quality_manager = self._application.getQualityManager() self._container_name_filters = {} # type: Dict[str, Dict[str, Any]] - @pyqtSlot(str, str, str, result=str) - def getContainerMetaDataEntry(self, container_id, entry_name, sub_entry: Optional[str] = None): + @pyqtSlot(str, str, result=str) + def getContainerMetaDataEntry(self, container_id: str, entry_names: str) -> str: metadatas = self._container_registry.findContainersMetadata(id = container_id) if not metadatas: Logger.log("w", "Could not get metadata of container %s because it was not found.", container_id) return "" - sub_data = metadatas[0].get(entry_name, "") - result = str(sub_data) - if sub_entry: - result = str(sub_data.get(sub_entry, "")) - - return result + entries = entry_names.split("/") + result = metadatas[0] + while entries: + entry = entries.pop(0) + result = result.get(entry, {}) + if not result: + return "" + return str(result) ## Set a metadata entry of the specified container. # @@ -73,6 +75,7 @@ class ContainerManager(QObject): # # \return True if successful, False if not. # TODO: This is ONLY used by MaterialView for material containers. Maybe refactor this. + # Update: In order for QML to use objects and sub objects, those (sub) objects must all be QObject. Is that what we want? @pyqtSlot("QVariant", str, str) def setContainerMetaDataEntry(self, container_node, entry_name, entry_value): root_material_id = container_node.metadata["base_file"] @@ -107,63 +110,6 @@ class ContainerManager(QObject): if sub_item_changed: #If it was only a sub-item that has changed then the setMetaDataEntry won't correctly notice that something changed, and we must manually signal that the metadata changed. container.metaDataChanged.emit(container) - ## Set a setting property of the specified container. - # - # This will set the specified property of the specified setting of the container - # and all containers that share the same base_file (if any). The latter only - # happens for material containers. - # - # \param container_id \type{str} The ID of the container to change. - # \param setting_key \type{str} The key of the setting. - # \param property_name \type{str} The name of the property, eg "value". - # \param property_value \type{str} The new value of the property. - # - # \return True if successful, False if not. - @pyqtSlot(str, str, str, str, result = bool) - def setContainerProperty(self, container_id, setting_key, property_name, property_value): - if self._container_registry.isReadOnly(container_id): - Logger.log("w", "Cannot set properties of read-only container %s.", container_id) - return False - - containers = self._container_registry.findContainers(id = container_id) - if not containers: - Logger.log("w", "Could not set properties of container %s because it was not found.", container_id) - return False - - container = containers[0] - - container.setProperty(setting_key, property_name, property_value) - - basefile = container.getMetaDataEntry("base_file", container_id) - for sibbling_container in self._container_registry.findInstanceContainers(base_file = basefile): - if sibbling_container != container: - sibbling_container.setProperty(setting_key, property_name, property_value) - - return True - - ## Get a setting property of the specified container. - # - # This will get the specified property of the specified setting of the - # specified container. - # - # \param container_id The ID of the container to get the setting property - # of. - # \param setting_key The key of the setting to get the property of. - # \param property_name The property to obtain. - # \return The value of the specified property. The type of this property - # value depends on the type of the property. For instance, the "value" - # property of an integer setting will be a Python int, but the "value" - # property of an enum setting will be a Python str. - @pyqtSlot(str, str, str, result = QVariant) - def getContainerProperty(self, container_id: str, setting_key: str, property_name: str): - containers = self._container_registry.findContainers(id = container_id) - if not containers: - Logger.log("w", "Could not get properties of container %s because it was not found.", container_id) - return "" - container = containers[0] - - return container.getProperty(setting_key, property_name) - @pyqtSlot(str, result = str) def makeUniqueName(self, original_name): return self._container_registry.uniqueName(original_name) diff --git a/resources/qml/Preferences/MaterialView.qml b/resources/qml/Preferences/MaterialView.qml index bab0b703d2..528ea448cc 100644 --- a/resources/qml/Preferences/MaterialView.qml +++ b/resources/qml/Preferences/MaterialView.qml @@ -103,7 +103,6 @@ TabView onYes: { - Cura.ContainerManager.setContainerProperty(base.containerId, "material_diameter", "value", new_diameter_value); base.setMetaDataEntry("approximate_diameter", old_approximate_diameter_value, getApproximateDiameter(new_diameter_value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, new_diameter_value); } @@ -230,7 +229,7 @@ TabView { // This does not use a SettingPropertyProvider, because we need to make the change to all containers // which derive from the same base_file - var old_diameter = Cura.ContainerManager.getContainerProperty(base.containerId, "material_diameter", "value").toString(); + var old_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/diameter"); var old_approximate_diameter = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "approximate_diameter"); var new_approximate_diameter = getApproximateDiameter(value); if (new_approximate_diameter != Cura.ExtruderManager.getActiveExtruderStack().approximateMaterialDiameter) @@ -242,7 +241,6 @@ TabView confirmDiameterChangeDialog.open() } else { - Cura.ContainerManager.setContainerProperty(base.containerId, "material_diameter", "value", value); base.setMetaDataEntry("approximate_diameter", old_approximate_diameter, getApproximateDiameter(value).toString()); base.setMetaDataEntry("properties/diameter", properties.diameter, value); } @@ -530,7 +528,7 @@ TabView return materialPreferenceValues[material_guid][entry_name]; } - var material_weight = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties", "weight"); + var material_weight = Cura.ContainerManager.getContainerMetaDataEntry(base.containerId, "properties/weight"); return material_weight || 0; }