87 lines
2.2 KiB
JavaScript
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({}),
|
|
});
|