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).
This commit is contained in:
HellAholic 2025-03-13 22:32:10 +01:00
parent da9bcd0239
commit 48b449b32e

View File

@ -1,8 +1,8 @@
// Copyright (c) 2022 Ultimaker B.V. // Copyright (c) 2022 Ultimaker B.V.
// Cura is released under the terms of the LGPLv3 or higher. // Cura is released under the terms of the LGPLv3 or higher.
import QtQuick 2.1 import QtQuick
import QtQuick.Controls 2.15 import QtQuick.Controls
import UM 1.5 as UM import UM 1.5 as UM
@ -27,10 +27,7 @@ UM.PreferencesPage
] ]
signal scrollToSection( string key ) signal scrollToSection( string key )
onScrollToSection: onScrollToSection: settingsListView.positionViewAtIndex(definitionsModel.getIndex(key), ListView.Beginning)
{
settingsListView.positionViewAtIndex(definitionsModel.getIndex(key), ListView.Beginning)
}
function reset() function reset()
{ {
@ -101,7 +98,13 @@ UM.PreferencesPage
placeholderText: catalog.i18nc("@label:textbox", "Filter...") 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 Cura.ComboBox
@ -118,30 +121,14 @@ UM.PreferencesPage
model: settingVisibilityPresetsModel.items model: settingVisibilityPresetsModel.items
textRole: "name" textRole: "name"
currentIndex: currentIndex: settingVisibilityPresetsModel.items.findIndex(i => i.presetId === settingVisibilityPresetsModel.activePreset)
{ onActivated: settingVisibilityPresetsModel.setActivePreset(settingVisibilityPresetsModel.items[index].presetId)
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)
}
} }
ListView ListView
{ {
id: settingsListView id: settingsListView
reuseItems: true
anchors anchors
{ {
top: filter.bottom top: filter.bottom
@ -164,34 +151,24 @@ UM.PreferencesPage
expanded: ["*"] expanded: ["*"]
visibilityHandler: UM.SettingPreferenceVisibilityHandler {} visibilityHandler: UM.SettingPreferenceVisibilityHandler {}
} }
cacheBuffer: 1000000 // Set a large cache to effectively just cache every list item.
property Component settingVisibilityCategory: Cura.SettingVisibilityCategory {} property Component settingVisibilityCategory: Cura.SettingVisibilityCategory {}
property Component settingVisibilityItem: Cura.SettingVisibilityItem {} property Component settingVisibilityItem: Cura.SettingVisibilityItem {}
delegate: Loader delegate: Component {
{ Loader {
id: loader id: loader
width: settingsListView.width - scrollBar.width
height: model.type !== undefined ? UM.Theme.getSize("section").height : 0
width: settingsListView.width - scrollBar.width property var definition: model
height: model.type !== undefined ? UM.Theme.getSize("section").height : 0 property var settingDefinitionsModel: definitionsModel
property var definition: model asynchronous: false
property var settingDefinitionsModel: definitionsModel active: model.type !== undefined
sourceComponent: model.type === "category" ? settingsListView.settingVisibilityCategory : settingsListView.settingVisibilityItem
asynchronous: true
active: model.type !== undefined
sourceComponent:
{
switch (model.type)
{
case "category":
return settingsListView.settingVisibilityCategory
default:
return settingsListView.settingVisibilityItem
}
} }
} }
} }
} }
} }