113 lines
2.9 KiB
JavaScript
113 lines
2.9 KiB
JavaScript
import App from 'resource:///com/github/Aylur/ags/app.js';
|
|
import Applications from 'resource:///com/github/Aylur/ags/service/applications.js';
|
|
import Hyprland from 'resource:///com/github/Aylur/ags/service/hyprland.js';
|
|
|
|
import { Box, Entry, Icon, Label, Scrollable } from 'resource:///com/github/Aylur/ags/widget.js';
|
|
|
|
import PopupWindow from '../misc/popup.js';
|
|
import Separator from '../misc/separator.js';
|
|
import AppItem from './app-item.js';
|
|
|
|
|
|
const Applauncher = ({ window_name = 'applauncher' } = {}) => {
|
|
const ICON_SEPARATION = 4;
|
|
|
|
const children = () => [
|
|
...Applications.query('').flatMap((app) => {
|
|
const item = AppItem(app);
|
|
|
|
return [
|
|
Separator(ICON_SEPARATION, {
|
|
binds: [['visible', item, 'visible']],
|
|
}),
|
|
item,
|
|
];
|
|
}),
|
|
Separator(ICON_SEPARATION),
|
|
];
|
|
|
|
const list = Box({
|
|
vertical: true,
|
|
children: children(),
|
|
});
|
|
|
|
const placeholder = Label({
|
|
label: " Couldn't find a match",
|
|
className: 'placeholder',
|
|
});
|
|
|
|
const entry = Entry({
|
|
// Set some text so on-change works the first time
|
|
text: '-',
|
|
hexpand: true,
|
|
|
|
on_accept: ({ text }) => {
|
|
const appList = Applications.query(text || '');
|
|
|
|
if (appList[0]) {
|
|
App.toggleWindow(window_name);
|
|
Hyprland.sendMessage(`dispatch exec sh -c ${appList[0]}`);
|
|
++appList[0].frequency;
|
|
}
|
|
},
|
|
|
|
on_change: ({ text }) => {
|
|
let visibleApps = 0;
|
|
|
|
list.children.forEach((item) => {
|
|
if (item.app) {
|
|
item.visible = item.app.match(text);
|
|
|
|
if (item.app.match(text)) {
|
|
++visibleApps;
|
|
}
|
|
}
|
|
});
|
|
placeholder.visible = visibleApps <= 0;
|
|
},
|
|
});
|
|
|
|
return Box({
|
|
className: 'applauncher',
|
|
vertical: true,
|
|
|
|
children: [
|
|
Box({
|
|
className: 'header',
|
|
children: [
|
|
Icon('preferences-system-search-symbolic'),
|
|
entry,
|
|
],
|
|
}),
|
|
|
|
Scrollable({
|
|
hscroll: 'never',
|
|
child: Box({
|
|
vertical: true,
|
|
children: [list, placeholder],
|
|
}),
|
|
}),
|
|
],
|
|
|
|
connections: [[App, (_, name, visible) => {
|
|
if (name !== window_name) {
|
|
return;
|
|
}
|
|
|
|
entry.text = '';
|
|
|
|
if (visible) {
|
|
entry.grab_focus();
|
|
}
|
|
else {
|
|
list.children = children();
|
|
}
|
|
}]],
|
|
});
|
|
};
|
|
|
|
export default () => PopupWindow({
|
|
name: 'applauncher',
|
|
focusable: true,
|
|
child: Applauncher(),
|
|
});
|