diff options
Diffstat (limited to 'notifications/Balloons.qml')
| -rw-r--r-- | notifications/Balloons.qml | 25 |
1 files changed, 12 insertions, 13 deletions
diff --git a/notifications/Balloons.qml b/notifications/Balloons.qml index 28ffafb..9fa5a85 100644 --- a/notifications/Balloons.qml +++ b/notifications/Balloons.qml @@ -27,21 +27,20 @@ Scope { onTriggered: root.now = Date.now() } - // Which live notifications draw here. Suppression is deliberately here - // and not in the daemon: the drawer lists a notification DND chose not to - // pop, because a list the user opened is not an interruption. - readonly property var visible: (Notify.queue || []).filter(p => { - if (Notify.drawerOpen) return false; - if (p.expires !== 0 && root.now >= p.expires) return false; - if (Notify.snoozeUntil > root.now) return false; - if (Status.dnd && p.urgency !== "critical") return false; - return true; - }) + // The Repeater model is Notify.queue itself, so its identity only changes + // when the daemon rewrites the file, not on the 250ms tick. Expiry and + // snooze are the balloon's own business: the tick reassigns `now`, each + // balloon re-evaluates its visible binding and leaves the column at + // expiry. Rebuilding the model on the tick would recreate every delegate + // (reloading icons, resetting hover) four times a second. + readonly property var live: Notify.queue || [] PanelWindow { id: win - visible: root.visible.length > 0 + // Each balloon hides itself when it expires or is suppressed, so the + // column collapses to zero and the window follows it. + visible: column.implicitHeight > 0 screen: Quickshell.screens.find(s => s.name === "DP-1") ?? Quickshell.screens[0] anchors { bottom: true; right: true } margins { bottom: 12; right: 12 } @@ -60,8 +59,8 @@ Scope { spacing: 8 Repeater { - model: root.visible - NotificationBalloon { notification: modelData } + model: root.live + NotificationBalloon { notification: modelData; now: root.now } } } } |
