launcher: light/dark actions

For switching dynamic mode
This commit is contained in:
2 * r + 2 * t 2025-03-02 13:14:54 +11:00
parent 9c1cc00965
commit df3f93475a
2 changed files with 49 additions and 2 deletions

View file

@ -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)} />);
}
}

View file

@ -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());
}