diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-16 23:20:39 +1100 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-01-16 23:20:39 +1100 |
| commit | 6d5805e66204caa599a8a2996238adf7931cb95b (patch) | |
| tree | 49855ba4e35506cb936ecef692386c4bd8603016 /src/modules/popdowns/notifications.tsx | |
| parent | base popdown window (diff) | |
| download | caelestia-shell-6d5805e66204caa599a8a2996238adf7931cb95b.tar.gz caelestia-shell-6d5805e66204caa599a8a2996238adf7931cb95b.tar.bz2 caelestia-shell-6d5805e66204caa599a8a2996238adf7931cb95b.zip | |
refactor: move popdowns to own folder
And group them like osds
Diffstat (limited to 'src/modules/popdowns/notifications.tsx')
| -rw-r--r-- | src/modules/popdowns/notifications.tsx | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/src/modules/popdowns/notifications.tsx b/src/modules/popdowns/notifications.tsx new file mode 100644 index 0000000..bb08c13 --- /dev/null +++ b/src/modules/popdowns/notifications.tsx @@ -0,0 +1,65 @@ +import { bind } from "astal"; +import { Astal, Gtk } from "astal/gtk3"; +import AstalNotifd from "gi://AstalNotifd"; +import Notification from "../../widgets/notification"; +import PopdownWindow from "../../widgets/popdownwindow"; + +const List = () => ( + <box + vertical + valign={Gtk.Align.START} + className="list" + setup={self => { + const notifd = AstalNotifd.get_default(); + const map = new Map<number, Notification>(); + + const addNotification = (notification: AstalNotifd.Notification) => { + const notif = (<Notification notification={notification} />) as Notification; + notif.connect("destroy", () => map.get(notification.id) === notif && map.delete(notification.id)); + map.get(notification.id)?.destroyWithAnims(); + map.set(notification.id, notif); + + self.pack_end( + <eventbox + // Dismiss on middle click + onClick={(_, event) => event.button === Astal.MouseButton.MIDDLE && notification.dismiss()} + > + {notif} + </eventbox>, + false, + false, + 0 + ); + }; + + notifd + .get_notifications() + .sort((a, b) => a.time - b.time) + .forEach(addNotification); + + self.hook(notifd, "notified", (_, id) => addNotification(notifd.get_notification(id))); + self.hook(notifd, "resolved", (_, id) => map.get(id)?.destroyWithAnims()); + }} + /> +); + +export default () => ( + <PopdownWindow + name="notifications" + count={bind(AstalNotifd.get_default(), "notifications").as(n => n.length)} + headerButtons={[ + { + label: "Silence", + onClicked: () => (AstalNotifd.get_default().dontDisturb = !AstalNotifd.get_default().dontDisturb), + className: bind(AstalNotifd.get_default(), "dontDisturb").as(d => (d ? "enabled" : "")), + }, + { + label: "Clear", + onClicked: () => AstalNotifd.get_default().notifications.forEach(n => n.dismiss()), + }, + ]} + emptyIcon="notifications_active" + emptyLabel="All caught up!" + list={<List />} + /> +); |