55 lines
1.4 KiB
TypeScript
55 lines
1.4 KiB
TypeScript
import { App } from 'astal/gtk3';
|
|
|
|
import AstalApps from 'gi://AstalApps';
|
|
|
|
import SortedList from '../misc/sorted-list';
|
|
|
|
import { launchApp } from './launch';
|
|
import AppItemWidget, { AppItem } from './app-item';
|
|
|
|
|
|
export default () => SortedList({
|
|
name: 'applauncher',
|
|
|
|
create_list: () => AstalApps.Apps.new().get_list(),
|
|
|
|
create_row: (app) => AppItemWidget({ app }),
|
|
|
|
fzf_options: {
|
|
selector: (app) => app.name + app.executable,
|
|
|
|
tiebreakers: [
|
|
(a, b) => b.item.frequency - a.item.frequency,
|
|
],
|
|
},
|
|
|
|
compare_props: ['name', 'frequency'],
|
|
|
|
on_row_activated: (row) => {
|
|
const app = (row.get_children()[0] as AppItem).app;
|
|
|
|
launchApp(app);
|
|
App.get_window('win-applauncher')?.set_visible(false);
|
|
},
|
|
|
|
sort_func: (a, b, entry, fzfResults) => {
|
|
const row1 = (a.get_children()[0] as AppItem).app;
|
|
const row2 = (b.get_children()[0] as AppItem).app;
|
|
|
|
if (entry.text === '' || entry.text === '-') {
|
|
a.set_visible(true);
|
|
b.set_visible(true);
|
|
|
|
return row2.frequency - row1.frequency;
|
|
}
|
|
else {
|
|
const s1 = fzfResults.find((r) => r.item.name === row1.name)?.score ?? 0;
|
|
const s2 = fzfResults.find((r) => r.item.name === row2.name)?.score ?? 0;
|
|
|
|
a.set_visible(s1 !== 0);
|
|
b.set_visible(s2 !== 0);
|
|
|
|
return s2 - s1;
|
|
}
|
|
},
|
|
});
|