From 85cf0c8aedd7cb0c3b3e455b47cbcad1d972a6c7 Mon Sep 17 00:00:00 2001 From: 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> Date: Sat, 23 Aug 2025 17:48:15 +1000 Subject: launcher: add special search Closes #464 --- README.md | 1 + config/LauncherConfig.qml | 1 + modules/launcher/AppList.qml | 2 +- modules/launcher/services/Apps.qml | 67 ++++++++++++++++++++++++++++++++++++-- 4 files changed, 67 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 816a627..3be0a67 100644 --- a/README.md +++ b/README.md @@ -282,6 +282,7 @@ All configuration options are in `~/.config/caelestia/shell.json`. "enableDangerousActions": false, "maxShown": 8, "maxWallpapers": 9, + "specialPrefix": "@", "useFuzzy": { "apps": false, "actions": false, diff --git a/config/LauncherConfig.qml b/config/LauncherConfig.qml index 9364b91..fa5b7a5 100644 --- a/config/LauncherConfig.qml +++ b/config/LauncherConfig.qml @@ -4,6 +4,7 @@ JsonObject { property bool enabled: true property int maxShown: 8 property int maxWallpapers: 9 // Warning: even numbers look bad + property string specialPrefix: "@" property string actionPrefix: ">" property bool enableDangerousActions: false // Allow actions that can cause losing data, like shutdown, reboot and logout property int dragThreshold: 50 diff --git a/modules/launcher/AppList.qml b/modules/launcher/AppList.qml index 9e10087..bbd58e8 100644 --- a/modules/launcher/AppList.qml +++ b/modules/launcher/AppList.qml @@ -60,7 +60,7 @@ StyledListView { name: "apps" PropertyChanges { - model.values: Apps.query(search.text) + model.values: Apps.search(search.text) root.delegate: appItem } }, diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml index b6999fd..9f87d50 100644 --- a/modules/launcher/services/Apps.qml +++ b/modules/launcher/services/Apps.qml @@ -3,13 +3,11 @@ pragma Singleton import qs.config import qs.utils import Quickshell +import QtQuick Searcher { id: root - list: DesktopEntries.applications.values.filter(a => !a.noDisplay).sort((a, b) => a.name.localeCompare(b.name)) - useFuzzy: Config.launcher.useFuzzy.apps - function launch(entry: DesktopEntry): void { if (entry.runInTerminal) Quickshell.execDetached({ @@ -22,4 +20,67 @@ Searcher { workingDirectory: entry.workingDirectory }); } + + function search(search: string): list { + const prefix = Config.launcher.specialPrefix; + + if (search.startsWith(`${prefix}i `)) { + keys = ["id", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}c `)) { + keys = ["categories", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}d `)) { + keys = ["desc", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}e `)) { + keys = ["execString", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}w `)) { + keys = ["wmClass", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}g `)) { + keys = ["genericName", "name"]; + weights = [0.9, 0.1]; + } else if (search.startsWith(`${prefix}k `)) { + keys = ["keywords", "name"]; + weights = [0.9, 0.1]; + } else { + keys = ["name"]; + weights = [1]; + + if (!search.startsWith(`${prefix}t `)) + return query(search).map(e => e.modelData); + } + + const results = query(search.slice(prefix.length + 2)).map(e => e.modelData); + if (search.startsWith(`${prefix}t `)) + return results.filter(a => a.runInTerminal); + return results; + } + + function selector(item: var): string { + return keys.map(k => item[k]).join(" "); + } + + list: variants.instances + useFuzzy: Config.launcher.useFuzzy.apps + + Variants { + id: variants + + model: [...DesktopEntries.applications.values].sort((a, b) => a.name.localeCompare(b.name)) + + QtObject { + required property DesktopEntry modelData + readonly property string id: modelData.id + readonly property string name: modelData.name + readonly property string desc: modelData.comment + readonly property string execString: modelData.execString + readonly property string wmClass: modelData.startupClass + readonly property string genericName: modelData.genericName + readonly property string categories: modelData.categories.join(" ") + readonly property string keywords: modelData.keywords.join(" ") + } + } } -- cgit v1.2.3-freya