From f65bd90bfd07c0322462c6230c5f624275cbffbf Mon Sep 17 00:00:00 2001 From: Damocles Date: Mon, 13 Apr 2026 15:41:57 +0200 Subject: [PATCH] notification center: swipe-right dismiss, cascading clear-all --- modules/NotifCenter.qml | 85 +++++++++++++++++++++++++++++++++++------ 1 file changed, 73 insertions(+), 12 deletions(-) diff --git a/modules/NotifCenter.qml b/modules/NotifCenter.qml index 2507d56..1c1e5eb 100644 --- a/modules/NotifCenter.qml +++ b/modules/NotifCenter.qml @@ -58,12 +58,42 @@ M.PopupPanel { anchors.fill: parent hoverEnabled: true cursorShape: Qt.PointingHandCursor - onClicked: M.NotifService.dismissAll() + onClicked: menuWindow._cascadeDismiss() } } } } + property var _delegates: [] + + function _cascadeDismiss() { + const dels = _delegates.filter(d => d && d.modelData && !d.modelData.closed); + for (let i = 0; i < dels.length; i++) { + const d = dels[i]; + const delay = i * 60; + Qt.callLater(() => { + _cascadeTimer.createObject(menuWindow, { + _target: d, + _delay: delay + }); + }); + } + } + + property Component _cascadeTimer: Component { + Timer { + property var _target + property int _delay + interval: _delay + running: true + onTriggered: { + if (_target && _target._dismissAnim) + _target._dismissAnim.start(); + destroy(); + } + } + } + // Separator Rectangle { width: menuWindow.panelWidth - 16 @@ -82,10 +112,23 @@ M.PopupPanel { required property int index width: menuWindow.panelWidth - height: notifContent.height + 12 + height: _targetHeight * _heightScale opacity: 0 + clip: true + + readonly property real _targetHeight: notifContent.height + 12 + property real _heightScale: 1 + + Component.onCompleted: { + menuWindow._delegates.push(notifItem); + fadeIn.start(); + } + Component.onDestruction: { + const idx = menuWindow._delegates.indexOf(notifItem); + if (idx >= 0) + menuWindow._delegates.splice(idx, 1); + } - Component.onCompleted: fadeIn.start() NumberAnimation { id: fadeIn target: notifItem @@ -93,8 +136,6 @@ M.PopupPanel { to: 1 duration: 150 easing.type: Easing.OutCubic - // Stagger by index - Component.onCompleted: fadeIn.from = 0 } Rectangle { @@ -242,14 +283,34 @@ M.PopupPanel { } } - NumberAnimation { + SequentialAnimation { id: _dismissAnim - target: notifItem - property: "opacity" - to: 0 - duration: 150 - easing.type: Easing.InCubic - onFinished: M.NotifService.dismiss(notifItem.modelData.id) + ParallelAnimation { + NumberAnimation { + target: notifItem + property: "x" + to: menuWindow.panelWidth + duration: 200 + easing.type: Easing.InCubic + } + NumberAnimation { + target: notifItem + property: "opacity" + to: 0 + duration: 200 + easing.type: Easing.InCubic + } + } + NumberAnimation { + target: notifItem + property: "_heightScale" + to: 0 + duration: 150 + easing.type: Easing.OutCubic + } + ScriptAction { + script: M.NotifService.dismiss(notifItem.modelData.id) + } } MouseArea {