Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/Ultimaker/Cura.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCasper Lamboo <c.lamboo@ultimaker.com>2022-08-24 17:07:41 +0300
committerGitHub <noreply@github.com>2022-08-24 17:07:41 +0300
commit197683c6c6eff53d11b6aff56cc4a0d9a767667c (patch)
treecde12e2a82a9813646e9d8d0e6abd02a5d3c5940 /cura/Machines
parent2ffd5b47bb6c1ce5c01dcdd7bdb747e7af834ec9 (diff)
parent04580b8fdc2fc8acaf75f0c8d02c37759cafc631 (diff)
Merge pull request #13102 from Ultimaker/CURA-9514_collapsable_printers_list
[CURA-9514] Collapsable printers list
Diffstat (limited to 'cura/Machines')
-rw-r--r--cura/Machines/Models/MachineListModel.py92
1 files changed, 92 insertions, 0 deletions
diff --git a/cura/Machines/Models/MachineListModel.py b/cura/Machines/Models/MachineListModel.py
new file mode 100644
index 0000000000..f3781cfd60
--- /dev/null
+++ b/cura/Machines/Models/MachineListModel.py
@@ -0,0 +1,92 @@
+# Copyright (c) 2022 Ultimaker B.V.
+# Cura is released under the terms of the LGPLv3 or higher.
+
+from PyQt6.QtCore import Qt, QTimer
+
+from UM.Qt.ListModel import ListModel
+from UM.Settings.ContainerStack import ContainerStack
+from UM.i18n import i18nCatalog
+from UM.Util import parseBool
+
+from cura.Settings.AbstractMachine import AbstractMachine
+from cura.Settings.CuraContainerRegistry import CuraContainerRegistry
+from cura.Settings.GlobalStack import GlobalStack
+
+
+class MachineListModel(ListModel):
+ NameRole = Qt.ItemDataRole.UserRole + 1
+ IdRole = Qt.ItemDataRole.UserRole + 2
+ HasRemoteConnectionRole = Qt.ItemDataRole.UserRole + 3
+ MetaDataRole = Qt.ItemDataRole.UserRole + 4
+ IsOnlineRole = Qt.ItemDataRole.UserRole + 5
+ MachineTypeRole = Qt.ItemDataRole.UserRole + 6
+ MachineCountRole = Qt.ItemDataRole.UserRole + 7
+
+ def __init__(self, parent=None) -> None:
+ super().__init__(parent)
+
+ self._catalog = i18nCatalog("cura")
+
+ self.addRoleName(self.NameRole, "name")
+ self.addRoleName(self.IdRole, "id")
+ self.addRoleName(self.HasRemoteConnectionRole, "hasRemoteConnection")
+ self.addRoleName(self.MetaDataRole, "metadata")
+ self.addRoleName(self.IsOnlineRole, "isOnline")
+ self.addRoleName(self.MachineTypeRole, "machineType")
+ self.addRoleName(self.MachineCountRole, "machineCount")
+
+ self._change_timer = QTimer()
+ self._change_timer.setInterval(200)
+ self._change_timer.setSingleShot(True)
+ self._change_timer.timeout.connect(self._update)
+
+ # Listen to changes
+ CuraContainerRegistry.getInstance().containerAdded.connect(self._onContainerChanged)
+ CuraContainerRegistry.getInstance().containerMetaDataChanged.connect(self._onContainerChanged)
+ CuraContainerRegistry.getInstance().containerRemoved.connect(self._onContainerChanged)
+ self._updateDelayed()
+
+ def _onContainerChanged(self, container) -> None:
+ """Handler for container added/removed events from registry"""
+
+ # We only need to update when the added / removed container GlobalStack
+ if isinstance(container, GlobalStack):
+ self._updateDelayed()
+
+ def _updateDelayed(self) -> None:
+ self._change_timer.start()
+
+ def _update(self) -> None:
+ self.setItems([]) # Clear items
+
+ other_machine_stacks = CuraContainerRegistry.getInstance().findContainerStacks(type="machine")
+
+ abstract_machine_stacks = CuraContainerRegistry.getInstance().findContainerStacks(type = "abstract_machine")
+ abstract_machine_stacks.sort(key = lambda machine: machine.getName(), reverse = True)
+
+ for abstract_machine in abstract_machine_stacks:
+ online_machine_stacks = AbstractMachine.getMachines(abstract_machine, online_only = True)
+
+ # Create a list item for abstract machine
+ self.addItem(abstract_machine, len(online_machine_stacks))
+
+ # Create list of machines that are children of the abstract machine
+ for stack in online_machine_stacks:
+ self.addItem(stack)
+ # Remove this machine from the other stack list
+ other_machine_stacks.remove(stack)
+
+ for stack in other_machine_stacks:
+ self.addItem(stack)
+
+ def addItem(self, container_stack: ContainerStack, machine_count: int = 0) -> None:
+ if parseBool(container_stack.getMetaDataEntry("hidden", False)):
+ return
+
+ self.appendItem({"name": container_stack.getName(),
+ "id": container_stack.getId(),
+ "metadata": container_stack.getMetaData().copy(),
+ "isOnline": parseBool(container_stack.getMetaDataEntry("is_online", False)),
+ "machineType": container_stack.getMetaDataEntry("type"),
+ "machineCount": machine_count,
+ })