66 lines
1.7 KiB
TypeScript
66 lines
1.7 KiB
TypeScript
import { execAsync } from 'astal';
|
|
import { App } from 'astal/gtk3';
|
|
|
|
import SortedList from '../misc/sorted-list';
|
|
|
|
import { CLIP_SCRIPT, ClipItem, EntryObject } from './clip-item';
|
|
|
|
|
|
export default () => SortedList<EntryObject>({
|
|
name: 'clipboard',
|
|
|
|
create_list: async() => {
|
|
const output = await execAsync(`${CLIP_SCRIPT} --get`)
|
|
.then((str) => str)
|
|
.catch((err) => {
|
|
print(err);
|
|
|
|
return '';
|
|
});
|
|
|
|
return output
|
|
.split('\n')
|
|
.filter((line) => line.trim() !== '')
|
|
.map((entry) => {
|
|
const [id, ...content] = entry.split('\t');
|
|
|
|
return { id: parseInt(id.trim()), content: content.join(' ').trim(), entry };
|
|
});
|
|
},
|
|
|
|
create_row: (item) => <ClipItem item={item} />,
|
|
|
|
fzf_options: {
|
|
selector: (item) => item.content,
|
|
},
|
|
|
|
unique_props: ['id'],
|
|
|
|
on_row_activated: (row) => {
|
|
const clip = row.get_children()[0] as ClipItem;
|
|
|
|
execAsync(`${CLIP_SCRIPT} --copy-by-id ${clip.id}`);
|
|
App.get_window('win-clipboard')?.set_visible(false);
|
|
},
|
|
|
|
sort_func: (a, b, entry, fzfResults) => {
|
|
const row1 = a.get_children()[0] as ClipItem;
|
|
const row2 = b.get_children()[0] as ClipItem;
|
|
|
|
if (entry.text === '' || entry.text === '-') {
|
|
a.set_visible(true);
|
|
b.set_visible(true);
|
|
|
|
return row2.id - row1.id;
|
|
}
|
|
else {
|
|
const s1 = fzfResults.find((r) => r.item.id === row1.id)?.score ?? 0;
|
|
const s2 = fzfResults.find((r) => r.item.id === row2.id)?.score ?? 0;
|
|
|
|
a.set_visible(s1 !== 0);
|
|
b.set_visible(s2 !== 0);
|
|
|
|
return s2 - s1;
|
|
}
|
|
},
|
|
});
|