old_contents: # 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")
  
  class ContainerManager(QObject):
      def __init__(self, parent = None):
          super().__init__(parent)
  
          self._registry = UM.Settings.ContainerRegistry.getInstance()
  
      @pyqtSlot(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
  
      @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)
  
      @staticmethod
      def createContainerManager(engine, js_engine):
          return ContainerManager()
  
new_contents: # 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()
  
subject: Add some more documentation to ContainerManager