// This file is for the notification widget on the sidebar // For the popup notifications, see onscreendisplay.js // The actual widget for each single notification is in lib/notification.js const { GLib, Gtk } = imports.gi; import { Service, Utils, Widget } from '../imports.js'; import Notifications from 'resource:///com/github/Aylur/ags/service/notifications.js'; const { lookUpIcon, timeout } = Utils; const { Box, Icon, Scrollable, Label, Button, Revealer } = Widget; import { MaterialIcon } from "./lib/materialicon.js"; import { setupCursorHover } from "./lib/cursorhover.js"; import Notification from "./lib/notification.js"; const NotificationList = Box({ vertical: true, valign: 'start', className: 'spacing-v-5-revealer', connections: [ [Notifications, (box, id) => { if (box.children.length == 0) { Notifications.notifications .forEach(n => { box.pack_end(Notification({ notifObject: n, isPopup: false, }), false, false, 0) }); box.show_all(); } else if (id) { const notif = Notifications.getNotification(id); const NewNotif = Notification({ notifObject: notif, isPopup: false, }); if (NewNotif) { box.pack_end(NewNotif, false, false, 0); box.show_all(); } } }, 'notified'], [Notifications, (box, id) => { if (!id) return; for (const ch of box.children) { if (ch._id === id) { ch._destroyWithAnims(); } } }, 'closed'], [Notifications, box => box.visible = Notifications.notifications.length > 0], ], }); export default (props) => { const listTitle = Revealer({ revealChild: false, connections: [[Notifications, (revealer) => { revealer.revealChild = (Notifications.notifications.length > 0); }]], child: Box({ valign: 'start', className: 'sidebar-group-invisible txt', children: [ Label({ hexpand: true, xalign: 0, className: 'txt-title-small', label: 'Notifications', }), Button({ className: 'notif-closeall-btn', onClicked: () => { Notifications.clear(); }, child: Box({ className: 'spacing-h-5', children: [ MaterialIcon('clear_all', 'norm'), Label({ className: 'txt-small', label: 'Clear', }) ] }), setup: button => { setupCursorHover(button); }, }) ] }) }); const listContents = Scrollable({ hexpand: true, hscroll: 'never', vscroll: 'automatic', child: Widget({ type: Gtk.Viewport, className: 'sidebar-viewport', setup: (viewport) => { viewport.add(Box({ vexpand: true, children: [NotificationList], })); } }) }); listContents.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC); const vScrollbar = listContents.get_vscrollbar(); vScrollbar.get_style_context().add_class('sidebar-scrollbar'); return Box({ ...props, className: 'sidebar-group-invisible spacing-v-5', vertical: true, children: [ listTitle, listContents, ] }); }