mirror of
https://github.com/zephrynis/nix-flake.git
synced 2026-02-19 04:21:55 +00:00
feat: make AGS colorshell configuration fully declarative
- Add complete colorshell v2.0.3 configuration to home/ags-config/ - Disable runner plugin and NightLight tile (incompatible with NixOS) - Customize SCSS with full opacity (no transparency) - Add dark pale blue color scheme in home/pywal-colors/ - Configure Papirus-Dark icon theme via home-manager - Make ~/.config/ags/ immutable and managed by Nix store - Auto-deploy pywal colors to ~/.cache/wal/colors.json All AGS configuration is now reproducible and version controlled.
This commit is contained in:
119
home/ags-config/runner/widgets/ResultWidget.tsx
Normal file
119
home/ags-config/runner/widgets/ResultWidget.tsx
Normal file
@@ -0,0 +1,119 @@
|
||||
import { getter, gtype, property, register, setter } from "ags/gobject";
|
||||
import { Gtk } from "ags/gtk4";
|
||||
import { variableToBoolean } from "../../modules/utils";
|
||||
|
||||
import Pango from "gi://Pango?version=1.0";
|
||||
import GdkPixbuf from "gi://GdkPixbuf?version=2.0";
|
||||
|
||||
|
||||
export type ResultWidgetProps = {
|
||||
icon?: string | GdkPixbuf.Pixbuf | Gtk.Widget | JSX.Element;
|
||||
title: string;
|
||||
description?: string;
|
||||
closeOnClick?: boolean;
|
||||
setup?: () => void;
|
||||
actionClick?: () => void;
|
||||
visible?: boolean;
|
||||
};
|
||||
|
||||
@register({ GTypeName: "ResultWidget" })
|
||||
export class ResultWidget extends Gtk.Box {
|
||||
|
||||
#icon: string|Gtk.Widget|GdkPixbuf.Pixbuf|null = null;
|
||||
|
||||
public readonly actionClick: () => void;
|
||||
public readonly setup?: () => void;
|
||||
|
||||
@property(Boolean)
|
||||
closeOnClick: boolean = true;
|
||||
|
||||
@getter(gtype<string|Gtk.Widget|GdkPixbuf.Pixbuf|null>(Object))
|
||||
get icon() { return this.#icon; }
|
||||
|
||||
@setter(gtype<string|Gtk.Widget|GdkPixbuf.Pixbuf|null>(Object))
|
||||
set icon(newIcon: string|Gtk.Widget|GdkPixbuf.Pixbuf|null) {
|
||||
this.set_icon(newIcon);
|
||||
}
|
||||
|
||||
constructor(props: ResultWidgetProps & Partial<Gtk.Box.ConstructorProps>) {
|
||||
super();
|
||||
|
||||
this.add_css_class("result");
|
||||
|
||||
this.visible = props.visible ?? true;
|
||||
this.hexpand = true;
|
||||
this.setup = props.setup;
|
||||
this.closeOnClick = props.closeOnClick ?? true;
|
||||
this.actionClick = () => props.actionClick?.();
|
||||
|
||||
this.append(<Gtk.Box orientation={Gtk.Orientation.VERTICAL} valign={Gtk.Align.CENTER}>
|
||||
<Gtk.Label class={"title"} xalign={0} ellipsize={Pango.EllipsizeMode.END}
|
||||
label={props.title} />
|
||||
|
||||
<Gtk.Label class={"description"} visible={variableToBoolean(props.description)}
|
||||
ellipsize={Pango.EllipsizeMode.END} xalign={0} label={props.description ?? ""} />
|
||||
</Gtk.Box> as Gtk.Box);
|
||||
|
||||
|
||||
if(props.icon !== undefined)
|
||||
this.set_icon(props.icon as Gtk.Widget|string|GdkPixbuf.Pixbuf);
|
||||
}
|
||||
|
||||
/** it is recommended to not change the custom widget's name. */
|
||||
set_icon(icon: string|Gtk.Widget|GdkPixbuf.Pixbuf|null): void {
|
||||
const firstChild = this.get_first_child();
|
||||
|
||||
if(icon === null && firstChild?.name !== undefined &&
|
||||
/^(custom\-)?icon\-widget$/.test(firstChild?.name)) {
|
||||
|
||||
this.remove(firstChild);
|
||||
return;
|
||||
}
|
||||
|
||||
if(firstChild && firstChild.name === "icon-widget" &&
|
||||
firstChild instanceof Gtk.Image) {
|
||||
|
||||
if(typeof icon === "string") {
|
||||
firstChild.set_from_icon_name(icon);
|
||||
this.#icon = icon;
|
||||
this.notify("icon");
|
||||
return;
|
||||
}
|
||||
|
||||
if(icon instanceof GdkPixbuf.Pixbuf) {
|
||||
firstChild.set_from_pixbuf(icon);
|
||||
this.#icon = icon;
|
||||
this.notify("icon");
|
||||
return;
|
||||
}
|
||||
|
||||
// remove if we're not going to use it
|
||||
this.remove(firstChild);
|
||||
}
|
||||
|
||||
if(icon instanceof Gtk.Widget) {
|
||||
if(firstChild?.name === "custom-icon-widget")
|
||||
this.remove(firstChild);
|
||||
|
||||
this.prepend(icon);
|
||||
this.#icon = this.get_first_child();
|
||||
this.notify("icon");
|
||||
return;
|
||||
}
|
||||
|
||||
this.prepend(
|
||||
<Gtk.Image name={"icon-widget"} $={(self) => {
|
||||
if(typeof icon === "string") {
|
||||
self.set_from_icon_name(icon);
|
||||
this.#icon = icon;
|
||||
this.notify("icon");
|
||||
return;
|
||||
}
|
||||
|
||||
self.set_from_pixbuf(icon);
|
||||
this.#icon = icon;
|
||||
this.notify("icon");
|
||||
}} /> as Gtk.Image
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user