Browse Source

Make ExtruderManager into a singleton

This way we don't need to load it in CuraApplication but we can just load it whenever it is first needed. ExtruderManager should be robust against initialising it at any point in Cura's runtime.

Contributes to issues CURA-1278 and CURA-351.
Ghostkeeper 8 years ago
parent
commit
06f7f90bb0
2 changed files with 13 additions and 2 deletions
  1. 0 2
      cura/CuraApplication.py
  2. 13 0
      cura/ExtruderManager.py

+ 0 - 2
cura/CuraApplication.py

@@ -327,8 +327,6 @@ class CuraApplication(QtApplication):
         qmlRegisterSingletonType(MachineManagerModel.MachineManagerModel, "Cura", 1, 0, "MachineManager",
                                  MachineManagerModel.createMachineManagerModel)
 
-        self._extruder_manager = ExtruderManager.ExtruderManager()
-
         self.setMainQml(Resources.getPath(self.ResourceTypes.QmlFiles, "Cura.qml"))
         self._qml_import_paths.append(Resources.getPath(self.ResourceTypes.QmlFiles))
         self.initializeEngine()

+ 13 - 0
cura/ExtruderManager.py

@@ -13,6 +13,9 @@ from UM.Settings.ContainerRegistry import ContainerRegistry #Finding containers
 #   and makes sure that whenever the machine is swapped, this list is kept up to
 #   date. It also contains and updates the setting stacks for the extruders.
 class ExtruderManager:
+    ##  The singleton instance of this manager.
+    __instance = None
+
     ##  Registers listeners and such to listen to changes to the extruders.
     def __init__(self):
         self._extruders = [] #Extruders for the current machine.
@@ -20,6 +23,16 @@ class ExtruderManager:
 
         Application.getInstance().globalContainerStackChanged.connect(self._reconnectExtruderReload) #When the current machine changes, we need to reload all extruders belonging to the new machine.
 
+    ##  Gets an instance of this extruder manager.
+    #
+    #   If an instance was already created, the old instance is returned. This
+    #   implements the singleton pattern.
+    @classmethod
+    def getInstance(cls):
+        if not cls.__instance:
+            cls.__instance = ExtruderManager()
+        return cls.__instance
+
     ##  When the global container stack changes, this reconnects to the new
     #   signal for containers changing.
     def _reconnectExtruderReload(self):