diff --git a/Modules/Notification/Notification.qml b/Modules/Notification/Notification.qml index 3c97971a..757011a2 100644 --- a/Modules/Notification/Notification.qml +++ b/Modules/Notification/Notification.qml @@ -252,11 +252,20 @@ Variants { MouseArea { anchors.fill: parent acceptedButtons: Qt.RightButton + hoverEnabled: true onClicked: { if (mouse.button === Qt.RightButton) { animateOut() } } + + onContainsMouseChanged: { + if (containsMouse) { + NotificationService.pauseTimeout(notificationId) + } else { + NotificationService.resumeTimeout(notificationId) + } + } } // Scale, fade, and slide animation diff --git a/Services/NotificationService.qml b/Services/NotificationService.qml index 3d8c0298..4bb5042d 100644 --- a/Services/NotificationService.qml +++ b/Services/NotificationService.qml @@ -111,7 +111,9 @@ Singleton { notificationMetadata[data.id] = { "timestamp": data.timestamp.getTime(), "duration": expire, - "urgency": data.urgency + "urgency": data.urgency, + "paused": false, + "pauseTime": 0 } activeList.insert(0, data) @@ -219,7 +221,7 @@ Singleton { const notif = activeList.get(i) const meta = notificationMetadata[notif.id] - if (!meta || meta.duration === -1) + if (!meta || meta.duration === -1 || meta.paused) continue // Skip infinite notifications @@ -408,6 +410,22 @@ Singleton { return "" } + function pauseTimeout(id) { + const meta = notificationMetadata[id] + if (meta && !meta.paused) { + meta.paused = true + meta.pauseTime = Date.now() + } + } + + function resumeTimeout(id) { + const meta = notificationMetadata[id] + if (meta && meta.paused) { + meta.timestamp += Date.now() - meta.pauseTime + meta.paused = false + } + } + // Public API function dismissActiveNotification(id) { activeMap[id]?.dismiss()