diff options
author | Casper Lamboo <c.lamboo@ultimaker.com> | 2022-08-24 17:07:41 +0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2022-08-24 17:07:41 +0300 |
commit | 197683c6c6eff53d11b6aff56cc4a0d9a767667c (patch) | |
tree | cde12e2a82a9813646e9d8d0e6abd02a5d3c5940 /cura/Machines | |
parent | 2ffd5b47bb6c1ce5c01dcdd7bdb747e7af834ec9 (diff) | |
parent | 04580b8fdc2fc8acaf75f0c8d02c37759cafc631 (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.py | 92 |
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, + }) |