From 4bb67fbd82e65c24b55efcab550a0e943c68fb86 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 25 Oct 2017 17:04:23 +0200 Subject: [PATCH 01/19] Add setting visibility profile menu button --- resources/qml/Settings/SettingView.qml | 58 +++++++++++++++++++++++++- 1 file changed, 56 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 56fd789564..6fa07124f1 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -102,6 +102,60 @@ Item } } + ToolButton + { + id: settingVisibilityProfileMenu + + width: height + height: UM.Theme.getSize("setting_control").height + anchors + { + top: globalProfileRow.bottom + topMargin: UM.Theme.getSize("sidebar_margin").height + right: parent.right + rightMargin: UM.Theme.getSize("sidebar_margin").width + } + style: ButtonStyle + { + background: Rectangle { + color: + { + if(!control.enabled) + { + return UM.Theme.getColor("setting_control_disabled"); + } + return UM.Theme.getColor("setting_control"); + } + + border.width: UM.Theme.getSize("default_lining").width + border.color: + { + if (!control.enabled) + { + return UM.Theme.getColor("setting_control_disabled_border"); + } + else if (control.hovered) + { + return UM.Theme.getColor("setting_control_border_highlight"); + } + return UM.Theme.getColor("setting_control_border"); + } + UM.RecolorImage { + anchors.verticalCenter: parent.verticalCenter + anchors.horizontalCenter: parent.horizontalCenter + width: UM.Theme.getSize("standard_arrow").width + height: UM.Theme.getSize("standard_arrow").height + sourceSize.width: width + sourceSize.height: width + color: control.enabled ? UM.Theme.getColor("setting_category_text") : UM.Theme.getColor("setting_category_disabled_text") + source: UM.Theme.getIcon("menu") + } + } + label: Label{} + } + menu: Menu {} + } + Rectangle { id: filterContainer @@ -128,8 +182,8 @@ Item topMargin: UM.Theme.getSize("sidebar_margin").height left: parent.left leftMargin: UM.Theme.getSize("sidebar_margin").width - right: parent.right - rightMargin: UM.Theme.getSize("sidebar_margin").width + right: settingVisibilityProfileMenu.left + rightMargin: UM.Theme.getSize("default_margin").width } height: visible ? UM.Theme.getSize("setting_control").height : 0 Behavior on height { NumberAnimation { duration: 100 } } From 078fd074e5597120e1855b2f487bdb8722834d14 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 26 Oct 2017 00:00:07 +0200 Subject: [PATCH 02/19] Add initial menu stub --- .../Menus/SettingVisibilityProfilesMenu.qml | 55 +++++++++++++++++ resources/qml/Settings/SettingView.qml | 61 ++++++++++++++----- 2 files changed, 100 insertions(+), 16 deletions(-) create mode 100644 resources/qml/Menus/SettingVisibilityProfilesMenu.qml diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml new file mode 100644 index 0000000000..e826053a50 --- /dev/null +++ b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml @@ -0,0 +1,55 @@ +// Copyright (c) 2017 Ultimaker B.V. +// Cura is released under the terms of the LGPLv3 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: "Visible Settings" + + property bool showingSearchResults + property bool showingAllSettings + + signal showAllSettings() + signal showSettingVisibilityProfile() + + MenuItem + { + text: catalog.i18nc("@action:inmenu", "Normal Set") + checkable: true + checked: !showingSearchResults && !showingAllSettings + exclusiveGroup: group + onTriggered: showAllSettings() + } + MenuSeparator {} + MenuItem + { + text: catalog.i18nc("@action:inmenu", "Search Results") + checkable: true + visible: showingSearchResults + checked: showingSearchResults + exclusiveGroup: group + } + MenuItem + { + text: catalog.i18nc("@action:inmenu", "All Settings") + checkable: true + checked: showingAllSettings + exclusiveGroup: group + onTriggered: showAllSettings() + } + MenuSeparator {} + MenuItem + { + text: catalog.i18nc("@action:inmenu", "Manage Visibility Profiles...") + iconName: "configure" + onTriggered: Cura.Actions.configureSettingVisibility.trigger() + } + + ExclusiveGroup { id: group } +} diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6fa07124f1..0f7cc3f855 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -15,10 +15,11 @@ Item { id: base; - property Action configureSettings; - property bool findingSettings; - signal showTooltip(Item item, point location, string text); - signal hideTooltip(); + property Action configureSettings + property bool findingSettings + property bool showingAllSettings + signal showTooltip(Item item, point location, string text) + signal hideTooltip() Item { @@ -153,7 +154,26 @@ Item } label: Label{} } - menu: Menu {} + menu: SettingVisibilityProfilesMenu + { + showingSearchResults: findingSettings + showingAllSettings: showingAllSettings + + onShowAllSettings: + { + base.showingAllSettings = true; + base.findingSettings = false; + filter.text = ""; + filter.updateDefinitionModel(); + } + onShowSettingVisibilityProfile: + { + base.showingAllSettings = false; + base.findingSettings = false; + filter.text = ""; + filter.updateDefinitionModel(); + } + } } Rectangle @@ -217,17 +237,9 @@ Item { if(findingSettings) { - expandedCategories = definitionsModel.expanded.slice(); - definitionsModel.expanded = ["*"]; - definitionsModel.showAncestors = true; - definitionsModel.showAll = true; - } - else - { - definitionsModel.expanded = expandedCategories; - definitionsModel.showAncestors = false; - definitionsModel.showAll = false; + showingAllSettings = false; } + updateDefinitionModel(); lastFindingSettings = findingSettings; } } @@ -236,6 +248,23 @@ Item { filter.text = ""; } + + function updateDefinitionModel() + { + if(findingSettings || base.showingAllSettings) + { + expandedCategories = definitionsModel.expanded.slice(); + definitionsModel.expanded = ["*"]; + definitionsModel.showAncestors = true; + definitionsModel.showAll = true; + } + else + { + definitionsModel.expanded = expandedCategories; + definitionsModel.showAncestors = false; + definitionsModel.showAll = false; + } + } } MouseArea @@ -258,7 +287,7 @@ Item anchors.verticalCenter: parent.verticalCenter anchors.right: parent.right - anchors.rightMargin: UM.Theme.getSize("sidebar_margin").width + anchors.rightMargin: UM.Theme.getSize("default_margin").width color: UM.Theme.getColor("setting_control_button") hoverColor: UM.Theme.getColor("setting_control_button_hover") From c9ad5eaedb1fd1ac54d5aeac797ab6f5da6bf5f7 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 26 Oct 2017 00:00:39 +0200 Subject: [PATCH 03/19] Add menu icon --- resources/themes/cura-light/icons/menu.svg | 3 +++ 1 file changed, 3 insertions(+) create mode 100644 resources/themes/cura-light/icons/menu.svg diff --git a/resources/themes/cura-light/icons/menu.svg b/resources/themes/cura-light/icons/menu.svg new file mode 100644 index 0000000000..85fbfb072c --- /dev/null +++ b/resources/themes/cura-light/icons/menu.svg @@ -0,0 +1,3 @@ + + + From 5638ebe8cf15e6c7e228bc304a50cd6b978d21b9 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 26 Oct 2017 11:05:59 +0200 Subject: [PATCH 04/19] Tweak appearance of the menu button --- resources/qml/Settings/SettingView.qml | 26 ++------------------------ 1 file changed, 2 insertions(+), 24 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 0f7cc3f855..7c44f01c3c 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -118,29 +118,7 @@ Item } style: ButtonStyle { - background: Rectangle { - color: - { - if(!control.enabled) - { - return UM.Theme.getColor("setting_control_disabled"); - } - return UM.Theme.getColor("setting_control"); - } - - border.width: UM.Theme.getSize("default_lining").width - border.color: - { - if (!control.enabled) - { - return UM.Theme.getColor("setting_control_disabled_border"); - } - else if (control.hovered) - { - return UM.Theme.getColor("setting_control_border_highlight"); - } - return UM.Theme.getColor("setting_control_border"); - } + background: Item { UM.RecolorImage { anchors.verticalCenter: parent.verticalCenter anchors.horizontalCenter: parent.horizontalCenter @@ -203,7 +181,7 @@ Item left: parent.left leftMargin: UM.Theme.getSize("sidebar_margin").width right: settingVisibilityProfileMenu.left - rightMargin: UM.Theme.getSize("default_margin").width + rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) } height: visible ? UM.Theme.getSize("setting_control").height : 0 Behavior on height { NumberAnimation { duration: 100 } } From 503c612509346d5a215953255d9230c1e2dc9288 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Jan 2018 11:21:44 +0100 Subject: [PATCH 05/19] Add (non-functional) items for changed settings (user-changes) and current profile settings --- .../Menus/SettingVisibilityProfilesMenu.qml | 24 ++++++++++++++++--- 1 file changed, 21 insertions(+), 3 deletions(-) diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml index e826053a50..513930a3ce 100644 --- a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml +++ b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml @@ -18,6 +18,15 @@ Menu signal showAllSettings() signal showSettingVisibilityProfile() + MenuItem + { + text: catalog.i18nc("@action:inmenu", "Search Results") + checkable: true + visible: showingSearchResults + checked: showingSearchResults + exclusiveGroup: group + } + MenuSeparator { visible: showingSearchResults } MenuItem { text: catalog.i18nc("@action:inmenu", "Normal Set") @@ -29,13 +38,22 @@ Menu MenuSeparator {} MenuItem { - text: catalog.i18nc("@action:inmenu", "Search Results") + text: catalog.i18nc("@action:inmenu", "Changed settings") checkable: true - visible: showingSearchResults - checked: showingSearchResults + checked: showingAllSettings exclusiveGroup: group + onTriggered: showAllSettings() } MenuItem + { + text: catalog.i18nc("@action:inmenu", "Settings in profile") + checkable: true + checked: showingAllSettings + exclusiveGroup: group + onTriggered: showAllSettings() + } + MenuSeparator {} + MenuItem { text: catalog.i18nc("@action:inmenu", "All Settings") checkable: true From 9730c25ec6fc1056277136fb99a502e52f7ea961 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 4 Jan 2018 14:29:40 +0100 Subject: [PATCH 06/19] Fix showing the normal set --- resources/qml/Menus/SettingVisibilityProfilesMenu.qml | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml index 513930a3ce..019d56be16 100644 --- a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml +++ b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml @@ -33,12 +33,13 @@ Menu checkable: true checked: !showingSearchResults && !showingAllSettings exclusiveGroup: group - onTriggered: showAllSettings() + onTriggered: showSettingVisibilityProfile() } MenuSeparator {} MenuItem { text: catalog.i18nc("@action:inmenu", "Changed settings") + enabled: false checkable: true checked: showingAllSettings exclusiveGroup: group @@ -47,6 +48,7 @@ Menu MenuItem { text: catalog.i18nc("@action:inmenu", "Settings in profile") + enabled: false checkable: true checked: showingAllSettings exclusiveGroup: group From 872efd16b238e17d546db25b6f6fc308b5bc3762 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 8 Feb 2018 17:13:59 +0100 Subject: [PATCH 07/19] Fix selecting presets from menu Switching back to Custom is not yet implemented, and the menu selection does not yet change if the preset is changed in the preferences --- .../Menus/SettingVisibilityProfilesMenu.qml | 52 ++++++++++++++++--- resources/qml/Settings/SettingView.qml | 9 +++- 2 files changed, 53 insertions(+), 8 deletions(-) diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml index 019d56be16..b71520a2ca 100644 --- a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml +++ b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml @@ -16,7 +16,7 @@ Menu property bool showingAllSettings signal showAllSettings() - signal showSettingVisibilityProfile() + signal showSettingVisibilityProfile(string profileName) MenuItem { @@ -27,19 +27,56 @@ Menu exclusiveGroup: group } MenuSeparator { visible: showingSearchResults } + MenuItem { - text: catalog.i18nc("@action:inmenu", "Normal Set") + text: catalog.i18nc("@action:inmenu", "Custom selection") checkable: true checked: !showingSearchResults && !showingAllSettings exclusiveGroup: group - onTriggered: showSettingVisibilityProfile() + onTriggered: showSettingVisibilityProfile("Custom") } - MenuSeparator {} + MenuSeparator { } + + Instantiator + { + model: ListModel + { + id: presetNamesList + Component.onCompleted: + { + // returned value is Dictionary (Ex: {1:"Basic"}, The number 1 is the weight and sort by weight) + var itemsDict = UM.Preferences.getValue("general/visible_settings_preset") + var sorted = []; + for(var key in itemsDict) { + sorted[sorted.length] = key; + } + sorted.sort(); + for(var i = 0; i < sorted.length; i++) { + presetNamesList.append({text: itemsDict[sorted[i]], value: i}); + } + } + } + + MenuItem + { + text: model.text + checkable: true + checked: false + exclusiveGroup: group + onTriggered: showSettingVisibilityProfile(model.text) + } + + onObjectAdded: menu.insertItem(index, object) + onObjectRemoved: menu.removeItem(object) + } + + MenuSeparator { visible: false } MenuItem { text: catalog.i18nc("@action:inmenu", "Changed settings") - enabled: false + visible: false + enabled: true checkable: true checked: showingAllSettings exclusiveGroup: group @@ -48,7 +85,8 @@ Menu MenuItem { text: catalog.i18nc("@action:inmenu", "Settings in profile") - enabled: false + visible: false + enabled: true checkable: true checked: showingAllSettings exclusiveGroup: group @@ -66,7 +104,7 @@ Menu MenuSeparator {} MenuItem { - text: catalog.i18nc("@action:inmenu", "Manage Visibility Profiles...") + text: catalog.i18nc("@action:inmenu", "Manage Setting Visibility...") iconName: "configure" onTriggered: Cura.Actions.configureSettingVisibility.trigger() } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 78b29d4d5c..f3a4e92d96 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -151,6 +151,10 @@ Item } onShowSettingVisibilityProfile: { + var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(profileName) + UM.Preferences.setValue("general/visible_settings", newVisibleSettings) + UM.Preferences.setValue("general/preset_setting_visibility_choice", profileName) + base.showingAllSettings = false; base.findingSettings = false; filter.text = ""; @@ -243,7 +247,10 @@ Item } else { - definitionsModel.expanded = expandedCategories; + if(expandedCategories) + { + definitionsModel.expanded = expandedCategories; + } definitionsModel.showAncestors = false; definitionsModel.showAll = false; } From 080979caeb50155b2536e1d43e07527408f19351 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 8 Feb 2018 22:57:05 +0100 Subject: [PATCH 08/19] Move setting visibility presets into a model Handling of "Custom" is still under consideration --- cura/CuraApplication.py | 105 ++---------------- .../SettingVisibilityProfilesModel.py | 90 +++++++++++++++ .../Menus/SettingVisibilityProfilesMenu.qml | 32 ++---- .../qml/Preferences/SettingVisibilityPage.qml | 73 +++--------- resources/qml/Settings/SettingView.qml | 4 - 5 files changed, 127 insertions(+), 177 deletions(-) create mode 100644 cura/Settings/SettingVisibilityProfilesModel.py diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 4ff39b84a4..7afea3de13 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -57,6 +57,7 @@ from cura.Settings.QualityAndUserProfilesModel import QualityAndUserProfilesMode from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager +from cura.Settings.SettingVisibilityProfilesModel import SettingVisibilityProfilesModel from . import PlatformPhysics @@ -78,6 +79,7 @@ from cura.Settings.ContainerSettingsModel import ContainerSettingsModel from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler from cura.Settings.QualitySettingsModel import QualitySettingsModel from cura.Settings.ContainerManager import ContainerManager +from cura.Settings.SettingVisibilityProfilesModel import SettingVisibilityProfilesModel from cura.ObjectsModel import ObjectsModel from cura.BuildPlateModel import BuildPlateModel @@ -356,19 +358,14 @@ class CuraApplication(QtApplication): preferences.setDefault("local_file/last_used_type", "text/x-gcode") - setting_visibily_preset_names = self.getVisibilitySettingPresetTypes() - preferences.setDefault("general/visible_settings_preset", setting_visibily_preset_names) + default_visibility_profile = SettingVisibilityProfilesModel.getInstance().getItem(0) + + preferences.setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) + preferences.setDefault("general/preset_setting_visibility_choice", default_visibility_profile["id"]) preset_setting_visibility_choice = Preferences.getInstance().getValue("general/preset_setting_visibility_choice") - - default_preset_visibility_group_name = "Basic" - if preset_setting_visibility_choice == "" or preset_setting_visibility_choice is None: - if preset_setting_visibility_choice not in setting_visibily_preset_names: - preset_setting_visibility_choice = default_preset_visibility_group_name - - visible_settings = self.getVisibilitySettingPreset(settings_preset_name = preset_setting_visibility_choice) - preferences.setDefault("general/visible_settings", visible_settings) - preferences.setDefault("general/preset_setting_visibility_choice", preset_setting_visibility_choice) + if not SettingVisibilityProfilesModel.getInstance().find("id", preset_setting_visibility_choice): + Preferences.getInstance().setValue("general/preset_setting_visibility_choice", default_visibility_profile["id"]) self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) @@ -382,91 +379,6 @@ class CuraApplication(QtApplication): CuraApplication.Created = True - @pyqtSlot(str, result = str) - def getVisibilitySettingPreset(self, settings_preset_name) -> str: - result = self._loadPresetSettingVisibilityGroup(settings_preset_name) - formatted_preset_settings = self._serializePresetSettingVisibilityData(result) - - return formatted_preset_settings - - ## Serialise the given preset setting visibitlity group dictionary into a string which is concatenated by ";" - # - def _serializePresetSettingVisibilityData(self, settings_data: dict) -> str: - result_string = "" - - for key in settings_data: - result_string += key + ";" - for value in settings_data[key]: - result_string += value + ";" - - return result_string - - ## Load the preset setting visibility group with the given name - # - def _loadPresetSettingVisibilityGroup(self, visibility_preset_name) -> Dict[str, str]: - preset_dir = Resources.getPath(Resources.PresetSettingVisibilityGroups) - - result = {} - right_preset_found = False - - for item in os.listdir(preset_dir): - file_path = os.path.join(preset_dir, item) - if not os.path.isfile(file_path): - continue - - parser = ConfigParser(allow_no_value = True) # accept options without any value, - - try: - parser.read([file_path]) - - if not parser.has_option("general", "name"): - continue - - if parser["general"]["name"] == visibility_preset_name: - right_preset_found = True - for section in parser.sections(): - if section == 'general': - continue - else: - section_settings = [] - for option in parser[section].keys(): - section_settings.append(option) - - result[section] = section_settings - - if right_preset_found: - break - - except Exception as e: - Logger.log("e", "Failed to load setting visibility preset %s: %s", file_path, str(e)) - - return result - - ## Check visibility setting preset folder and returns available types - # - def getVisibilitySettingPresetTypes(self): - preset_dir = Resources.getPath(Resources.PresetSettingVisibilityGroups) - result = {} - - for item in os.listdir(preset_dir): - file_path = os.path.join(preset_dir, item) - if not os.path.isfile(file_path): - continue - - parser = ConfigParser(allow_no_value=True) # accept options without any value, - - try: - parser.read([file_path]) - - if not parser.has_option("general", "name") and not parser.has_option("general", "weight"): - continue - - result[parser["general"]["weight"]] = parser["general"]["name"] - - except Exception as e: - Logger.log("e", "Failed to load setting preset %s: %s", file_path, str(e)) - - return result def _onEngineCreated(self): self._engine.addImageProvider("camera", CameraImageProvider.CameraImageProvider()) @@ -904,6 +816,7 @@ class CuraApplication(QtApplication): qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) + qmlRegisterSingletonType(SettingVisibilityProfilesModel, "Cura", 1, 0, "SettingVisibilityProfilesModel", SettingVisibilityProfilesModel.createSettingVisibilityProfilesModel) # 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/SettingVisibilityProfilesModel.py b/cura/Settings/SettingVisibilityProfilesModel.py new file mode 100644 index 0000000000..2bc5f2f382 --- /dev/null +++ b/cura/Settings/SettingVisibilityProfilesModel.py @@ -0,0 +1,90 @@ +# Copyright (c) 2016 Ultimaker B.V. +# Cura is released under the terms of the LGPLv3 or higher. + +import os +import urllib +from configparser import ConfigParser + +from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl + +from UM.Logger import Logger +from UM.Qt.ListModel import ListModel + +from UM.Resources import Resources +from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError + +class SettingVisibilityProfilesModel(ListModel): + IdRole = Qt.UserRole + 1 + NameRole = Qt.UserRole + 2 + SettingsRole = Qt.UserRole + 4 + + def __init__(self, parent = None): + super().__init__(parent) + self.addRoleName(self.IdRole, "id") + self.addRoleName(self.NameRole, "name") + self.addRoleName(self.SettingsRole, "settings") + + self._container_ids = [] + self._containers = [] + + self._populate() + + def _populate(self): + items = [] + for item in Resources.getAllResourcesOfType(Resources.PresetSettingVisibilityGroups): + try: + mime_type = MimeTypeDatabase.getMimeTypeForFile(item) + except MimeTypeNotFoundError: + Logger.log("e", "Could not determine mime type of file %s", item) + continue + + id = urllib.parse.unquote_plus(mime_type.stripExtension(os.path.basename(item))) + + if not os.path.isfile(item): + continue + + parser = ConfigParser(allow_no_value=True) # accept options without any value, + + try: + parser.read([item]) + + if not parser.has_option("general", "name") and not parser.has_option("general", "weight"): + continue + + settings = [] + for section in parser.sections(): + if section == 'general': + continue + + settings.append(section) + for option in parser[section].keys(): + settings.append(option) + + items.append({ + "id": id, + "name": parser["general"]["name"], + "weight": parser["general"]["weight"], + "settings": settings + }) + + except Exception as e: + Logger.log("e", "Failed to load setting preset %s: %s", file_path, str(e)) + + + items.sort(key = lambda k: (k["weight"], k["id"])) + self.setItems(items) + + # Factory function, used by QML + @staticmethod + def createSettingVisibilityProfilesModel(engine, js_engine): + return SettingVisibilityProfilesModel.getInstance() + + ## Get the singleton instance for this class. + @classmethod + def getInstance(cls) -> "SettingVisibilityProfilesModel": + # Note: Explicit use of class name to prevent issues with inheritance. + if not SettingVisibilityProfilesModel.__instance: + SettingVisibilityProfilesModel.__instance = cls() + return SettingVisibilityProfilesModel.__instance + + __instance = None # type: "SettingVisibilityProfilesModel" \ No newline at end of file diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml index b71520a2ca..764f07ed41 100644 --- a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml +++ b/resources/qml/Menus/SettingVisibilityProfilesMenu.qml @@ -10,13 +10,13 @@ import Cura 1.0 as Cura Menu { id: menu - title: "Visible Settings" + title: catalog.i18nc("@action:inmenu", "Visible Settings") property bool showingSearchResults property bool showingAllSettings signal showAllSettings() - signal showSettingVisibilityProfile(string profileName) + signal showSettingVisibilityProfile() MenuItem { @@ -40,31 +40,21 @@ Menu Instantiator { - model: ListModel - { - id: presetNamesList - Component.onCompleted: - { - // returned value is Dictionary (Ex: {1:"Basic"}, The number 1 is the weight and sort by weight) - var itemsDict = UM.Preferences.getValue("general/visible_settings_preset") - var sorted = []; - for(var key in itemsDict) { - sorted[sorted.length] = key; - } - sorted.sort(); - for(var i = 0; i < sorted.length; i++) { - presetNamesList.append({text: itemsDict[sorted[i]], value: i}); - } - } - } + model: Cura.SettingVisibilityProfilesModel MenuItem { - text: model.text + text: model.name checkable: true checked: false exclusiveGroup: group - onTriggered: showSettingVisibilityProfile(model.text) + onTriggered: + { + UM.Preferences.setValue("general/visible_settings", model.settings.join(";")); + UM.Preferences.setValue("general/preset_setting_visibility_choice", model.id); + + showSettingVisibilityProfile(); + } } onObjectAdded: menu.insertItem(index, object) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 0e3069d194..3d94fca6c4 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -26,8 +26,8 @@ UM.PreferencesPage UM.Preferences.resetPreference("general/visible_settings") // After calling this function update Setting visibility preset combobox. - // Reset should set "Basic" setting preset - visibilityPreset.setBasicPreset() + // Reset should set default setting preset ("Basic") + visibilityPreset.setDefaultPreset() } resetEnabled: true; @@ -84,7 +84,7 @@ UM.PreferencesPage if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) { visibilityPreset.currentIndex = visibilityPreset.model.count - 1 - UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.get(visibilityPreset.currentIndex).text) + UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.getItem(visibilityPreset.currentIndex).id) } } } @@ -110,83 +110,44 @@ UM.PreferencesPage ComboBox { - property int customOptionValue: 100 - - function setBasicPreset() + function setDefaultPreset() { - var index = 0 - for(var i = 0; i < presetNamesList.count; ++i) - { - if(model.get(i).text == "Basic") - { - index = i; - break; - } - } - - visibilityPreset.currentIndex = index + visibilityPreset.currentIndex = 0 } id: visibilityPreset - width: 150 + width: 150 * screenScaleFactor anchors { top: parent.top right: parent.right } - model: ListModel - { - id: presetNamesList - Component.onCompleted: - { - // returned value is Dictionary (Ex: {1:"Basic"}, The number 1 is the weight and sort by weight) - var itemsDict = UM.Preferences.getValue("general/visible_settings_preset") - var sorted = []; - for(var key in itemsDict) { - sorted[sorted.length] = key; - } - - sorted.sort(); - for(var i = 0; i < sorted.length; i++) { - presetNamesList.append({text: itemsDict[sorted[i]], value: i}); - } - - // By agreement lets "Custom" option will have value 100 - presetNamesList.append({text: "Custom", value: visibilityPreset.customOptionValue}); - } - } + model: Cura.SettingVisibilityProfilesModel + textRole: "name" currentIndex: { // Load previously selected preset. - var text = UM.Preferences.getValue("general/preset_setting_visibility_choice"); - - - - var index = 0; - for(var i = 0; i < presetNamesList.count; ++i) + var index = model.find("id", UM.Preferences.getValue("general/preset_setting_visibility_choice")); + if(index == -1) { - if(model.get(i).text == text) - { - index = i; - break; - } + index = 0; } + return index; } onActivated: { // TODO What to do if user is selected "Custom from Combobox" ? - if (model.get(index).text == "Custom"){ - UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).text) + if (model.getItem(index).id == "custom"){ + UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).id) return } - var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(model.get(index).text) - UM.Preferences.setValue("general/visible_settings", newVisibleSettings) - UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).text) + UM.Preferences.setValue("general/visible_settings", model.getItem(index).settings.join(";")) + UM.Preferences.setValue("general/preset_setting_visibility_choice", model.getItem(index).id) } } @@ -268,7 +229,7 @@ UM.PreferencesPage if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) { visibilityPreset.currentIndex = visibilityPreset.model.count - 1 - UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.get(visibilityPreset.currentIndex).text) + UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.getItem(visibilityPreset.currentIndex).id) } } } diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index f3a4e92d96..6eb37981be 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -151,10 +151,6 @@ Item } onShowSettingVisibilityProfile: { - var newVisibleSettings = CuraApplication.getVisibilitySettingPreset(profileName) - UM.Preferences.setValue("general/visible_settings", newVisibleSettings) - UM.Preferences.setValue("general/preset_setting_visibility_choice", profileName) - base.showingAllSettings = false; base.findingSettings = false; filter.text = ""; From f79e787f2c959c12d0253ce4a5de4a24f519d323 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Thu, 8 Feb 2018 23:19:12 +0100 Subject: [PATCH 09/19] Refactor SettingVisibilityProfiles to SettingVisibilityPresets This is closer to the current Cura intend --- cura/CuraApplication.py | 10 +++++----- ...del.py => SettingVisibilityPresetsModel.py} | 18 +++++++++--------- ...nu.qml => SettingVisibilityPresetsMenu.qml} | 2 +- .../qml/Preferences/SettingVisibilityPage.qml | 2 +- resources/qml/Settings/SettingView.qml | 6 +++--- 5 files changed, 19 insertions(+), 19 deletions(-) rename cura/Settings/{SettingVisibilityProfilesModel.py => SettingVisibilityPresetsModel.py} (83%) rename resources/qml/Menus/{SettingVisibilityProfilesMenu.qml => SettingVisibilityPresetsMenu.qml} (98%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 7afea3de13..19a5b50e65 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -57,7 +57,7 @@ from cura.Settings.QualityAndUserProfilesModel import QualityAndUserProfilesMode from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.UserProfilesModel import UserProfilesModel from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager -from cura.Settings.SettingVisibilityProfilesModel import SettingVisibilityProfilesModel +from cura.Settings.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel from . import PlatformPhysics @@ -79,7 +79,7 @@ from cura.Settings.ContainerSettingsModel import ContainerSettingsModel from cura.Settings.MaterialSettingsVisibilityHandler import MaterialSettingsVisibilityHandler from cura.Settings.QualitySettingsModel import QualitySettingsModel from cura.Settings.ContainerManager import ContainerManager -from cura.Settings.SettingVisibilityProfilesModel import SettingVisibilityProfilesModel +from cura.Settings.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel from cura.ObjectsModel import ObjectsModel from cura.BuildPlateModel import BuildPlateModel @@ -358,13 +358,13 @@ class CuraApplication(QtApplication): preferences.setDefault("local_file/last_used_type", "text/x-gcode") - default_visibility_profile = SettingVisibilityProfilesModel.getInstance().getItem(0) + default_visibility_profile = SettingVisibilityPresetsModel.getInstance().getItem(0) preferences.setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) preferences.setDefault("general/preset_setting_visibility_choice", default_visibility_profile["id"]) preset_setting_visibility_choice = Preferences.getInstance().getValue("general/preset_setting_visibility_choice") - if not SettingVisibilityProfilesModel.getInstance().find("id", preset_setting_visibility_choice): + if not SettingVisibilityPresetsModel.getInstance().find("id", preset_setting_visibility_choice): Preferences.getInstance().setValue("general/preset_setting_visibility_choice", default_visibility_profile["id"]) self.applicationShuttingDown.connect(self.saveSettings) @@ -816,7 +816,7 @@ class CuraApplication(QtApplication): qmlRegisterType(MachineNameValidator, "Cura", 1, 0, "MachineNameValidator") qmlRegisterType(UserChangesModel, "Cura", 1, 1, "UserChangesModel") qmlRegisterSingletonType(ContainerManager, "Cura", 1, 0, "ContainerManager", ContainerManager.createContainerManager) - qmlRegisterSingletonType(SettingVisibilityProfilesModel, "Cura", 1, 0, "SettingVisibilityProfilesModel", SettingVisibilityProfilesModel.createSettingVisibilityProfilesModel) + qmlRegisterSingletonType(SettingVisibilityPresetsModel, "Cura", 1, 0, "SettingVisibilityPresetsModel", SettingVisibilityPresetsModel.createSettingVisibilityPresetsModel) # 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/SettingVisibilityProfilesModel.py b/cura/Settings/SettingVisibilityPresetsModel.py similarity index 83% rename from cura/Settings/SettingVisibilityProfilesModel.py rename to cura/Settings/SettingVisibilityPresetsModel.py index 2bc5f2f382..a5b4541ee4 100644 --- a/cura/Settings/SettingVisibilityProfilesModel.py +++ b/cura/Settings/SettingVisibilityPresetsModel.py @@ -13,7 +13,7 @@ from UM.Qt.ListModel import ListModel from UM.Resources import Resources from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError -class SettingVisibilityProfilesModel(ListModel): +class SettingVisibilityPresetsModel(ListModel): IdRole = Qt.UserRole + 1 NameRole = Qt.UserRole + 2 SettingsRole = Qt.UserRole + 4 @@ -31,7 +31,7 @@ class SettingVisibilityProfilesModel(ListModel): def _populate(self): items = [] - for item in Resources.getAllResourcesOfType(Resources.PresetSettingVisibilityGroups): + for item in Resources.getAllResourcesOfType(Resources.PresetSettingVisibilityPresets): try: mime_type = MimeTypeDatabase.getMimeTypeForFile(item) except MimeTypeNotFoundError: @@ -76,15 +76,15 @@ class SettingVisibilityProfilesModel(ListModel): # Factory function, used by QML @staticmethod - def createSettingVisibilityProfilesModel(engine, js_engine): - return SettingVisibilityProfilesModel.getInstance() + def createSettingVisibilityPresetsModel(engine, js_engine): + return SettingVisibilityPresetsModel.getInstance() ## Get the singleton instance for this class. @classmethod - def getInstance(cls) -> "SettingVisibilityProfilesModel": + def getInstance(cls) -> "SettingVisibilityPresetsModel": # Note: Explicit use of class name to prevent issues with inheritance. - if not SettingVisibilityProfilesModel.__instance: - SettingVisibilityProfilesModel.__instance = cls() - return SettingVisibilityProfilesModel.__instance + if not SettingVisibilityPresetsModel.__instance: + SettingVisibilityPresetsModel.__instance = cls() + return SettingVisibilityPresetsModel.__instance - __instance = None # type: "SettingVisibilityProfilesModel" \ No newline at end of file + __instance = None # type: "SettingVisibilityPresetsModel" \ No newline at end of file diff --git a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml similarity index 98% rename from resources/qml/Menus/SettingVisibilityProfilesMenu.qml rename to resources/qml/Menus/SettingVisibilityPresetsMenu.qml index 764f07ed41..6fcadeac2c 100644 --- a/resources/qml/Menus/SettingVisibilityProfilesMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -40,7 +40,7 @@ Menu Instantiator { - model: Cura.SettingVisibilityProfilesModel + model: Cura.SettingVisibilityPresetsModel MenuItem { diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 3d94fca6c4..64c997e5f7 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -123,7 +123,7 @@ UM.PreferencesPage right: parent.right } - model: Cura.SettingVisibilityProfilesModel + model: Cura.SettingVisibilityPresetsModel textRole: "name" currentIndex: diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 6eb37981be..e2e99fbc3d 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -110,7 +110,7 @@ Item ToolButton { - id: settingVisibilityProfileMenu + id: settingVisibilityMenu width: height height: UM.Theme.getSize("setting_control").height @@ -137,7 +137,7 @@ Item } label: Label{} } - menu: SettingVisibilityProfilesMenu + menu: SettingVisibilityPresetsMenu { showingSearchResults: findingSettings showingAllSettings: showingAllSettings @@ -185,7 +185,7 @@ Item topMargin: UM.Theme.getSize("sidebar_margin").height left: parent.left leftMargin: UM.Theme.getSize("sidebar_margin").width - right: settingVisibilityProfileMenu.left + right: settingVisibilityMenu.left rightMargin: Math.floor(UM.Theme.getSize("default_margin").width / 2) } height: visible ? UM.Theme.getSize("setting_control").height : 0 From 4c1002bf47f9ae901a3ecae59c34391b4cb8158b Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Feb 2018 09:19:15 +0100 Subject: [PATCH 10/19] Move setting visibility resource type from Uranium to Cura --- cura/CuraApplication.py | 4 +++- cura/Settings/SettingVisibilityPresetsModel.py | 5 ++++- .../advanced.cfg | 0 .../basic.cfg | 0 .../expert.cfg | 0 5 files changed, 7 insertions(+), 2 deletions(-) rename resources/{preset_setting_visibility_groups => setting_visibility}/advanced.cfg (100%) rename resources/{preset_setting_visibility_groups => setting_visibility}/basic.cfg (100%) rename resources/{preset_setting_visibility_groups => setting_visibility}/expert.cfg (100%) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 19a5b50e65..05ed178bf9 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -130,6 +130,7 @@ class CuraApplication(QtApplication): MachineStack = Resources.UserType + 7 ExtruderStack = Resources.UserType + 8 DefinitionChangesContainer = Resources.UserType + 9 + SettingVisibilityPreset = Resources.UserType + 10 Q_ENUMS(ResourceTypes) @@ -183,6 +184,7 @@ class CuraApplication(QtApplication): Resources.addStorageType(self.ResourceTypes.ExtruderStack, "extruders") Resources.addStorageType(self.ResourceTypes.MachineStack, "machine_instances") Resources.addStorageType(self.ResourceTypes.DefinitionChangesContainer, "definition_changes") + Resources.addStorageType(self.ResourceTypes.SettingVisibilityPreset, "setting_visibility") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer, "quality") ContainerRegistry.getInstance().addResourceType(self.ResourceTypes.QualityInstanceContainer, "quality_changes") @@ -360,8 +362,8 @@ class CuraApplication(QtApplication): default_visibility_profile = SettingVisibilityPresetsModel.getInstance().getItem(0) + preferences.addPreference("general/preset_setting_visibility_choice", default_visibility_profile["id"]) preferences.setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) - preferences.setDefault("general/preset_setting_visibility_choice", default_visibility_profile["id"]) preset_setting_visibility_choice = Preferences.getInstance().getValue("general/preset_setting_visibility_choice") if not SettingVisibilityPresetsModel.getInstance().find("id", preset_setting_visibility_choice): diff --git a/cura/Settings/SettingVisibilityPresetsModel.py b/cura/Settings/SettingVisibilityPresetsModel.py index a5b4541ee4..6052fd2509 100644 --- a/cura/Settings/SettingVisibilityPresetsModel.py +++ b/cura/Settings/SettingVisibilityPresetsModel.py @@ -13,6 +13,9 @@ from UM.Qt.ListModel import ListModel from UM.Resources import Resources from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError +import cura.CuraApplication + + class SettingVisibilityPresetsModel(ListModel): IdRole = Qt.UserRole + 1 NameRole = Qt.UserRole + 2 @@ -31,7 +34,7 @@ class SettingVisibilityPresetsModel(ListModel): def _populate(self): items = [] - for item in Resources.getAllResourcesOfType(Resources.PresetSettingVisibilityPresets): + for item in Resources.getAllResourcesOfType(cura.CuraApplication.CuraApplication.ResourceTypes.SettingVisibilityPreset): try: mime_type = MimeTypeDatabase.getMimeTypeForFile(item) except MimeTypeNotFoundError: diff --git a/resources/preset_setting_visibility_groups/advanced.cfg b/resources/setting_visibility/advanced.cfg similarity index 100% rename from resources/preset_setting_visibility_groups/advanced.cfg rename to resources/setting_visibility/advanced.cfg diff --git a/resources/preset_setting_visibility_groups/basic.cfg b/resources/setting_visibility/basic.cfg similarity index 100% rename from resources/preset_setting_visibility_groups/basic.cfg rename to resources/setting_visibility/basic.cfg diff --git a/resources/preset_setting_visibility_groups/expert.cfg b/resources/setting_visibility/expert.cfg similarity index 100% rename from resources/preset_setting_visibility_groups/expert.cfg rename to resources/setting_visibility/expert.cfg From 74fe281e1db3b3fbf1dc3bf4a3cd041d03acc079 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Feb 2018 17:04:08 +0100 Subject: [PATCH 11/19] Sync currently selected preset between visibility-page and -menu --- cura/CuraApplication.py | 5 --- .../Settings/SettingVisibilityPresetsModel.py | 32 ++++++++++++-- plugins/3MFReader/ThreeMFWorkspaceReader.py | 2 +- resources/qml/Cura.qml | 5 ++- .../Menus/SettingVisibilityPresetsMenu.qml | 40 ++++++----------- .../qml/Preferences/SettingVisibilityPage.qml | 43 +++++++++---------- resources/qml/Settings/SettingView.qml | 16 ++++++- 7 files changed, 82 insertions(+), 61 deletions(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 05ed178bf9..87c24d788b 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -362,13 +362,8 @@ class CuraApplication(QtApplication): default_visibility_profile = SettingVisibilityPresetsModel.getInstance().getItem(0) - preferences.addPreference("general/preset_setting_visibility_choice", default_visibility_profile["id"]) preferences.setDefault("general/visible_settings", ";".join(default_visibility_profile["settings"])) - preset_setting_visibility_choice = Preferences.getInstance().getValue("general/preset_setting_visibility_choice") - if not SettingVisibilityPresetsModel.getInstance().find("id", preset_setting_visibility_choice): - Preferences.getInstance().setValue("general/preset_setting_visibility_choice", default_visibility_profile["id"]) - self.applicationShuttingDown.connect(self.saveSettings) self.engineCreatedSignal.connect(self._onEngineCreated) diff --git a/cura/Settings/SettingVisibilityPresetsModel.py b/cura/Settings/SettingVisibilityPresetsModel.py index 6052fd2509..307cbc3602 100644 --- a/cura/Settings/SettingVisibilityPresetsModel.py +++ b/cura/Settings/SettingVisibilityPresetsModel.py @@ -9,7 +9,7 @@ from PyQt5.QtCore import pyqtProperty, Qt, pyqtSignal, pyqtSlot, QUrl from UM.Logger import Logger from UM.Qt.ListModel import ListModel - +from UM.Preferences import Preferences from UM.Resources import Resources from UM.MimeTypeDatabase import MimeTypeDatabase, MimeTypeNotFoundError @@ -27,11 +27,18 @@ class SettingVisibilityPresetsModel(ListModel): self.addRoleName(self.NameRole, "name") self.addRoleName(self.SettingsRole, "settings") - self._container_ids = [] - self._containers = [] - self._populate() + preferences = Preferences.getInstance() + preferences.addPreference("cura/active_setting_visibility_preset", "custom") + + self._active_preset = Preferences.getInstance().getValue("cura/active_setting_visibility_preset") + if self.find("id", self._active_preset) < 0: + self._active_preset = "custom" + + self.activePresetChanged.emit() + + def _populate(self): items = [] for item in Resources.getAllResourcesOfType(cura.CuraApplication.CuraApplication.ResourceTypes.SettingVisibilityPreset): @@ -77,6 +84,23 @@ class SettingVisibilityPresetsModel(ListModel): items.sort(key = lambda k: (k["weight"], k["id"])) self.setItems(items) + @pyqtSlot(str) + def setActivePreset(self, preset_id): + if preset_id != "custom" and self.find("id", preset_id) == -1: + Logger.log("w", "Tried to set active preset to unknown id %s", preset_id) + return + + Preferences.getInstance().setValue("cura/active_setting_visibility_preset", preset_id); + + self._active_preset = preset_id + self.activePresetChanged.emit() + + activePresetChanged = pyqtSignal() + + @pyqtProperty(str, notify = activePresetChanged) + def activePreset(self): + return self._active_preset + # Factory function, used by QML @staticmethod def createSettingVisibilityPresetsModel(engine, js_engine): diff --git a/plugins/3MFReader/ThreeMFWorkspaceReader.py b/plugins/3MFReader/ThreeMFWorkspaceReader.py index a2e02fa9d4..bef387d667 100755 --- a/plugins/3MFReader/ThreeMFWorkspaceReader.py +++ b/plugins/3MFReader/ThreeMFWorkspaceReader.py @@ -453,7 +453,7 @@ class ThreeMFWorkspaceReader(WorkspaceReader): Logger.log("w", "Workspace did not contain visible settings. Leaving visibility unchanged") else: global_preferences.setValue("general/visible_settings", visible_settings) - global_preferences.setValue("general/preset_setting_visibility_choice", "Custom") + global_preferences.setValue("cura/active_setting_visibility_preset", "custom") categories_expanded = temp_preferences.getValue("cura/categories_expanded") if categories_expanded is None: diff --git a/resources/qml/Cura.qml b/resources/qml/Cura.qml index 6f649a7273..6d48ee34c3 100644 --- a/resources/qml/Cura.qml +++ b/resources/qml/Cura.qml @@ -625,7 +625,10 @@ UM.MainWindow { preferences.visible = true; preferences.setPage(1); - preferences.getCurrentItem().scrollToSection(source.key); + if(source && source.key) + { + preferences.getCurrentItem().scrollToSection(source.key); + } } } diff --git a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml index 6fcadeac2c..72ca93a27e 100644 --- a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -32,9 +32,13 @@ Menu { text: catalog.i18nc("@action:inmenu", "Custom selection") checkable: true - checked: !showingSearchResults && !showingAllSettings + checked: !showingSearchResults && !showingAllSettings && Cura.SettingVisibilityPresetsModel.activePreset == "custom" exclusiveGroup: group - onTriggered: showSettingVisibilityProfile("Custom") + onTriggered: + { + Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + showSettingVisibilityProfile(); + } } MenuSeparator { } @@ -46,12 +50,13 @@ Menu { text: model.name checkable: true - checked: false + checked: model.id == Cura.SettingVisibilityPresetsModel.activePreset exclusiveGroup: group onTriggered: { + Cura.SettingVisibilityPresetsModel.setActivePreset(model.id); + UM.Preferences.setValue("general/visible_settings", model.settings.join(";")); - UM.Preferences.setValue("general/preset_setting_visibility_choice", model.id); showSettingVisibilityProfile(); } @@ -61,27 +66,6 @@ Menu onObjectRemoved: menu.removeItem(object) } - MenuSeparator { visible: false } - MenuItem - { - text: catalog.i18nc("@action:inmenu", "Changed settings") - visible: false - enabled: true - checkable: true - checked: showingAllSettings - exclusiveGroup: group - onTriggered: showAllSettings() - } - MenuItem - { - text: catalog.i18nc("@action:inmenu", "Settings in profile") - visible: false - enabled: true - checkable: true - checked: showingAllSettings - exclusiveGroup: group - onTriggered: showAllSettings() - } MenuSeparator {} MenuItem { @@ -89,7 +73,11 @@ Menu checkable: true checked: showingAllSettings exclusiveGroup: group - onTriggered: showAllSettings() + onTriggered: + { + Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + showAllSettings(); + } } MenuSeparator {} MenuItem diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 64c997e5f7..fa1b1a1be1 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -37,6 +37,8 @@ UM.PreferencesPage id: base; anchors.fill: parent; + property bool inhibitSwitchToCustom: false + CheckBox { id: toggleVisibleSettings @@ -84,7 +86,7 @@ UM.PreferencesPage if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) { visibilityPreset.currentIndex = visibilityPreset.model.count - 1 - UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.getItem(visibilityPreset.currentIndex).id) + UM.Preferences.setValue("cura/active_setting_visibility_preset", visibilityPreset.model.getItem(visibilityPreset.currentIndex).id) } } } @@ -129,7 +131,7 @@ UM.PreferencesPage currentIndex: { // Load previously selected preset. - var index = model.find("id", UM.Preferences.getValue("general/preset_setting_visibility_choice")); + var index = model.find("id", model.activePreset); if(index == -1) { index = 0; @@ -140,14 +142,12 @@ UM.PreferencesPage onActivated: { - // TODO What to do if user is selected "Custom from Combobox" ? - if (model.getItem(index).id == "custom"){ - UM.Preferences.setValue("general/preset_setting_visibility_choice", model.get(index).id) - return - } + base.inhibitSwitchToCustom = true; + model.setActivePreset(model.getItem(index).id); - UM.Preferences.setValue("general/visible_settings", model.getItem(index).settings.join(";")) - UM.Preferences.setValue("general/preset_setting_visibility_choice", model.getItem(index).id) + UM.Preferences.setValue("general/visible_settings", model.getItem(index).settings.join(";")); + UM.Preferences.setValue("cura/active_setting_visibility_preset", model.getItem(index).id); + base.inhibitSwitchToCustom = false; } } @@ -177,7 +177,16 @@ UM.PreferencesPage exclude: ["machine_settings", "command_line_settings"] showAncestors: true expanded: ["*"] - visibilityHandler: UM.SettingPreferenceVisibilityHandler { } + visibilityHandler: UM.SettingPreferenceVisibilityHandler + { + onVisibilityChanged: + { + if(Cura.SettingVisibilityPresetsModel.activePreset != "" && !base.inhibitSwitchToCustom) + { + Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + } + } + } } delegate: Loader @@ -220,19 +229,7 @@ UM.PreferencesPage { id: settingVisibilityItem; - UM.SettingVisibilityItem { - - // after changing any visibility of settings, set the preset to the "Custom" option - visibilityChangeCallback : function() - { - // If already "Custom" then don't do nothing - if (visibilityPreset.currentIndex != visibilityPreset.model.count - 1) - { - visibilityPreset.currentIndex = visibilityPreset.model.count - 1 - UM.Preferences.setValue("general/preset_setting_visibility_choice", visibilityPreset.model.getItem(visibilityPreset.currentIndex).id) - } - } - } + UM.SettingVisibilityItem { } } } } \ No newline at end of file diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index e2e99fbc3d..98753d0b4c 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -18,6 +18,7 @@ Item property Action configureSettings property bool findingSettings property bool showingAllSettings + property bool inhibitSwitchToCustom: false signal showTooltip(Item item, point location, string text) signal hideTooltip() @@ -559,7 +560,15 @@ Item //: Settings context menu action visible: !findingSettings; text: catalog.i18nc("@action:menu", "Hide this setting"); - onTriggered: definitionsModel.hide(contextMenu.key); + onTriggered: + { + definitionsModel.hide(contextMenu.key); + // visible settings have changed, so we're no longer showing a preset + if (Cura.SettingVisibilityPresetsModel.activePreset != "") + { + Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + } + } } MenuItem { @@ -586,6 +595,11 @@ Item { definitionsModel.show(contextMenu.key); } + // visible settings have changed, so we're no longer showing a preset + if (Cura.SettingVisibilityPresetsModel.activePreset != "") + { + Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + } } } MenuItem From 61bbfcda3ab59b555618fa07e07f37c516cef284 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Feb 2018 19:28:00 +0100 Subject: [PATCH 12/19] Add back "custom" option to the setting visibility page --- .../qml/Preferences/SettingVisibilityPage.qml | 33 ++++++++++++++----- 1 file changed, 25 insertions(+), 8 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index fa1b1a1be1..bc271971b4 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -125,28 +125,45 @@ UM.PreferencesPage right: parent.right } - model: Cura.SettingVisibilityPresetsModel - textRole: "name" + model: ListModel + { + id: visibilityPresetsModel + Component.onCompleted: + { + visibilityPresetsModel.append({text: catalog.i18nc("@action:inmenu", "Custom selection"), id: "custom"}); + + var presets = Cura.SettingVisibilityPresetsModel; + for(var i = 0; i < presets.rowCount(); i++) + { + visibilityPresetsModel.append({text: presets.getItem(i)["name"], id: presets.getItem(i)["id"]}); + } + } + } currentIndex: { // Load previously selected preset. - var index = model.find("id", model.activePreset); + var index = Cura.SettingVisibilityPresetsModel.find("id", Cura.SettingVisibilityPresetsModel.activePreset); if(index == -1) { - index = 0; + return 0; } - return index; + return index + 1; // "Custom selection" entry is added in front, so index is off by 1 } onActivated: { base.inhibitSwitchToCustom = true; - model.setActivePreset(model.getItem(index).id); + var preset_id = visibilityPresetsModel.get(index).id; + Cura.SettingVisibilityPresetsModel.setActivePreset(preset_id); - UM.Preferences.setValue("general/visible_settings", model.getItem(index).settings.join(";")); - UM.Preferences.setValue("cura/active_setting_visibility_preset", model.getItem(index).id); + UM.Preferences.setValue("cura/active_setting_visibility_preset", preset_id); + if (preset_id != "custom") + { + UM.Preferences.setValue("general/visible_settings", Cura.SettingVisibilityPresetsModel.getItem(index - 1).settings.join(";")); + // "Custom selection" entry is added in front, so index is off by 1 + } base.inhibitSwitchToCustom = false; } } From 3f9d92ade090fed2356e3ace748165e6b644d7e7 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Feb 2018 20:22:46 +0100 Subject: [PATCH 13/19] Remove "Search Results" item It makes no sense to have it; instead none of the other menuitems are selected when search results are shown. --- resources/qml/Menus/SettingVisibilityPresetsMenu.qml | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml index 72ca93a27e..d9ffd630e1 100644 --- a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -18,16 +18,6 @@ Menu signal showAllSettings() signal showSettingVisibilityProfile() - MenuItem - { - text: catalog.i18nc("@action:inmenu", "Search Results") - checkable: true - visible: showingSearchResults - checked: showingSearchResults - exclusiveGroup: group - } - MenuSeparator { visible: showingSearchResults } - MenuItem { text: catalog.i18nc("@action:inmenu", "Custom selection") From d9eb4406bfa3560e0f2042d506705968ccab1d55 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 5 Mar 2018 23:25:33 +0100 Subject: [PATCH 14/19] Speed up showing all settings --- resources/qml/Settings/SettingView.qml | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 16b0691a56..73a76a028f 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -235,12 +235,13 @@ Item function updateDefinitionModel() { - if(findingSettings || base.showingAllSettings) + if(findingSettings || showingAllSettings) { expandedCategories = definitionsModel.expanded.slice(); - definitionsModel.expanded = ["*"]; + definitionsModel.expanded = [""]; // keep categories closed while to prevent render while making settings visible one by one definitionsModel.showAncestors = true; definitionsModel.showAll = true; + definitionsModel.expanded = ["*"]; } else { From 7a56c4f63180b1293d8f580b9f9775d7a6d60dfa Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 5 Mar 2018 23:50:42 +0100 Subject: [PATCH 15/19] Fix activating "All settings" menuitem --- resources/qml/Menus/SettingVisibilityPresetsMenu.qml | 1 - 1 file changed, 1 deletion(-) diff --git a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml index d9ffd630e1..17204d6b6c 100644 --- a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -65,7 +65,6 @@ Menu exclusiveGroup: group onTriggered: { - Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); showAllSettings(); } } From 6c1aee2c471f7d01d5d055083462467c64e6c007 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Mon, 5 Mar 2018 23:55:23 +0100 Subject: [PATCH 16/19] Update copyright --- cura/Settings/SettingVisibilityPresetsModel.py | 2 +- resources/qml/Menus/SettingVisibilityPresetsMenu.qml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cura/Settings/SettingVisibilityPresetsModel.py b/cura/Settings/SettingVisibilityPresetsModel.py index 307cbc3602..9ec8875a39 100644 --- a/cura/Settings/SettingVisibilityPresetsModel.py +++ b/cura/Settings/SettingVisibilityPresetsModel.py @@ -1,4 +1,4 @@ -# Copyright (c) 2016 Ultimaker B.V. +# Copyright (c) 2018 Ultimaker B.V. # Cura is released under the terms of the LGPLv3 or higher. import os diff --git a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml index 17204d6b6c..de9eac08cf 100644 --- a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -1,4 +1,4 @@ -// Copyright (c) 2017 Ultimaker B.V. +// Copyright (c) 2018 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. import QtQuick 2.2 From 711d60e8c7e2948f80e50f7c339dcfa27e21d6ee Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Mar 2018 16:30:37 +0100 Subject: [PATCH 17/19] Allow switching back to the "Custom" set --- .../Settings/SettingVisibilityPresetsModel.py | 27 ++++++++++++++++--- .../Menus/SettingVisibilityPresetsMenu.qml | 2 ++ .../qml/Preferences/SettingVisibilityPage.qml | 5 ++++ 3 files changed, 30 insertions(+), 4 deletions(-) diff --git a/cura/Settings/SettingVisibilityPresetsModel.py b/cura/Settings/SettingVisibilityPresetsModel.py index 9ec8875a39..e5a2e24412 100644 --- a/cura/Settings/SettingVisibilityPresetsModel.py +++ b/cura/Settings/SettingVisibilityPresetsModel.py @@ -29,10 +29,12 @@ class SettingVisibilityPresetsModel(ListModel): self._populate() - preferences = Preferences.getInstance() - preferences.addPreference("cura/active_setting_visibility_preset", "custom") + self._preferences = Preferences.getInstance() + self._preferences.addPreference("cura/active_setting_visibility_preset", "custom") # Preference to store which preset is currently selected + self._preferences.addPreference("cura/custom_visible_settings", "") # Preference that stores the "custom" set so it can always be restored (even after a restart) + self._preferences.preferenceChanged.connect(self._onPreferencesChanged) - self._active_preset = Preferences.getInstance().getValue("cura/active_setting_visibility_preset") + self._active_preset = self._preferences.getValue("cura/active_setting_visibility_preset") if self.find("id", self._active_preset) < 0: self._active_preset = "custom" @@ -90,7 +92,12 @@ class SettingVisibilityPresetsModel(ListModel): Logger.log("w", "Tried to set active preset to unknown id %s", preset_id) return - Preferences.getInstance().setValue("cura/active_setting_visibility_preset", preset_id); + if preset_id == "custom" and self._active_preset == "custom": + # Copy current visibility set to custom visibility set preference so it can be restored later + visibility_string = self._preferences.getValue("general/visible_settings") + self._preferences.setValue("cura/custom_visible_settings", visibility_string) + + self._preferences.setValue("cura/active_setting_visibility_preset", preset_id) self._active_preset = preset_id self.activePresetChanged.emit() @@ -101,6 +108,18 @@ class SettingVisibilityPresetsModel(ListModel): def activePreset(self): return self._active_preset + def _onPreferencesChanged(self, name): + if name != "general/visible_settings": + return + + if self._active_preset != "custom": + return + + # Copy current visibility set to custom visibility set preference so it can be restored later + visibility_string = self._preferences.getValue("general/visible_settings") + self._preferences.setValue("cura/custom_visible_settings", visibility_string) + + # Factory function, used by QML @staticmethod def createSettingVisibilityPresetsModel(engine, js_engine): diff --git a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml index de9eac08cf..19c36e6118 100644 --- a/resources/qml/Menus/SettingVisibilityPresetsMenu.qml +++ b/resources/qml/Menus/SettingVisibilityPresetsMenu.qml @@ -27,6 +27,8 @@ Menu onTriggered: { Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); + // Restore custom set from preference + UM.Preferences.setValue("general/visible_settings", UM.Preferences.getValue("cura/custom_visible_settings")); showSettingVisibilityProfile(); } } diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index bc271971b4..f0c24e2cbe 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -164,6 +164,11 @@ UM.PreferencesPage UM.Preferences.setValue("general/visible_settings", Cura.SettingVisibilityPresetsModel.getItem(index - 1).settings.join(";")); // "Custom selection" entry is added in front, so index is off by 1 } + else + { + // Restore custom set from preference + UM.Preferences.setValue("general/visible_settings", UM.Preferences.getValue("cura/custom_visible_settings")); + } base.inhibitSwitchToCustom = false; } } From 7123441db81819f8d46158e8b227ae18ab71fbbf Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Mar 2018 16:51:46 +0100 Subject: [PATCH 18/19] Fix keeping settings visible when showing all settings --- resources/qml/Settings/SettingView.qml | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/resources/qml/Settings/SettingView.qml b/resources/qml/Settings/SettingView.qml index 73a76a028f..1acc1845e5 100644 --- a/resources/qml/Settings/SettingView.qml +++ b/resources/qml/Settings/SettingView.qml @@ -18,7 +18,6 @@ Item property Action configureSettings property bool findingSettings property bool showingAllSettings - property bool inhibitSwitchToCustom: false signal showTooltip(Item item, point location, string text) signal hideTooltip() @@ -559,13 +558,13 @@ Item MenuItem { //: Settings context menu action - visible: !findingSettings; + visible: !(findingSettings || showingAllSettings); text: catalog.i18nc("@action:menu", "Hide this setting"); onTriggered: { definitionsModel.hide(contextMenu.key); // visible settings have changed, so we're no longer showing a preset - if (Cura.SettingVisibilityPresetsModel.activePreset != "") + if (Cura.SettingVisibilityPresetsModel.activePreset != "" && !showingAllSettings) { Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); } @@ -585,7 +584,7 @@ Item return catalog.i18nc("@action:menu", "Keep this setting visible"); } } - visible: findingSettings; + visible: (findingSettings || showingAllSettings); onTriggered: { if (contextMenu.settingVisible) @@ -597,7 +596,7 @@ Item definitionsModel.show(contextMenu.key); } // visible settings have changed, so we're no longer showing a preset - if (Cura.SettingVisibilityPresetsModel.activePreset != "") + if (Cura.SettingVisibilityPresetsModel.activePreset != "" && !showingAllSettings) { Cura.SettingVisibilityPresetsModel.setActivePreset("custom"); } From e62ed62bdda71cd162dbb80cfeaa586a46e217bc Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Fri, 9 Mar 2018 16:57:09 +0100 Subject: [PATCH 19/19] Remove duplicate import --- cura/CuraApplication.py | 1 - 1 file changed, 1 deletion(-) diff --git a/cura/CuraApplication.py b/cura/CuraApplication.py index 903533aecf..64ef37b71d 100755 --- a/cura/CuraApplication.py +++ b/cura/CuraApplication.py @@ -70,7 +70,6 @@ from cura.Machines.Models.BrandMaterialsModel import BrandMaterialsModel from cura.Settings.SettingInheritanceManager import SettingInheritanceManager from cura.Settings.SimpleModeSettingsManager import SimpleModeSettingsManager -from cura.Settings.SettingVisibilityPresetsModel import SettingVisibilityPresetsModel from cura.Machines.VariantManager import VariantManager from cura.Machines.Models.QualityManagementModel import QualityManagementModel