1
0
Fork 0
NixOS/hosts/totsugeki/home-manager/desktop/ags/config/widgets/launcher/launcher.js
2024-09-05 21:01:29 +02:00

87 lines
2.2 KiB
JavaScript

import { Application } from "./application.js";
const { query } = await Service.import("applications");
const Launcher = ({ width = 500, height = 600, spacing = 4 }) => {
let applications = query("").map(Application);
const list = Widget.Box({
css: "background-color: transparent",
vertical: true,
spacing,
children: applications,
});
function repopulate() {
applications = query("").map(Application);
list.children = applications;
}
const searchBox = Widget.Entry({
class_name: "launcher-search",
hexpand: true,
placeholder_text: "Buscar",
xalign: 0.5,
on_accept: () => {
const results = applications.filter((item) => item.visible);
if (results[0]) {
App.closeWindow("launcher");
results[0].attribute.application.launch();
}
},
on_change: ({ text }) => {
text = text.toLowerCase();
list.children = applications.sort((a, b) => {
var firstMatches = a.attribute.application.name
.toLowerCase()
.match(text ?? "");
var secondMatches = b.attribute.application.name
.toLowerCase()
.match(text ?? "");
if (firstMatches && secondMatches) {
return 0;
} else if (firstMatches) {
return -1;
}
return 1;
});
applications.forEach((item) => {
item.visible = item.attribute.application.match(text ?? "");
});
},
});
return Widget.Box({
class_name: "launcher",
vertical: true,
spacing,
children: [
searchBox,
Widget.Scrollable({
hscroll: "never",
css: `min-width: ${width}px; min-height: ${height}px;`,
child: list,
vexpand: true,
}),
],
setup: (self) =>
self.hook(App, (_, windowName, visible) => {
if (windowName == "launcher" && visible) {
repopulate();
searchBox.text = "";
searchBox.grab_focus();
}
}),
});
};
export const launcher = Widget.Window({
name: "launcher",
setup: (self) =>
self.keybind("Escape", () => {
App.closeWindow("launcher");
}),
visible: false,
keymode: "exclusive",
child: Launcher({}),
});