Add sidebar views menu item and expose model to QML

This commit is contained in:
ChrisTerBeke 2017-12-04 12:47:08 +01:00
parent 713055e320
commit 4ef39ca313
5 changed files with 37 additions and 8 deletions

View file

@ -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")))

View file

@ -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 {

View file

@ -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]:

View file

@ -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({

View file

@ -12,21 +12,40 @@ Menu
title: catalog.i18nc("@title:menu menubar:toplevel", "&View");
id: menu
enabled: !PrintInformation.preSliced
// main views
Instantiator
{
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; }