diff options
Diffstat (limited to 'src/modules')
| -rw-r--r-- | src/modules/launcher/actions.tsx | 85 |
1 files changed, 73 insertions, 12 deletions
diff --git a/src/modules/launcher/actions.tsx b/src/modules/launcher/actions.tsx index 52910ea..75f1092 100644 --- a/src/modules/launcher/actions.tsx +++ b/src/modules/launcher/actions.tsx @@ -1,4 +1,6 @@ import { Apps } from "@/services/apps"; +import type { IPalette } from "@/services/palette"; +import Schemes from "@/services/schemes"; import { notify } from "@/utils/system"; import { setupCustomTooltip, type FlowBox } from "@/utils/widgets"; import { execAsync, GLib, readFile, register, type Variable } from "astal"; @@ -19,6 +21,11 @@ interface ActionMap { [k: string]: IAction; } +const autocomplete = (entry: Widget.Entry, action: string) => { + entry.set_text(`${config.actionPrefix.get()}${action} `); + entry.set_position(-1); +}; + const actions = (mode: Variable<Mode>, entry: Widget.Entry): ActionMap => ({ apps: { icon: "apps", @@ -62,27 +69,32 @@ const actions = (mode: Variable<Mode>, entry: Widget.Entry): ActionMap => ({ description: "Change the current colour scheme", action: (...args) => { // If no args, autocomplete cmd - if (args.length === 0) { - entry.set_text(`${config.actionPrefix.get()}scheme `); - entry.set_position(-1); - return; - } + if (args.length === 0) return autocomplete(entry, "scheme"); execAsync(`caelestia scheme ${args[0]}`).catch(console.error); close(); }, }, + wallpaper: { + icon: "image", + name: "Wallpaper", + description: "Change the current wallpaper", + action: (...args) => { + // If no args, autocomplete cmd + if (args.length === 0) return autocomplete(entry, "wallpaper"); + + if (args[0] === "random") execAsync("caelestia wallpaper").catch(console.error); + else execAsync(`caelestia wallpaper -f ${args[0]}`).catch(console.error); + close(); + }, + }, todo: { icon: "checklist", name: "Todo", description: "Create a todo in Todoist", action: (...args) => { // If no args, autocomplete cmd - if (args.length === 0) { - entry.set_text(`${config.actionPrefix.get()}todo `); - entry.set_position(-1); - return; - } + if (args.length === 0) return autocomplete(entry, "todo"); // If tod not installed, notify if (!GLib.find_program_in_path("tod")) { @@ -165,6 +177,47 @@ const Action = ({ args, icon, name, description, action }: IAction & { args: str </Gtk.FlowBoxChild> ); +const Swatch = ({ colour }: { colour: string }) => <box className="swatch" css={"background-color: " + colour + ";"} />; + +const Scheme = ({ name, colours }: { name: string; colours: IPalette }) => ( + <Gtk.FlowBoxChild visible canFocus={false}> + <button + className="result" + cursor="pointer" + onClicked={() => { + execAsync(`caelestia scheme ${name}`).catch(console.error); + close(); + }} + > + <box> + <box valign={Gtk.Align.CENTER}> + <box className="swatch big left" css={"background-color: " + colours.base + ";"} /> + <box className="swatch big right" css={"background-color: " + colours.accent + ";"} /> + </box> + <box vertical className="has-sublabel"> + <label truncate xalign={0} label={name} /> + <box className="swatches"> + <Swatch colour={colours.rosewater} /> + <Swatch colour={colours.flamingo} /> + <Swatch colour={colours.pink} /> + <Swatch colour={colours.mauve} /> + <Swatch colour={colours.red} /> + <Swatch colour={colours.maroon} /> + <Swatch colour={colours.peach} /> + <Swatch colour={colours.yellow} /> + <Swatch colour={colours.green} /> + <Swatch colour={colours.teal} /> + <Swatch colour={colours.sky} /> + <Swatch colour={colours.sapphire} /> + <Swatch colour={colours.blue} /> + <Swatch colour={colours.lavender} /> + </box> + </box> + </box> + </button> + </Gtk.FlowBoxChild> +); + @register() export default class Actions extends Widget.Box implements LauncherContent { #map: ActionMap; @@ -190,8 +243,16 @@ export default class Actions extends Widget.Box implements LauncherContent { updateContent(search: string): void { this.#content.foreach(c => c.destroy()); const args = search.split(" "); - for (const { target } of fuzzysort.go(args[0].slice(1), this.#list, { all: true })) - this.#content.add(<Action {...this.#map[target]} args={args.slice(1)} />); + const action = args[0].slice(1); + + if (action === "scheme") { + const scheme = args[1] ?? ""; + for (const { target } of fuzzysort.go(scheme, Object.keys(Schemes.get_default().map), { all: true })) + this.#content.add(<Scheme name={target} colours={Schemes.get_default().map[target]} />); + } else { + for (const { target } of fuzzysort.go(action, this.#list, { all: true })) + this.#content.add(<Action {...this.#map[target]} args={args.slice(1)} />); + } } handleActivate(): void { |