nixos-configs/modules/ags/config/ts/osd/ctor.ts

66 lines
1.9 KiB
TypeScript
Raw Normal View History

import { Box, Icon, ProgressBar } from 'resource:///com/github/Aylur/ags/widget.js';
const Y_POS = 80;
2024-01-13 11:15:08 -05:00
// Types
import AgsBox from 'types/widgets/box';
import { IconProps } from 'types/widgets/icon';
2024-01-22 10:23:32 -05:00
import GObject from 'types/@girs/gobject-2.0/gobject-2.0';
2024-01-13 11:15:08 -05:00
import AgsStack from 'types/widgets/stack';
2024-01-22 10:23:32 -05:00
import { Widget } from 'types/@girs/gtk-3.0/gtk-3.0.cjs';
2024-01-13 11:15:08 -05:00
import { Connectable } from 'types/widgets/widget';
import AgsProgressBar from 'types/widgets/progressbar';
type ConnectFunc = (self?: AgsProgressBar) => void;
type OSD = {
stack: AgsStack
icon: string | IconProps
info: {
mod: GObject.Object
signal?: string
logic?(self: AgsProgressBar): void
widget?: Widget
}
};
2024-01-13 11:15:08 -05:00
export default ({ stack, icon, info }: OSD) => {
let connectFunc: ConnectFunc;
const osd = Box({
css: `margin-bottom: ${Y_POS}px;`,
children: [Box({
2023-12-21 01:25:59 -05:00
class_name: 'osd',
children: [
Icon({
hpack: 'start',
// Can take a string or an object of props
...(typeof icon === 'string' ? { icon } : icon),
}),
// Can take a static widget instead of a progressbar
2024-01-22 10:23:32 -05:00
info.widget ?
info.widget :
ProgressBar({ vpack: 'center' }),
],
})],
});
// Handle requests to show the OSD
// Different wether it's a bar or static
if (info.logic) {
2024-01-13 11:15:08 -05:00
connectFunc = (self) => new Promise<void>((r) => {
if (info.logic && self) {
info.logic(self);
}
r();
2023-12-21 01:25:59 -05:00
}).then(() => stack.attribute.popup(osd));
}
else {
2023-12-21 01:25:59 -05:00
connectFunc = () => stack.attribute.popup(osd);
}
2024-01-13 11:15:08 -05:00
((osd.children[0] as AgsBox).children[1] as Connectable<AgsProgressBar>)
.hook(info.mod, connectFunc, info.signal);
return osd;
};