1
0
mirror of https://github.com/AvengeMedia/DankMaterialShell.git synced 2026-04-12 16:52:10 -04:00

launcher: improve perf of settings search

This commit is contained in:
bbedward
2026-02-19 08:46:19 -05:00
parent 68e10934e4
commit 5c5af5795f
3 changed files with 74 additions and 34 deletions

View File

@@ -684,12 +684,15 @@ Item {
if (searchMode === "all") { if (searchMode === "all") {
if (searchQuery && searchQuery.length >= 2) { if (searchQuery && searchQuery.length >= 2) {
_pluginPhasePending = true; _pluginPhasePending = true;
_pluginPhaseForceFirst = shouldResetSelection; _phase1Items = allItems.slice();
_phase1Items = allItems;
pluginPhaseTimer.restart(); pluginPhaseTimer.restart();
isSearching = true; if (allItems.length === 0) {
searchCompleted(); _pluginPhaseForceFirst = shouldResetSelection;
return; isSearching = true;
searchCompleted();
return;
}
_pluginPhaseForceFirst = false;
} else if (!searchQuery) { } else if (!searchQuery) {
var emptyTriggerOrdered = getEmptyTriggerPluginsOrdered(); var emptyTriggerOrdered = getEmptyTriggerPluginsOrdered();
for (var i = 0; i < emptyTriggerOrdered.length; i++) { for (var i = 0; i < emptyTriggerOrdered.length; i++) {

View File

@@ -242,7 +242,7 @@ Variants {
Image { Image {
id: nextWallpaper id: nextWallpaper
anchors.fill: parent anchors.fill: parent
visible: true visible: source !== ""
opacity: 0 opacity: 0
layer.enabled: false layer.enabled: false
asynchronous: true asynchronous: true
@@ -512,14 +512,18 @@ Variants {
} }
} }
MultiEffect { Loader {
anchors.fill: parent anchors.fill: parent
source: effectLoader.active ? effectLoader.item : currentWallpaper active: CompositorService.isNiri && SettingsData.blurWallpaperOnOverview && NiriService.inOverview && currentWallpaper.source !== ""
visible: CompositorService.isNiri && SettingsData.blurWallpaperOnOverview && NiriService.inOverview && currentWallpaper.source !== ""
blurEnabled: true sourceComponent: MultiEffect {
blur: 0.8 anchors.fill: parent
blurMax: 75 source: effectLoader.active ? effectLoader.item : currentWallpaper
autoPaddingEnabled: false blurEnabled: true
blur: 0.8
blurMax: 75
autoPaddingEnabled: false
}
} }
} }
} }

View File

@@ -16,6 +16,7 @@ Singleton {
property var registeredCards: ({}) property var registeredCards: ({})
property var settingsIndex: [] property var settingsIndex: []
property bool indexLoaded: false property bool indexLoaded: false
property var _translatedCache: []
readonly property var conditionMap: ({ readonly property var conditionMap: ({
"isNiri": () => CompositorService.isNiri, "isNiri": () => CompositorService.isNiri,
@@ -38,9 +39,11 @@ Singleton {
try { try {
root.settingsIndex = JSON.parse(text()); root.settingsIndex = JSON.parse(text());
root.indexLoaded = true; root.indexLoaded = true;
root._rebuildTranslationCache();
} catch (e) { } catch (e) {
console.warn("SettingsSearchService: Failed to parse index:", e); console.warn("SettingsSearchService: Failed to parse index:", e);
root.settingsIndex = []; root.settingsIndex = [];
root._translatedCache = [];
} }
} }
onLoadFailed: error => console.warn("SettingsSearchService: Failed to load index:", error) onLoadFailed: error => console.warn("SettingsSearchService: Failed to load index:", error)
@@ -131,6 +134,27 @@ Singleton {
}; };
} }
function _rebuildTranslationCache() {
var cache = [];
for (var i = 0; i < settingsIndex.length; i++) {
var item = settingsIndex[i];
var t = translateItem(item);
cache.push({
section: t.section,
label: t.label,
tabIndex: t.tabIndex,
category: t.category,
keywords: t.keywords,
icon: t.icon,
description: t.description,
conditionKey: t.conditionKey,
labelLower: t.label.toLowerCase(),
categoryLower: t.category.toLowerCase()
});
}
_translatedCache = cache;
}
function search(text) { function search(text) {
query = text; query = text;
if (!text) { if (!text) {
@@ -138,18 +162,19 @@ Singleton {
return; return;
} }
const queryLower = text.toLowerCase().trim(); var queryLower = text.toLowerCase().trim();
const queryWords = queryLower.split(/\s+/).filter(w => w.length > 0); var queryWords = queryLower.split(/\s+/).filter(w => w.length > 0);
const scored = []; var scored = [];
var cache = _translatedCache;
for (const item of settingsIndex) { for (var i = 0; i < cache.length; i++) {
if (!checkCondition(item)) var entry = cache[i];
if (!checkCondition(entry))
continue; continue;
const translated = translateItem(item); var labelLower = entry.labelLower;
const labelLower = translated.label.toLowerCase(); var categoryLower = entry.categoryLower;
const categoryLower = translated.category.toLowerCase(); var score = 0;
let score = 0;
if (labelLower === queryLower) { if (labelLower === queryLower) {
score = 10000; score = 10000;
@@ -162,24 +187,32 @@ Singleton {
} }
if (score === 0) { if (score === 0) {
for (const keyword of item.keywords) { var keywords = entry.keywords;
if (keyword.startsWith(queryLower)) { for (var k = 0; k < keywords.length; k++) {
score = Math.max(score, 800); if (keywords[k].startsWith(queryLower)) {
score = 800;
break; break;
} }
if (keyword.includes(queryLower)) { if (keywords[k].includes(queryLower) && score < 400) {
score = Math.max(score, 400); score = 400;
} }
} }
} }
if (score === 0 && queryWords.length > 1) { if (score === 0 && queryWords.length > 1) {
let allMatch = true; var allMatch = true;
for (const word of queryWords) { for (var w = 0; w < queryWords.length; w++) {
const inLabel = labelLower.includes(word); var word = queryWords[w];
const inKeywords = item.keywords.some(k => k.includes(word)); if (labelLower.includes(word))
const inCategory = categoryLower.includes(word); continue;
if (!inLabel && !inKeywords && !inCategory) { var inKeywords = false;
for (var k = 0; k < entry.keywords.length; k++) {
if (entry.keywords[k].includes(word)) {
inKeywords = true;
break;
}
}
if (!inKeywords && !categoryLower.includes(word)) {
allMatch = false; allMatch = false;
break; break;
} }
@@ -190,7 +223,7 @@ Singleton {
if (score > 0) { if (score > 0) {
scored.push({ scored.push({
item: translated, item: entry,
score: score score: score
}); });
} }