SidebarViewModel.py 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. # Copyright (c) 2017 Ultimaker B.V.
  2. from PyQt5.QtCore import Qt
  3. from UM.Qt.ListModel import ListModel
  4. from UM.Application import Application
  5. from UM.PluginRegistry import PluginRegistry
  6. ## The SidebarViewModel is the default sidebar view in Cura with all the print settings and print button.
  7. class SidebarViewModel(ListModel):
  8. IdRole = Qt.UserRole + 1
  9. NameRole = Qt.UserRole + 2
  10. ActiveRole = Qt.UserRole + 3
  11. def __init__(self, parent = None):
  12. super().__init__(parent)
  13. # connect views changed signals
  14. self._controller = Application.getInstance().getSidebarController()
  15. self._controller.sidebarViewsChanged.connect(self._onSidebarViewsChanged)
  16. self._controller.activeSidebarViewChanged.connect(self._onSidebarViewsChanged)
  17. # register Qt list roles
  18. self.addRoleName(self.IdRole, "id")
  19. self.addRoleName(self.NameRole, "name")
  20. self.addRoleName(self.ActiveRole, "active")
  21. ## Update the model when new views are added or another view is made the active view.
  22. def _onSidebarViewsChanged(self):
  23. items = []
  24. current_view_id = "default"
  25. sidebar_views = self._controller.getAllSidebarViews()
  26. current_view = self._controller.getActiveSidebarView()
  27. if current_view and hasattr(current_view, "getPluginId"):
  28. current_view_id = current_view.getPluginId()
  29. for sidebar_view_id, sidebar_view in sidebar_views.items():
  30. # Override fields for default settings sidebar
  31. if sidebar_view_id == "default":
  32. items.append({
  33. "id": "default",
  34. "name": "Print settings sidebar",
  35. "active": sidebar_view_id == current_view_id,
  36. "weight": 0
  37. })
  38. continue
  39. sidebar_view_metadata = PluginRegistry.getInstance().getMetaData(sidebar_view_id).get("sidebar_view", {})
  40. # Skip view modes that are marked as not visible
  41. if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]:
  42. continue
  43. name = sidebar_view_metadata.get("name", sidebar_view_id)
  44. weight = sidebar_view_metadata.get("weight", 1)
  45. items.append({
  46. "id": sidebar_view_id,
  47. "name": name,
  48. "active": sidebar_view_id == current_view_id,
  49. "weight": weight
  50. })
  51. # Sort the views by weight
  52. items.sort(key=lambda t: t["weight"])
  53. self.setItems(items)