import { Apps as AppsService } from "@/services/apps";
import { getAppCategoryIcon } from "@/utils/icons";
import { launch } from "@/utils/system";
import { type FlowBox, setupCustomTooltip } from "@/utils/widgets";
import { execAsync, Gio, register } from "astal";
import { Astal, Gtk, Widget } from "astal/gtk3";
import { launcher as config } from "config";
import type AstalApps from "gi://AstalApps";
import { close, ContentBox, type LauncherContent, limitLength } from "./util";
const AppResult = ({ app }: { app: AstalApps.Application }) => (
);
const FileResult = ({ path }: { path: string }) => (
);
@register()
class Apps extends Widget.Box implements LauncherContent {
#content: FlowBox;
constructor() {
super({ name: "apps", className: "apps" });
this.#content = () as FlowBox;
this.add(
{this.#content}
);
}
updateContent(search: string): void {
this.#content.foreach(c => c.destroy());
for (const app of limitLength(AppsService.fuzzy_query(search), config.apps))
this.#content.add();
}
handleActivate(): void {
this.#content.get_child_at_index(0)?.get_child()?.grab_focus();
this.#content.get_child_at_index(0)?.get_child()?.activate();
}
}
@register()
class Files extends Widget.Box implements LauncherContent {
#content: FlowBox;
constructor() {
super({ name: "files", className: "files" });
this.#content = () as FlowBox;
this.add(
{this.#content}
);
}
updateContent(search: string): void {
execAsync(["fd", ...config.files.fdOpts.get(), search, HOME])
.then(out => {
this.#content.foreach(c => c.destroy());
const paths = out.split("\n").filter(path => path);
for (const path of limitLength(paths, config.files)) this.#content.add();
})
.catch(() => {}); // Ignore errors
}
handleActivate(): void {
this.#content.get_child_at_index(0)?.get_child()?.grab_focus();
this.#content.get_child_at_index(0)?.get_child()?.activate();
}
}
@register()
class Math extends Widget.Box implements LauncherContent {
constructor() {
super({ name: "math", className: "math" });
}
updateContent(search: string): void {
throw new Error("Method not implemented.");
}
handleActivate(search: string): void {
throw new Error("Method not implemented.");
}
}
@register()
class Windows extends Widget.Box implements LauncherContent {
constructor() {
super({ name: "windows", className: "windows" });
}
updateContent(search: string): void {
throw new Error("Method not implemented.");
}
handleActivate(search: string): void {
throw new Error("Method not implemented.");
}
}
export default () => ({
apps: new Apps(),
files: new Files(),
math: new Math(),
windows: new Windows(),
});