From 48b449b32ed4d083e3617066cae90de5d15aaf21 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 13 Mar 2025 22:32:10 +0100 Subject: [PATCH 1/7] Rewrite experiment - Removed the version 2.x - Rewrite onTextChanged -> add logic to not execute if text is unchanged - Rewrite currentIndex & onActivated -> use findIndex instead of for loop - Add reuseItems: true -> recycle items instead of instantiating from the delegate - Remove cacheBuffer -> memory overhead (2GB for the entire list to load in one go) - Rewrite delegate -> wrap loader as a component (based on documentation), remove switch case and replace with condition check, set asynchronous to false (introduces a bit of stutter but items are loaded when viewed). --- .../qml/Preferences/SettingVisibilityPage.qml | 71 +++++++------------ 1 file changed, 24 insertions(+), 47 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index f186f3e460..f7230d2c6a 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -1,8 +1,8 @@ // Copyright (c) 2022 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick 2.1 -import QtQuick.Controls 2.15 +import QtQuick +import QtQuick.Controls import UM 1.5 as UM @@ -27,10 +27,7 @@ UM.PreferencesPage ] signal scrollToSection( string key ) - onScrollToSection: - { - settingsListView.positionViewAtIndex(definitionsModel.getIndex(key), ListView.Beginning) - } + onScrollToSection: settingsListView.positionViewAtIndex(definitionsModel.getIndex(key), ListView.Beginning) function reset() { @@ -101,7 +98,13 @@ UM.PreferencesPage placeholderText: catalog.i18nc("@label:textbox", "Filter...") - onTextChanged: definitionsModel.filter = {"i18n_label|i18n_description": "*" + text} + onTextChanged: { + if (text !== lastFilterText) { + lastFilterText = text; + definitionsModel.filter = {"i18n_label|i18n_description": "*" + text}; + } + } + property string lastFilterText: "" } Cura.ComboBox @@ -118,30 +121,14 @@ UM.PreferencesPage model: settingVisibilityPresetsModel.items textRole: "name" - currentIndex: - { - var idx = -1; - for(var i = 0; i < settingVisibilityPresetsModel.items.length; ++i) - { - if(settingVisibilityPresetsModel.items[i].presetId === settingVisibilityPresetsModel.activePreset) - { - idx = i; - break; - } - } - return idx; - } - - onActivated: - { - var preset_id = settingVisibilityPresetsModel.items[index].presetId - settingVisibilityPresetsModel.setActivePreset(preset_id) - } + currentIndex: settingVisibilityPresetsModel.items.findIndex(i => i.presetId === settingVisibilityPresetsModel.activePreset) + onActivated: settingVisibilityPresetsModel.setActivePreset(settingVisibilityPresetsModel.items[index].presetId) } ListView { id: settingsListView + reuseItems: true anchors { top: filter.bottom @@ -164,34 +151,24 @@ UM.PreferencesPage expanded: ["*"] visibilityHandler: UM.SettingPreferenceVisibilityHandler {} } - cacheBuffer: 1000000 // Set a large cache to effectively just cache every list item. property Component settingVisibilityCategory: Cura.SettingVisibilityCategory {} property Component settingVisibilityItem: Cura.SettingVisibilityItem {} - delegate: Loader - { - id: loader + delegate: Component { + Loader { + id: loader + width: settingsListView.width - scrollBar.width + height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 - width: settingsListView.width - scrollBar.width - height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 + property var definition: model + property var settingDefinitionsModel: definitionsModel - property var definition: model - property var settingDefinitionsModel: definitionsModel - - asynchronous: true - active: model.type !== undefined - sourceComponent: - { - switch (model.type) - { - case "category": - return settingsListView.settingVisibilityCategory - default: - return settingsListView.settingVisibilityItem - } + asynchronous: false + active: model.type !== undefined + sourceComponent: model.type === "category" ? settingsListView.settingVisibilityCategory : settingsListView.settingVisibilityItem } - } + } } } } From e1430c76fd361a5ac7fca3a93e1750be598456f1 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Thu, 13 Mar 2025 22:35:05 +0100 Subject: [PATCH 2/7] fix indent --- resources/qml/Preferences/SettingVisibilityPage.qml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index f7230d2c6a..c14af51da8 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -168,7 +168,7 @@ UM.PreferencesPage active: model.type !== undefined sourceComponent: model.type === "category" ? settingsListView.settingVisibilityCategory : settingsListView.settingVisibilityItem } - } + } } } } From 0e5f2822382276bd3b04377ef8427e3d7e756e06 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Sat, 15 Mar 2025 22:07:57 +0100 Subject: [PATCH 3/7] Replace for loop with map() and remove redundant else - map().join is a better fit that replaces the for loop and a if/else since there is no complex logic involved. - there is a return inside the if statement for requires.length ===0, so no need for else statement as the code execution stops with return --- .../qml/Preferences/SettingVisibilityItem.qml | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityItem.qml b/resources/qml/Preferences/SettingVisibilityItem.qml index 52b06b3dee..a7f4a47e23 100644 --- a/resources/qml/Preferences/SettingVisibilityItem.qml +++ b/resources/qml/Preferences/SettingVisibilityItem.qml @@ -46,33 +46,26 @@ Item text: { - if(provider.properties.enabled == "True") - { - return "" - } - var key = definition ? definition.key : "" - var requires = settingDefinitionsModel.getRequires(key, "enabled") - if (requires.length == 0) - { - return catalog.i18nc("@item:tooltip", "This setting has been hidden by the active machine and will not be visible."); - } - else - { - var requires_text = "" - for (var i in requires) - { - if (requires_text == "") - { - requires_text = requires[i].label - } - else - { - requires_text += ", " + requires[i].label - } - } + if (provider.properties.enabled === "True") return ""; - return catalog.i18ncp("@item:tooltip %1 is list of setting names", "This setting has been hidden by the value of %1. Change the value of that setting to make this setting visible.", "This setting has been hidden by the values of %1. Change the values of those settings to make this setting visible.", requires.length) .arg(requires_text); + var key = definition ? definition.key : ""; + var requires = settingDefinitionsModel.getRequires(key, "enabled"); + + if (requires.length === 0) { + return catalog.i18nc( + "@item:tooltip", + "This setting has been hidden by the active machine and will not be visible." + ); } + + var requiresText = requires.map(r => r.label).join(", "); + + return catalog.i18ncp( + "@item:tooltip %1 is list of setting names", + "This setting has been hidden by the value of %1. Change the value of that setting to make this setting visible.", + "This setting has been hidden by the values of %1. Change the values of those settings to make this setting visible.", + requires.length + ).arg(requiresText); } UM.ColorImage From 656701751236a71888ec1a3f207973ce74c01423 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Sat, 15 Mar 2025 22:25:23 +0100 Subject: [PATCH 4/7] set QtQuick and QtQuick.Controls to 2.15 --- resources/qml/Preferences/SettingVisibilityPage.qml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index c14af51da8..490e7768bc 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -1,8 +1,8 @@ // Copyright (c) 2022 Ultimaker B.V. // Cura is released under the terms of the LGPLv3 or higher. -import QtQuick -import QtQuick.Controls +import QtQuick 2.15 +import QtQuick.Controls 2.15 import UM 1.5 as UM From b549542f18a79692026c746a68f3f1cf3d8a8762 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Sat, 15 Mar 2025 22:31:25 +0100 Subject: [PATCH 5/7] lint --- resources/qml/Preferences/SettingVisibilityPage.qml | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 490e7768bc..f3fca52104 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -98,8 +98,10 @@ UM.PreferencesPage placeholderText: catalog.i18nc("@label:textbox", "Filter...") - onTextChanged: { - if (text !== lastFilterText) { + onTextChanged: + { + if (text !== lastFilterText) + { lastFilterText = text; definitionsModel.filter = {"i18n_label|i18n_description": "*" + text}; } @@ -155,8 +157,10 @@ UM.PreferencesPage property Component settingVisibilityCategory: Cura.SettingVisibilityCategory {} property Component settingVisibilityItem: Cura.SettingVisibilityItem {} - delegate: Component { - Loader { + delegate: Component + { + Loader + { id: loader width: settingsListView.width - scrollBar.width height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 From 3b5432912c4b76138b3990bc88587a6a21ead919 Mon Sep 17 00:00:00 2001 From: Erwan MATHIEU Date: Mon, 17 Mar 2025 16:22:11 +0100 Subject: [PATCH 6/7] Standardize QML code CURA-12466 --- .../qml/Preferences/SettingVisibilityPage.qml | 38 +++++++++++-------- 1 file changed, 22 insertions(+), 16 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index f3fca52104..60599c93fc 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -154,25 +154,31 @@ UM.PreferencesPage visibilityHandler: UM.SettingPreferenceVisibilityHandler {} } - property Component settingVisibilityCategory: Cura.SettingVisibilityCategory {} - property Component settingVisibilityItem: Cura.SettingVisibilityItem {} + Component + { + id: settingVisibilityCategory + Cura.SettingVisibilityCategory {} + } - delegate: Component - { - Loader - { - id: loader - width: settingsListView.width - scrollBar.width - height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 + Component + { + id: settingVisibilityItem + Cura.SettingVisibilityItem {} + } - property var definition: model - property var settingDefinitionsModel: definitionsModel + delegate: Loader + { + id: loader + width: settingsListView.width - scrollBar.width + height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 - asynchronous: false - active: model.type !== undefined - sourceComponent: model.type === "category" ? settingsListView.settingVisibilityCategory : settingsListView.settingVisibilityItem - } - } + property var definition: model + property var settingDefinitionsModel: definitionsModel + + asynchronous: false + active: model.type !== undefined + sourceComponent: model.type === "category" ? settingVisibilityCategory : settingVisibilityItem + } } } } From 7204cdfa968bbe3924d95fddc0d21744278d3c56 Mon Sep 17 00:00:00 2001 From: HellAholic Date: Mon, 17 Mar 2025 16:35:18 +0100 Subject: [PATCH 7/7] Revert onTextChange --- resources/qml/Preferences/SettingVisibilityPage.qml | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/resources/qml/Preferences/SettingVisibilityPage.qml b/resources/qml/Preferences/SettingVisibilityPage.qml index 60599c93fc..73fd021fa2 100644 --- a/resources/qml/Preferences/SettingVisibilityPage.qml +++ b/resources/qml/Preferences/SettingVisibilityPage.qml @@ -98,15 +98,7 @@ UM.PreferencesPage placeholderText: catalog.i18nc("@label:textbox", "Filter...") - onTextChanged: - { - if (text !== lastFilterText) - { - lastFilterText = text; - definitionsModel.filter = {"i18n_label|i18n_description": "*" + text}; - } - } - property string lastFilterText: "" + onTextChanged: definitionsModel.filter = {"i18n_label|i18n_description": "*" + text} } Cura.ComboBox