diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7f8fef05ad..a2efa887c0 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -38,6 +38,7 @@ from cura.ShapeArray import ShapeArray from cura.ConvexHullDecorator import ConvexHullDecorator from cura.SetParentOperation import SetParentOperation from cura.Sidebar.SidebarController import SidebarController +from cura.Sidebar.SidebarViewModel import SidebarViewModel from cura.SliceableObjectDecorator import SliceableObjectDecorator from cura.BlockSlicingDecorator import BlockSlicingDecorator @@ -819,6 +820,7 @@ class CuraApplication(QtApplication): qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) qmlRegisterSingletonType(SidebarController, "Cura", 1, 0, "SidebarController", self.getSidebarController) + qmlRegisterType(SidebarViewModel, "Cura", 1, 0, "SidebarViewModel") # As of Qt5.7, it is necessary to get rid of any ".." in the path for the singleton to work. actions_url = QUrl.fromLocalFile(os.path.abspath(Resources.getPath(CuraApplication.ResourceTypes.QmlFiles, "Actions.qml"))) diff --git a/cura/Settings/SettingsSidebarView.py b/cura/Settings/SettingsSidebarView.py index abd3968ca9..648e056044 100644 --- a/cura/Settings/SettingsSidebarView.py +++ b/cura/Settings/SettingsSidebarView.py @@ -9,6 +9,10 @@ class SettingsSidebarView(QObject, SidebarView): def __init__(self): super().__init__() + ## As the default sidebar is not a plugin, we have a get plugin ID method to allow the sidebar view model to get the needed data. + def getPluginId(self): + return "default" + ## As the default sidebar is not a plugin, we have a get meta data method here to allow the sidebar view model to get the needed data. def getMetaData(self): return { diff --git a/cura/Sidebar/SidebarController.py b/cura/Sidebar/SidebarController.py index cb0e4a1e8e..1212091b2d 100644 --- a/cura/Sidebar/SidebarController.py +++ b/cura/Sidebar/SidebarController.py @@ -46,6 +46,7 @@ class SidebarController: ## Change the active sidebar view to one of the registered views. def setActiveSidebarView(self, name: str): print("setting active sidebar view") + self.activeSidebarViewChanged.emit() ## Get all sidebar views registered in this controller. def getAllSidebarViews(self) -> Dict[SidebarView]: diff --git a/cura/Sidebar/SidebarViewModel.py b/cura/Sidebar/SidebarViewModel.py index 638800247d..4ed1ca60cb 100644 --- a/cura/Sidebar/SidebarViewModel.py +++ b/cura/Sidebar/SidebarViewModel.py @@ -13,7 +13,10 @@ class SidebarViewModel(ListModel): def __init__(self, parent = None): super().__init__(parent) + # connect views changed signals self._controller = Application.getInstance().getSidebarController() + self._controller.sidebarViewsChanged.connect(self._onSidebarViewsChanged) + self._controller.activeSidebarViewChanged.connect(self._onSidebarViewsChanged) # register Qt list roles self.addRoleName(self.IdRole, "id") @@ -39,7 +42,7 @@ class SidebarViewModel(ListModel): if "visible" in sidebar_view_metadata and not sidebar_view_metadata["visible"]: continue - name = sidebar_view_metadata.get("name", id) + name = sidebar_view_metadata.get("name", sidebar_view_id) weight = sidebar_view_metadata.get("weight", 0) items.append({ diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml index bb5999edb9..654de3391a 100644 --- a/resources/qml/Menus/ViewMenu.qml +++ b/resources/qml/Menus/ViewMenu.qml @@ -12,21 +12,40 @@ Menu title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); id: menu enabled: !PrintInformation.preSliced + + // main views Instantiator { - model: UM.ViewModel { } + model: UM.ViewModel{} MenuItem { - text: model.name; - checkable: true; - checked: model.active; - exclusiveGroup: group; - onTriggered: UM.Controller.setActiveView(model.id); + text: model.name + checkable: true + checked: model.active + exclusiveGroup: group + onTriggered: UM.Controller.setActiveView(model.id) } onObjectAdded: menu.insertItem(index, object) onObjectRemoved: menu.removeItem(object) } - ExclusiveGroup { id: group; } + ExclusiveGroup { id: group } + + // sidebar views + Instantiator + { + model: Cura.SidebarViewModel{} + MenuItem + { + text: model.name + checkable: true + checked: model.active + exclusiveGroup: sidebarGroup + onTriggered: Cura.SidebarController.setActiveSidebarView(model.id) + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + ExclusiveGroup { id: sidebarGroup } MenuSeparator {} MenuItem { action: Cura.Actions.homeCamera; }