From 4bb67fbd82e65c24b55efcab550a0e943c68fb86 Mon Sep 17 00:00:00 2001 From: fieldOfView Date: Wed, 25 Oct 2017 17:04:23 +0200 Subject: [PATCH 01/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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/20] 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 From 05c59ddaa763277de44e56d0855e827fe5a357ee Mon Sep 17 00:00:00 2001 From: Ian Paschal Date: Wed, 14 Mar 2018 13:29:48 +0100 Subject: [PATCH 20/20] CURA-4946 Handle gcode with wrong quality definition Some gcode has its quality definition set to, say, UM2 extended, which is _actually_ just UM2 gcode. Thus, we check if the definition in the profile matches the current machine or what it in theory should be, either one being valid. See comments in code for details. --- cura/Settings/CuraContainerRegistry.py | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/cura/Settings/CuraContainerRegistry.py b/cura/Settings/CuraContainerRegistry.py index 81cbabc0c9..07ba2db1e5 100644 --- a/cura/Settings/CuraContainerRegistry.py +++ b/cura/Settings/CuraContainerRegistry.py @@ -212,12 +212,20 @@ class CuraContainerRegistry(ContainerRegistry): return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "This profile {0} contains incorrect data, could not import it.", file_name)} profile_definition = global_profile.getMetaDataEntry("definition") - expected_machine_definition = "fdmprinter" - if parseBool(global_container_stack.getMetaDataEntry("has_machine_quality", "False")): - expected_machine_definition = global_container_stack.getMetaDataEntry("quality_definition") - if not expected_machine_definition: - expected_machine_definition = global_container_stack.definition.getId() - if expected_machine_definition is not None and profile_definition is not None and profile_definition != expected_machine_definition: + + # Make sure we have a profile_definition in the file: + if profile_definition is None: + break + + # Get the expected machine definition. + # i.e.: We expect gcode for a UM2 Extended to be defined as normal UM2 gcode... + expected_machine_definition = getMachineDefinitionIDForQualitySearch(global_container_stack.definition) + + # ...but that's not always the case for Cura 3.1 and older, so also get the current machine: + current_machine_definition = global_container_stack.definition.getId() + + # And check if the profile_definition matches either one (showing error if not): + if profile_definition not in (expected_machine_definition, current_machine_definition): Logger.log("e", "Profile [%s] is for machine [%s] but the current active machine is [%s]. Will not import the profile", file_name, profile_definition, expected_machine_definition) return { "status": "error", "message": catalog.i18nc("@info:status Don't translate the XML tags or !", "The machine defined in profile {0} ({1}) doesn't match with your current machine ({2}), could not import it.", file_name, profile_definition, expected_machine_definition)}