From 842015ea10aeba8c60bd08613b6ba6562e362950 Mon Sep 17 00:00:00 2001 From: Arjen Hiemstra Date: Tue, 28 Jun 2016 17:32:50 +0200 Subject: [PATCH] Move all the menus to individual QML files to make it easier to reuse them Contributes to CURA-342 --- resources/qml/Cura.qml | 32 +--- resources/qml/Menus/MaterialMenu.qml | 57 +++++++ resources/qml/Menus/NozzleMenu.qml | 37 +++++ resources/qml/Menus/PrinterMenu.qml | 38 +++++ resources/qml/Menus/ProfileMenu.qml | 86 +++++++++++ resources/qml/Menus/RecentFilesMenu.qml | 37 +++++ resources/qml/Menus/ViewMenu.qml | 29 ++++ resources/qml/SidebarHeader.qml | 190 +----------------------- 8 files changed, 293 insertions(+), 213 deletions(-) create mode 100644 resources/qml/Menus/MaterialMenu.qml create mode 100644 resources/qml/Menus/NozzleMenu.qml create mode 100644 resources/qml/Menus/PrinterMenu.qml create mode 100644 resources/qml/Menus/ProfileMenu.qml create mode 100644 resources/qml/Menus/RecentFilesMenu.qml create mode 100644 resources/qml/Menus/ViewMenu.qml diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index a27c232e5e..c41d80461a 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -10,6 +10,8 @@ import QtQuick.Dialogs 1.1 import UM 1.2 as UM import Cura 1.0 as Cura +import "Menus" + UM.MainWindow { id: base @@ -417,14 +419,9 @@ UM.MainWindow { id: view_panel - //anchors.left: parent.left; - //anchors.right: parent.right; - //anchors.bottom: parent.bottom anchors.top: viewModeButton.bottom anchors.topMargin: UM.Theme.getSize("default_margin").height; anchors.left: viewModeButton.left; - //anchors.bottom: buttons.top; - //anchors.bottomMargin: UM.Theme.getSize("default_margin").height; height: childrenRect.height; @@ -434,7 +431,6 @@ UM.MainWindow Button { id: openFileButton; - //style: UM.Backend.progress < 0 ? UM.Theme.styles.open_file_button : UM.Theme.styles.tool_button; text: catalog.i18nc("@action:button","Open File"); iconSource: UM.Theme.getIcon("load") style: UM.Theme.styles.tool_button @@ -442,9 +438,7 @@ UM.MainWindow anchors { top: parent.top; - //topMargin: UM.Theme.getSize("loadfile_margin").height left: parent.left; - //leftMargin: UM.Theme.getSize("loadfile_margin").width } action: Cura.Actions.open; } @@ -484,27 +478,7 @@ UM.MainWindow style: UM.Theme.styles.tool_button; tooltip: ''; - menu: Menu - { - id: viewMenu; - Instantiator - { - id: viewMenuInstantiator - model: UM.ViewModel { } - MenuItem - { - text: model.name - checkable: true; - checked: model.active - exclusiveGroup: viewMenuGroup; - onTriggered: UM.Controller.setActiveView(model.id); - } - onObjectAdded: viewMenu.insertItem(index, object) - onObjectRemoved: viewMenu.removeItem(object) - } - - ExclusiveGroup { id: viewMenuGroup; } - } + menu: ViewMenu { } } Toolbar diff --git a/resources/qml/Menus/MaterialMenu.qml b/resources/qml/Menus/MaterialMenu.qml new file mode 100644 index 0000000000..4af8246930 --- /dev/null +++ b/resources/qml/Menus/MaterialMenu.qml @@ -0,0 +1,57 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: menu + title: "Material" + + Instantiator + { + model: UM.InstanceContainersModel + { + filter: + { + var result = { "type": "material" } + if(Cura.MachineManager.filterMaterialsByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId + if(Cura.MachineManager.hasVariants) + { + result.variant = Cura.MachineManager.activeVariantId + } + } + else + { + result.definition = "fdmprinter" + } + return result + } + } + MenuItem + { + text: model.name; + checkable: true; + checked: model.id == Cura.MachineManager.activeMaterialId; + exclusiveGroup: group; + onTriggered: + { + Cura.MachineManager.setActiveMaterial(model.id); + } + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + + ExclusiveGroup { id: group } + + MenuSeparator { } + + MenuItem { action: Cura.Actions.manageMaterials } +} diff --git a/resources/qml/Menus/NozzleMenu.qml b/resources/qml/Menus/NozzleMenu.qml new file mode 100644 index 0000000000..506a9a2a01 --- /dev/null +++ b/resources/qml/Menus/NozzleMenu.qml @@ -0,0 +1,37 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: menu + title: "Nozzle" + + Instantiator + { + model: UM.InstanceContainersModel + { + filter: + { + "type": "variant", + "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine + } + } + MenuItem { + text: model.name; + checkable: true; + checked: model.id == Cura.MachineManager.activeVariantId; + exclusiveGroup: group + onTriggered: Cura.MachineManager.setActiveVariant(model.id) + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + + ExclusiveGroup { id: group } +} diff --git a/resources/qml/Menus/PrinterMenu.qml b/resources/qml/Menus/PrinterMenu.qml new file mode 100644 index 0000000000..408e8bd585 --- /dev/null +++ b/resources/qml/Menus/PrinterMenu.qml @@ -0,0 +1,38 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: menu; + + Instantiator + { + model: UM.ContainerStacksModel + { + filter: {"type": "machine"} + } + MenuItem + { + text: model.name; + checkable: true; + checked: Cura.MachineManager.activeMachineId == model.id + exclusiveGroup: group; + onTriggered: Cura.MachineManager.setActiveMachine(model.id); + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + + ExclusiveGroup { id: group; } + + MenuSeparator { } + + MenuItem { action: Cura.Actions.addMachine; } + MenuItem { action: Cura.Actions.configureMachines; } +} diff --git a/resources/qml/Menus/ProfileMenu.qml b/resources/qml/Menus/ProfileMenu.qml new file mode 100644 index 0000000000..213f8c2629 --- /dev/null +++ b/resources/qml/Menus/ProfileMenu.qml @@ -0,0 +1,86 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + + Menu +{ + id: menu + + Instantiator + { + model: UM.InstanceContainersModel { filter: menu.getFilter({ "read_only": true }); } + + MenuItem + { + text: model.name + checkable: true + checked: Cura.MachineManager.activeQualityId == model.id + exclusiveGroup: group + onTriggered: Cura.MachineManager.setActiveQuality(model.id) + } + + onObjectAdded: menu.insertItem(index, object); + onObjectRemoved: menu.removeItem(object); + } + + MenuSeparator { id: customSeparator } + + Instantiator + { + model: UM.InstanceContainersModel + { + id: customProfilesModel; + filter: menu.getFilter({ "read_only": false }); + onRowsInserted: customSeparator.visible = rowCount() > 1 + onRowsRemoved: customSeparator.visible = rowCount() > 1 + onModelReset: customSeparator.visible = rowCount() > 1 + } + + MenuItem + { + text: model.name + checkable: true + checked: Cura.MachineManager.activeQualityId == model.id + exclusiveGroup: group + onTriggered: Cura.MachineManager.setActiveQuality(model.id) + } + + onObjectAdded: menu.insertItem(index, object); + onObjectRemoved: menu.removeItem(object); + } + + ExclusiveGroup { id: group; } + + MenuSeparator { id: profileMenuSeparator } + + MenuItem { action: Cura.Actions.addProfile } + MenuItem { action: Cura.Actions.updateProfile } + MenuItem { action: Cura.Actions.resetProfile } + MenuSeparator { } + MenuItem { action: Cura.Actions.manageProfiles } + + function getFilter(initial_conditions) + { + var result = initial_conditions; + result.type = "quality" + + if(Cura.MachineManager.filterQualityByMachine) + { + result.definition = Cura.MachineManager.activeDefinitionId; + if(Cura.MachineManager.hasMaterials) + { + result.material = Cura.MachineManager.activeMaterialId; + } + } + else + { + result.definition = "fdmprinter" + } + return result + } +} diff --git a/resources/qml/Menus/RecentFilesMenu.qml b/resources/qml/Menus/RecentFilesMenu.qml new file mode 100644 index 0000000000..c47fc5715b --- /dev/null +++ b/resources/qml/Menus/RecentFilesMenu.qml @@ -0,0 +1,37 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + id: menu + title: catalog.i18nc("@title:menu menubar:file", "Open &Recent") + iconName: "document-open-recent"; + + enabled: Printer.recentFiles.length > 0; + + Instantiator + { + model: Printer.recentFiles + MenuItem + { + text: + { + var path = modelData.toString() + return (index + 1) + ". " + path.slice(path.lastIndexOf("/") + 1); + } + onTriggered: { + UM.MeshFileHandler.readLocalFile(modelData); + var meshName = backgroundItem.getMeshName(modelData.toString()) + backgroundItem.hasMesh(decodeURIComponent(meshName)) + } + } + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } +} diff --git a/resources/qml/Menus/ViewMenu.qml b/resources/qml/Menus/ViewMenu.qml new file mode 100644 index 0000000000..74579932e0 --- /dev/null +++ b/resources/qml/Menus/ViewMenu.qml @@ -0,0 +1,29 @@ +// Copyright (c) 2016 Ultimaker B.V. +// Cura is released under the terms of the AGPLv3 or higher. + +import QtQuick 2.2 +import QtQuick.Controls 1.1 + +import UM 1.2 as UM +import Cura 1.0 as Cura + +Menu +{ + title: catalog.i18nc("@title:menu menubar:toplevel", "&View"); + id: menu + Instantiator + { + model: UM.ViewModel { } + MenuItem + { + 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; } +} diff --git a/resources/qml/SidebarHeader.qml b/resources/qml/SidebarHeader.qml index a2304d1d3e..4aad341ee0 100644 --- a/resources/qml/SidebarHeader.qml +++ b/resources/qml/SidebarHeader.qml @@ -8,6 +8,8 @@ import QtQuick.Controls.Styles 1.1 import UM 1.2 as UM import Cura 1.0 as Cura +import "Menus" + Column { id: base; @@ -56,34 +58,7 @@ Column width: parent.width * 0.55 + UM.Theme.getSize("default_margin").width - menu: Menu - { - id: machineSelectionMenu - Instantiator - { - model: UM.ContainerStacksModel - { - filter: {"type": "machine"} - } - MenuItem - { - text: model.name; - checkable: true; - checked: Cura.MachineManager.activeMachineId == model.id - exclusiveGroup: machineSelectionMenuGroup; - onTriggered: Cura.MachineManager.setActiveMachine(model.id); - } - onObjectAdded: machineSelectionMenu.insertItem(index, object) - onObjectRemoved: machineSelectionMenu.removeItem(object) - } - - ExclusiveGroup { id: machineSelectionMenuGroup; } - - MenuSeparator { } - - MenuItem { action: Cura.Actions.addMachine; } - MenuItem { action: Cura.Actions.configureMachines; } - } + menu: PrinterMenu { } } } @@ -235,37 +210,7 @@ Column anchors.left: parent.left style: UM.Theme.styles.sidebar_header_button - menu: Menu - { - id: variantsSelectionMenu - Instantiator - { - id: variantSelectionInstantiator - model: UM.InstanceContainersModel - { - filter: - { - "type": "variant", - "definition": Cura.MachineManager.activeDefinitionId //Only show variants of this machine - } - } - MenuItem - { - text: model.name; - checkable: true; - checked: model.id == Cura.MachineManager.activeVariantId; - exclusiveGroup: variantSelectionMenuGroup; - onTriggered: - { - Cura.MachineManager.setActiveVariant(model.id); - } - } - onObjectAdded: variantsSelectionMenu.insertItem(index, object) - onObjectRemoved: variantsSelectionMenu.removeItem(object) - } - - ExclusiveGroup { id: variantSelectionMenuGroup; } - } + menu: NozzleMenu { } } ToolButton { @@ -280,49 +225,7 @@ Column anchors.right: parent.right style: UM.Theme.styles.sidebar_header_button - menu: Menu - { - id: materialSelectionMenu - Instantiator - { - id: materialSelectionInstantiator - model: UM.InstanceContainersModel - { - filter: - { - var result = { "type": "material" } - if(Cura.MachineManager.filterMaterialsByMachine) - { - result.definition = Cura.MachineManager.activeDefinitionId - if(Cura.MachineManager.hasVariants) - { - result.variant = Cura.MachineManager.activeVariantId - } - } - else - { - result.definition = "fdmprinter" - } - return result - } - } - MenuItem - { - text: model.name; - checkable: true; - checked: model.id == Cura.MachineManager.activeMaterialId; - exclusiveGroup: materialSelectionMenuGroup; - onTriggered: - { - Cura.MachineManager.setActiveMaterial(model.id); - } - } - onObjectAdded: materialSelectionMenu.insertItem(index, object) - onObjectRemoved: materialSelectionMenu.removeItem(object) - } - - ExclusiveGroup { id: materialSelectionMenuGroup; } - } + menu: MaterialMenu { } } } } @@ -359,88 +262,7 @@ Column tooltip: Cura.MachineManager.activeQualityName style: UM.Theme.styles.sidebar_header_button - menu: Menu - { - id: profileSelectionMenu - Instantiator - { - id: profileSelectionInstantiator - model: UM.InstanceContainersModel - { - filter: - { - var result = { "type": "quality" }; - if(Cura.MachineManager.filterQualityByMachine) - { - result.definition = Cura.MachineManager.activeDefinitionId; - if(Cura.MachineManager.hasMaterials) - { - result.material = Cura.MachineManager.activeMaterialId; - } - } - else - { - result.definition = "fdmprinter" - } - return result - } - } - property int separatorIndex: -1 - - Loader { - property QtObject model_data: model - property int model_index: index - sourceComponent: menuItemDelegate - } - onObjectAdded: - { - //Insert a separator between readonly and custom profiles - if(separatorIndex < 0 && index > 0) - { - if(model.getItem(index-1).readOnly != model.getItem(index).readOnly) - { - profileSelectionMenu.insertSeparator(index); - separatorIndex = index; - } - } - //Because of the separator, custom profiles move one index lower - profileSelectionMenu.insertItem((model.getItem(index).readOnly) ? index : index + 1, object.item); - } - onObjectRemoved: - { - //When adding a profile, the menu is rebuilt by removing all items. - //If a separator was added, we need to remove that too. - if(separatorIndex >= 0) - { - profileSelectionMenu.removeItem(profileSelectionMenu.items[separatorIndex]) - separatorIndex = -1; - } - profileSelectionMenu.removeItem(object.item); - } - } - ExclusiveGroup { id: profileSelectionMenuGroup; } - - Component - { - id: menuItemDelegate - MenuItem - { - id: item - text: model_data ? model_data.name : "" - checkable: true - checked: model_data != null ? Cura.MachineManager.activeQualityId == model_data.id : false - exclusiveGroup: profileSelectionMenuGroup; - onTriggered: Cura.MachineManager.setActiveQuality(model_data.id) - } - } - - MenuSeparator { } - MenuItem { action: Cura.Actions.addProfile } - MenuItem { action: Cura.Actions.updateProfile } - MenuItem { action: Cura.Actions.resetProfile } - MenuSeparator { } - MenuItem { action: Cura.Actions.manageProfiles } - } + menu: ProfileMenu { } UM.SimpleButton {