diff options
| -rw-r--r-- | src/modules/launcher/actions.tsx | 25 | ||||
| -rw-r--r-- | src/services/palette.ts | 26 |
2 files changed, 49 insertions, 2 deletions
diff --git a/src/modules/launcher/actions.tsx b/src/modules/launcher/actions.tsx index a8c5d0a..1fc5c6b 100644 --- a/src/modules/launcher/actions.tsx +++ b/src/modules/launcher/actions.tsx @@ -1,5 +1,6 @@ import { Apps } from "@/services/apps"; import type { IPalette } from "@/services/palette"; +import Palette from "@/services/palette"; import Schemes from "@/services/schemes"; import Wallpapers from "@/services/wallpapers"; import { basename } from "@/utils/strings"; @@ -17,6 +18,7 @@ interface IAction { name: string; description: string; action: (...args: string[]) => void; + available?: () => boolean; } interface ActionMap { @@ -65,6 +67,26 @@ const actions = (mode: Variable<Mode>, entry: Widget.Entry): ActionMap => ({ entry.set_text(""); }, }, + light: { + icon: "light_mode", + name: "Light", + description: "Change dynamic scheme to light mode", + action: () => { + execAsync(`caelestia wallpaper -T light -f ${STATE}/wallpaper/current`).catch(console.error); + close(); + }, + available: () => Palette.get_default().name === "dynamic", + }, + dark: { + icon: "dark_mode", + name: "Dark", + description: "Change dynamic scheme to dark mode", + action: () => { + execAsync(`caelestia wallpaper -T dark -f ${STATE}/wallpaper/current`).catch(console.error); + close(); + }, + available: () => Palette.get_default().name === "dynamic", + }, scheme: { icon: "palette", name: "Scheme", @@ -278,7 +300,8 @@ export default class Actions extends Widget.Box implements LauncherContent { for (const { obj } of fuzzysort.go(wallpaper, Wallpapers.get_default().list, { all: true, key: "path" })) this.#content.add(<Wallpaper {...obj} />); } else { - for (const { target } of fuzzysort.go(action, this.#list, { all: true })) + const list = this.#list.filter(a => this.#map[a].available?.() ?? true); + for (const { target } of fuzzysort.go(action, list, { all: true })) this.#content.add(<Action {...this.#map[target]} args={args.slice(1)} />); } } diff --git a/src/services/palette.ts b/src/services/palette.ts index b925d50..7f6dc0c 100644 --- a/src/services/palette.ts +++ b/src/services/palette.ts @@ -1,4 +1,4 @@ -import { GLib, GObject, monitorFile, property, readFile, register } from "astal"; +import { GLib, GObject, monitorFile, property, readFile, readFileAsync, register } from "astal"; export type Hex = `#${string}`; @@ -41,8 +41,20 @@ export default class Palette extends GObject.Object { return this.instance; } + #isLight: boolean; + #name: string; #colours!: IPalette; + @property(Boolean) + get isLight() { + return this.#isLight; + } + + @property(String) + get name() { + return this.#name; + } + @property(Object) get colours() { return this.#colours; @@ -234,6 +246,18 @@ export default class Palette extends GObject.Object { constructor() { super(); + this.#isLight = readFile(`${STATE}/scheme/current-mode.txt`) === "light"; + monitorFile(`${STATE}/scheme/current-mode.txt`, async file => { + this.#isLight = (await readFileAsync(file)) === "light"; + this.notify("is-light"); + }); + + this.#name = readFile(`${STATE}/scheme/current-name.txt`); + monitorFile(`${STATE}/scheme/current-name.txt`, async file => { + this.#name = await readFileAsync(file); + this.notify("name"); + }); + this.update(); monitorFile(`${STATE}/scheme/current.txt`, () => this.update()); } |