forked from Shinonome/dots-hyprland
76 lines
2.5 KiB
JavaScript
76 lines
2.5 KiB
JavaScript
// This file is for popup notifications
|
|
import Widget from 'resource:///com/github/Aylur/ags/widget.js';
|
|
import Notifications from 'resource:///com/github/Aylur/ags/service/notifications.js';
|
|
const { Box } = Widget;
|
|
import Notification from '../../lib/notification.js';
|
|
|
|
const PopupNotification = (notifObject) => Widget.Box({
|
|
homogeneous: true,
|
|
children: [
|
|
Widget.EventBox({
|
|
onHoverLost: () => {
|
|
notifObject.dismiss();
|
|
},
|
|
child: Widget.Revealer({
|
|
revealChild: true,
|
|
child: Widget.Box({
|
|
children: [Notification({
|
|
notifObject: notifObject,
|
|
isPopup: true,
|
|
props: { hpack: 'fill' },
|
|
})],
|
|
}),
|
|
})
|
|
})
|
|
]
|
|
})
|
|
|
|
const naiveNotifPopupList = Widget.Box({
|
|
vertical: true,
|
|
className: 'spacing-v-5',
|
|
setup: (self) => self.hook(Notifications, (box) => {
|
|
box.children = Notifications.popups.reverse()
|
|
.map(notifItem => PopupNotification(notifItem));
|
|
}),
|
|
})
|
|
|
|
const notifPopupList = Box({
|
|
vertical: true,
|
|
className: 'osd-notifs spacing-v-5-revealer',
|
|
attribute: {
|
|
'map': new Map(),
|
|
'dismiss': (box, id, force = false) => {
|
|
if (!id || !box.attribute.map.has(id) || box.attribute.map.get(id).attribute.hovered && !force)
|
|
return;
|
|
|
|
const notif = box.attribute.map.get(id);
|
|
notif.revealChild = false;
|
|
notif.attribute.destroyWithAnims();
|
|
box.attribute.map.delete(id);
|
|
},
|
|
'notify': (box, id) => {
|
|
if (!id || Notifications.dnd) return;
|
|
if (!Notifications.getNotification(id)) return;
|
|
|
|
box.attribute.map.delete(id);
|
|
|
|
const notif = Notifications.getNotification(id);
|
|
const newNotif = Notification({
|
|
notifObject: notif,
|
|
isPopup: true,
|
|
});
|
|
box.attribute.map.set(id, newNotif);
|
|
box.pack_end(box.attribute.map.get(id), false, false, 0);
|
|
box.show_all();
|
|
|
|
// box.children = Array.from(box.attribute.map.values()).reverse();
|
|
},
|
|
},
|
|
setup: (self) => self
|
|
.hook(Notifications, (box, id) => box.attribute.notify(box, id), 'notified')
|
|
.hook(Notifications, (box, id) => box.attribute.dismiss(box, id), 'dismissed')
|
|
.hook(Notifications, (box, id) => box.attribute.dismiss(box, id, true), 'closed')
|
|
,
|
|
});
|
|
|
|
export default () => notifPopupList; |