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:
@@ -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++) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user