import { Notifications, App, Utils, Widget } from '../../imports.js'; const { Button, Label, Box, Icon, Scrollable, Window, Revealer } = Widget; const { timeout } = Utils; const { getWindow } = App; import Notification from './base.js'; import { EventBox } from '../misc/cursorbox.js'; import { PopUp } from '../misc/popup.js'; const ClearButton = () => EventBox({ child: Button({ onPrimaryClickRelease: button => { button._popups.children.forEach(ch => ch.child.setStyle(ch.child._leftAnim1)); button._notifList.children.forEach(ch => { ch.child.setStyle(ch.child._rightAnim1); timeout(500, () => { button._notifList.remove(ch); Notifications.notifications.forEach(n => n.close()); }); }); }, properties: [['notifList'], ['popups']], connections: [[Notifications, button => { if (!button._notifList) button._notifList = NotificationList; if (!button._popups) button._popups = getWindow('notifications').child.children[0].child; button.sensitive = Notifications.notifications.length > 0; }]], child: Box({ children: [ Label('Clear '), Icon({ connections: [[Notifications, icon => { icon.icon = Notifications.notifications.length > 0 ? 'user-trash-full-symbolic' : 'user-trash-symbolic'; }]], }), ], }), }), }); const Header = () => Box({ className: 'header', children: [ Label({ label: 'Notifications', hexpand: true, xalign: 0 }), ClearButton(), ], }); const NotificationList = Box({ vertical: true, vexpand: true, connections: [ [Notifications, (box, id) => { if (box.children.length == 0) { box.children = Notifications.notifications .reverse() .map(n => Notification({ notif: n, command: () => n.close() })); } else if (id) { let notif = Notifications.getNotification(id); const NewNotif = Notification({ notif, command: () => notif.close(), }); if (NewNotif) { box.add(NewNotif); box.show_all(); } } }, 'notified'], [Notifications, (box, id) => { for (const ch of box.children) { if (ch._id == id) { ch.child.setStyle(ch.child._rightAnim1); timeout(500, () => box.remove(ch)); return; } } }, 'closed'], [Notifications, box => box.visible = Notifications.notifications.length > 0], ], }); const Placeholder = () => Revealer({ transition: 'crossfade', connections: [[Notifications, box => { box.revealChild = Notifications.notifications.length === 0; }]], child: Box({ className: 'placeholder', vertical: true, valign: 'center', halign: 'center', vexpand: true, hexpand: true, children: [ Icon('notification-disabled-symbolic'), Label('Your inbox is empty'), ], }), }); const NotificationCenterWidget = Box({ className: 'notification-center', vertical: true, children: [ Header(), Box({ className: 'notification-wallpaper-box', children: [Scrollable({ className: 'notification-list-box', hscroll: 'never', vscroll: 'automatic', child: Box({ className: 'notification-list', vertical: true, children: [ NotificationList, Placeholder(), ], }), })], }), ], }); export const NotificationCenter = Window({ name: 'notification-center', layer: 'overlay', anchor: [ 'top', 'right' ], popup: true, margin: [ 8, 60, 0, 0 ], child: PopUp({ name: 'notification-center', child: NotificationCenterWidget, }), });