summaryrefslogtreecommitdiff
path: root/modules/launcher/services
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-07-19 16:59:32 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-07-19 16:59:32 +1000
commit58826b7deb07f187d2c2c8cac3bf651a008b4646 (patch)
tree2df9f0fa10739beb363ac1da518bb467e996c32a /modules/launcher/services
parentlauncher: better scheme search (diff)
downloadcaelestia-shell-58826b7deb07f187d2c2c8cac3bf651a008b4646.tar.gz
caelestia-shell-58826b7deb07f187d2c2c8cac3bf651a008b4646.tar.bz2
caelestia-shell-58826b7deb07f187d2c2c8cac3bf651a008b4646.zip
internal: move launcher stuff into subfolders
Diffstat (limited to 'modules/launcher/services')
-rw-r--r--modules/launcher/services/Actions.qml155
-rw-r--r--modules/launcher/services/Apps.qml25
-rw-r--r--modules/launcher/services/M3Variants.qml84
-rw-r--r--modules/launcher/services/Schemes.qml66
4 files changed, 330 insertions, 0 deletions
diff --git a/modules/launcher/services/Actions.qml b/modules/launcher/services/Actions.qml
new file mode 100644
index 0000000..be1fc72
--- /dev/null
+++ b/modules/launcher/services/Actions.qml
@@ -0,0 +1,155 @@
+pragma Singleton
+
+import ".."
+import qs.services
+import qs.config
+import qs.utils
+import Quickshell
+import QtQuick
+
+Searcher {
+ id: root
+
+ readonly property list<Action> actions: [
+ Action {
+ name: qsTr("Calculator")
+ desc: qsTr("Do simple math equations (powered by Qalc)")
+ icon: "calculate"
+
+ function onClicked(list: AppList): void {
+ root.autocomplete(list, "calc");
+ }
+ },
+ Action {
+ name: qsTr("Scheme")
+ desc: qsTr("Change the current colour scheme")
+ icon: "palette"
+
+ function onClicked(list: AppList): void {
+ root.autocomplete(list, "scheme");
+ }
+ },
+ Action {
+ name: qsTr("Wallpaper")
+ desc: qsTr("Change the current wallpaper")
+ icon: "image"
+
+ function onClicked(list: AppList): void {
+ root.autocomplete(list, "wallpaper");
+ }
+ },
+ Action {
+ name: qsTr("Variant")
+ desc: qsTr("Change the current scheme variant")
+ icon: "colors"
+
+ function onClicked(list: AppList): void {
+ root.autocomplete(list, "variant");
+ }
+ },
+ Action {
+ name: qsTr("Transparency")
+ desc: qsTr("Change shell transparency")
+ icon: "opacity"
+ disabled: true
+
+ function onClicked(list: AppList): void {
+ root.autocomplete(list, "transparency");
+ }
+ },
+ Action {
+ name: qsTr("Light")
+ desc: qsTr("Change the scheme to light mode")
+ icon: "light_mode"
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Colours.setMode("light");
+ }
+ },
+ Action {
+ name: qsTr("Dark")
+ desc: qsTr("Change the scheme to dark mode")
+ icon: "dark_mode"
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Colours.setMode("dark");
+ }
+ },
+ Action {
+ name: qsTr("Shutdown")
+ desc: qsTr("Shutdown the system")
+ icon: "power_settings_new"
+ disabled: !Config.launcher.enableDangerousActions
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["systemctl", "poweroff"]);
+ }
+ },
+ Action {
+ name: qsTr("Reboot")
+ desc: qsTr("Reboot the system")
+ icon: "cached"
+ disabled: !Config.launcher.enableDangerousActions
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["systemctl", "reboot"]);
+ }
+ },
+ Action {
+ name: qsTr("Logout")
+ desc: qsTr("Log out of the current session")
+ icon: "exit_to_app"
+ disabled: !Config.launcher.enableDangerousActions
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["loginctl", "terminate-user", ""]);
+ }
+ },
+ Action {
+ name: qsTr("Lock")
+ desc: qsTr("Lock the current session")
+ icon: "lock"
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["loginctl", "lock-session"]);
+ }
+ },
+ Action {
+ name: qsTr("Sleep")
+ desc: qsTr("Suspend then hibernate")
+ icon: "bedtime"
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["systemctl", "suspend-then-hibernate"]);
+ }
+ }
+ ]
+
+ function transformSearch(search: string): string {
+ return search.slice(Config.launcher.actionPrefix.length);
+ }
+
+ function autocomplete(list: AppList, text: string): void {
+ list.search.text = `${Config.launcher.actionPrefix}${text} `;
+ }
+
+ list: actions.filter(a => !a.disabled)
+ useFuzzy: Config.launcher.useFuzzy.actions
+
+ component Action: QtObject {
+ required property string name
+ required property string desc
+ required property string icon
+ property bool disabled
+
+ function onClicked(list: AppList): void {
+ }
+ }
+}
diff --git a/modules/launcher/services/Apps.qml b/modules/launcher/services/Apps.qml
new file mode 100644
index 0000000..d561d15
--- /dev/null
+++ b/modules/launcher/services/Apps.qml
@@ -0,0 +1,25 @@
+pragma Singleton
+
+import qs.config
+import qs.utils
+import Quickshell
+
+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({
+ command: ["app2unit", "--", "foot", `${Quickshell.configDir}/assets/wrap_term_launch.sh`, ...entry.command],
+ workingDirectory: entry.workingDirectory
+ });
+ else
+ Quickshell.execDetached({
+ command: ["app2unit", "--", ...entry.command],
+ workingDirectory: entry.workingDirectory
+ });
+ }
+}
diff --git a/modules/launcher/services/M3Variants.qml b/modules/launcher/services/M3Variants.qml
new file mode 100644
index 0000000..69bd805
--- /dev/null
+++ b/modules/launcher/services/M3Variants.qml
@@ -0,0 +1,84 @@
+pragma Singleton
+
+import qs.config
+import qs.utils
+import Quickshell
+import QtQuick
+
+Searcher {
+ id: root
+
+ function transformSearch(search: string): string {
+ return search.slice(`${Config.launcher.actionPrefix}variant `.length);
+ }
+
+ list: [
+ Variant {
+ variant: "vibrant"
+ icon: "sentiment_very_dissatisfied"
+ name: "Vibrant"
+ description: "A high chroma palette. The primary palette's chroma is at maximum."
+ },
+ Variant {
+ variant: "tonalspot"
+ icon: "android"
+ name: "Tonal Spot"
+ description: "Default for Material theme colours. A pastel palette with a low chroma."
+ },
+ Variant {
+ variant: "expressive"
+ icon: "compare_arrows"
+ name: "Expressive"
+ description: "A medium chroma palette. The primary palette's hue is different from the seed colour, for variety."
+ },
+ Variant {
+ variant: "fidelity"
+ icon: "compare"
+ name: "Fidelity"
+ description: "Matches the seed colour, even if the seed colour is very bright (high chroma)."
+ },
+ Variant {
+ variant: "content"
+ icon: "sentiment_calm"
+ name: "Content"
+ description: "Almost identical to fidelity."
+ },
+ Variant {
+ variant: "fruitsalad"
+ icon: "nutrition"
+ name: "Fruit Salad"
+ description: "A playful theme - the seed colour's hue does not appear in the theme."
+ },
+ Variant {
+ variant: "rainbow"
+ icon: "looks"
+ name: "Rainbow"
+ description: "A playful theme - the seed colour's hue does not appear in the theme."
+ },
+ Variant {
+ variant: "neutral"
+ icon: "contrast"
+ name: "Neutral"
+ description: "Close to grayscale, a hint of chroma."
+ },
+ Variant {
+ variant: "monochrome"
+ icon: "filter_b_and_w"
+ name: "Monochrome"
+ description: "All colours are grayscale, no chroma."
+ }
+ ]
+ useFuzzy: Config.launcher.useFuzzy.variants
+
+ component Variant: QtObject {
+ required property string variant
+ required property string icon
+ required property string name
+ required property string description
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["caelestia", "scheme", "set", "-v", variant]);
+ }
+ }
+}
diff --git a/modules/launcher/services/Schemes.qml b/modules/launcher/services/Schemes.qml
new file mode 100644
index 0000000..8494437
--- /dev/null
+++ b/modules/launcher/services/Schemes.qml
@@ -0,0 +1,66 @@
+pragma Singleton
+
+import qs.config
+import qs.utils
+import Quickshell
+import Quickshell.Io
+import QtQuick
+
+Searcher {
+ id: root
+
+ function transformSearch(search: string): string {
+ return search.slice(`${Config.launcher.actionPrefix}scheme `.length);
+ }
+
+ function selector(item: var): string {
+ return `${item.name} ${item.flavour}`;
+ }
+
+ list: schemes.instances
+ useFuzzy: Config.launcher.useFuzzy.schemes
+ keys: ["name", "flavour"]
+ weights: [0.9, 0.1]
+
+ Variants {
+ id: schemes
+
+ Scheme {}
+ }
+
+ Process {
+ id: getSchemes
+
+ running: true
+ command: ["caelestia", "scheme", "list"]
+ stdout: StdioCollector {
+ onStreamFinished: {
+ const schemeData = JSON.parse(text);
+ const list = Object.entries(schemeData).map(([name, f]) => Object.entries(f).map(([flavour, colours]) => ({
+ name,
+ flavour,
+ colours
+ })));
+
+ const flat = [];
+ for (const s of list)
+ for (const f of s)
+ flat.push(f);
+
+ schemes.model = flat;
+ }
+ }
+ }
+
+ component Scheme: QtObject {
+ required property var modelData
+ readonly property string name: modelData.name
+ readonly property string flavour: modelData.flavour
+ readonly property var colours: modelData.colours
+
+ function onClicked(list: AppList): void {
+ list.visibilities.launcher = false;
+ Quickshell.execDetached(["caelestia", "scheme", "set", "-n", name, "-f", flavour]);
+ }
+ }
+}