Cura/cura/Settings/ContainerManager.py
Arjen Hiemstra ff9e4c9bb7 Add some more documentation to ContainerManager
Contributes to CURA-341
2016-07-05 16:44:13 +02:00

88 lines
3.1 KiB
Python

# Copyright (c) 2016 Ultimaker B.V.
# Cura is released under the terms of the AGPLv3 or higher.
from PyQt5.QtCore import QObject, pyqtSlot, pyqtProperty, pyqtSignal
import UM.Settings
from UM.i18n import i18nCatalog
catalog = i18nCatalog("cura")
## Manager class that contains common actions to deal with containers in Cura.
#
# This is primarily intended as a class to be able to perform certain actions
# from within QML. We want to be able to trigger things like removing a container
# when a certain action happens. This can be done through this class.
class ContainerManager(QObject):
def __init__(self, parent = None):
super().__init__(parent)
self._registry = UM.Settings.ContainerRegistry.getInstance()
## Create a duplicate of the specified container
#
# This will create and add a duplicate of the container corresponding
# to the container ID.
#
# \param container_id \type{str} The ID of the container to duplicate.
#
# \return The ID of the new container, or an empty string if duplication failed.
@pyqtSlot(str, result = str)
def duplicateContainer(self, container_id):
containers = self._registry.findInstanceContainers(id = container_id)
if not containers:
return
new_name = self_registry.uniqueName(containers[0].getName())
new_material = containers[0].duplicate(new_name)
self._registry.addContainer(new_material)
@pyqtSlot(str, str)
def renameContainer(self, container_id, new_name):
pass
@pyqtSlot(str)
def removeContainer(self, container_id):
pass
## Set a metadata entry of the specified container.
#
# This will set the specified entry of the container's metadata to the specified
# value. Note that entries containing dictionaries can have their entries changed
# by using "/" as a separator. For example, to change an entry "foo" in a
# dictionary entry "bar", you can specify "bar/foo" as entry name.
#
# \param container_id \type{str} The ID of the container to change.
# \param entry_name \type{str} The name of the metadata entry to change.
# \param entry_value The new value of the entry.
@pyqtSlot(str, str, str)
def setContainerMetaDataEntry(self, container_id, entry_name, entry_value):
containers = UM.Settings.ContainerRegistry.getInstance().findInstanceContainers(id = container_id)
if not containers:
return
container = containers[0]
entries = entry_name.split("/")
entry_name = entries.pop()
if entries:
root_name = entries.pop(0)
root = container.getMetaDataEntry(root_name)
item = root
for entry in entries:
item = item.get(entries.pop(0), { })
item[entry_name] = entry_value
entry_name = root_name
entry_value = root
containers[0].setMetaDataEntry(entry_name, entry_value)
# Factory function, used by QML
@staticmethod
def createContainerManager(engine, js_engine):
return ContainerManager()