diff --git a/.config/quickshell/modules/common/widgets/NotificationWidget.qml b/.config/quickshell/modules/common/widgets/NotificationWidget.qml index e65346e50..4d5ed7fcc 100644 --- a/.config/quickshell/modules/common/widgets/NotificationWidget.qml +++ b/.config/quickshell/modules/common/widgets/NotificationWidget.qml @@ -24,7 +24,7 @@ Item { Behavior on implicitHeight { enabled: enableAnimation NumberAnimation { - duration: Appearance.animation.elementDecel.duration + duration: Appearance.animation.elementDecelFast.duration easing.type: Appearance.animation.elementDecel.type } } @@ -33,21 +33,31 @@ Item { root.ready = true } - function destroyWithAnimation() { - notificationRowWrapper.anchors.left = undefined - notificationRowWrapper.anchors.right = undefined - notificationRowWrapper.anchors.fill = undefined - notificationBackground.anchors.left = undefined - notificationBackground.anchors.right = undefined - notificationBackground.anchors.fill = undefined - notificationRowWrapper.x = width - notificationBackground.x = width - destroyTimer1.start() + function destroyWithAnimation(delay = 0) { + destroyTimer0.interval = delay + destroyTimer0.start() + } + + Timer { + id: destroyTimer0 + interval: 0 + repeat: false + onTriggered: { + notificationRowWrapper.anchors.left = undefined + notificationRowWrapper.anchors.right = undefined + notificationRowWrapper.anchors.fill = undefined + notificationBackground.anchors.left = undefined + notificationBackground.anchors.right = undefined + notificationBackground.anchors.fill = undefined + notificationRowWrapper.x = width + notificationBackground.x = width + destroyTimer1.start() + } } Timer { id: destroyTimer1 - interval: Appearance.animation.elementDecel.duration / 2 + interval: Appearance.animation.elementDecelFast.duration repeat: false onTriggered: { notificationRowWrapper.anchors.top = undefined @@ -59,7 +69,7 @@ Item { Timer { id: destroyTimer2 - interval: Appearance.animation.elementDecel.duration + interval: Appearance.animation.elementDecelFast.duration repeat: false onTriggered: { root.destroy() @@ -102,7 +112,7 @@ Item { Behavior on x { enabled: enableAnimation NumberAnimation { - duration: Appearance.animation.elementDecel.duration + duration: Appearance.animation.elementDecelFast.duration easing.type: Appearance.animation.elementDecel.type } } @@ -120,7 +130,7 @@ Item { Behavior on x { enabled: enableAnimation NumberAnimation { - duration: Appearance.animation.elementDecel.duration + duration: Appearance.animation.elementDecelFast.duration easing.type: Appearance.animation.elementDecel.type } } diff --git a/.config/quickshell/modules/sidebarRight/notifications/NotificationList.qml b/.config/quickshell/modules/sidebarRight/notifications/NotificationList.qml index 69fcffbb1..4af329448 100644 --- a/.config/quickshell/modules/sidebarRight/notifications/NotificationList.qml +++ b/.config/quickshell/modules/sidebarRight/notifications/NotificationList.qml @@ -70,6 +70,40 @@ Item { } } + // Placeholder when list is empty + Item { + anchors.fill: flickable + + visible: opacity > 0 + opacity: (root.notificationWidgetList.length === 0) ? 1 : 0 + + Behavior on opacity { + NumberAnimation { + duration: Appearance.animation.elementDecel.duration + easing.type: Appearance.animation.elementDecel.type + } + } + + ColumnLayout { + anchors.centerIn: parent + spacing: 5 + + MaterialSymbol { + Layout.alignment: Qt.AlignHCenter + font.pixelSize: 55 + color: Appearance.m3colors.m3outline + text: "notifications_active" + } + StyledText { + Layout.alignment: Qt.AlignHCenter + font.pixelSize: Appearance.font.pixelSize.normal + color: Appearance.m3colors.m3outline + horizontalAlignment: Text.AlignHCenter + text: "No notifications" + } + } + } + RowLayout { id: statusRow anchors.left: parent.left @@ -92,5 +126,23 @@ Item { } } } + + Item { Layout.fillWidth: true } + + NotificationStatusButton { + buttonIcon: "clear_all" + buttonText: "Clear" + onClicked: () => { + for (let i = notificationWidgetList.length - 1; i >= 0; i--) { + // for (let i = 0; i < notificationWidgetList.length; i++) { + const widget = notificationWidgetList[i]; + if (widget && widget.notificationObject) { + widget.destroyWithAnimation(); + } + } + notificationWidgetList = []; + Notifications.discardAll() + } + } } } \ No newline at end of file diff --git a/.config/quickshell/modules/sidebarRight/notifications/NotificationStatusButton.qml b/.config/quickshell/modules/sidebarRight/notifications/NotificationStatusButton.qml new file mode 100644 index 000000000..39a1f4fe9 --- /dev/null +++ b/.config/quickshell/modules/sidebarRight/notifications/NotificationStatusButton.qml @@ -0,0 +1,55 @@ +import "root:/modules/common" +import "root:/modules/common/widgets" +import QtQuick +import QtQuick.Controls +import QtQuick.Layouts + +Button { + id: button + property string buttonText: "" + property string buttonIcon: "" + + implicitHeight: 30 + implicitWidth: contentRowLayout.implicitWidth + 10 * 2 + Behavior on implicitWidth { + SmoothedAnimation { + velocity: Appearance.animation.elementDecel.velocity + } + } + + PointingHandInteraction {} + + background: Rectangle { + anchors.fill: parent + radius: Appearance.rounding.full + color: (button.down) ? Appearance.colors.colLayer2Active : (button.hovered ? Appearance.colors.colLayer2Hover : Appearance.colors.colLayer2) + + Behavior on color { + ColorAnimation { + duration: Appearance.animation.elementDecel.duration + easing.type: Appearance.animation.elementDecel.type + } + + } + + } + contentItem: RowLayout { + id: contentRowLayout + // anchors.centerIn: parent + anchors.right: parent.right + spacing: 0 + MaterialSymbol { + text: buttonIcon + Layout.fillWidth: false + font.pixelSize: Appearance.font.pixelSize.larger + color: Appearance.colors.colOnLayer1 + } + StyledText { + text: buttonText + Layout.fillWidth: false + font.pixelSize: Appearance.font.pixelSize.small + color: Appearance.colors.colOnLayer1 + } + } + +} \ No newline at end of file diff --git a/.config/quickshell/modules/sidebarRight/todo/TaskList.qml b/.config/quickshell/modules/sidebarRight/todo/TaskList.qml index 2b920d432..5da182e09 100644 --- a/.config/quickshell/modules/sidebarRight/todo/TaskList.qml +++ b/.config/quickshell/modules/sidebarRight/todo/TaskList.qml @@ -145,16 +145,16 @@ Item { MaterialSymbol { Layout.alignment: Qt.AlignHCenter - text: emptyPlaceholderIcon font.pixelSize: 55 color: Appearance.m3colors.m3outline + text: emptyPlaceholderIcon } StyledText { Layout.alignment: Qt.AlignHCenter - text: emptyPlaceholderText font.pixelSize: Appearance.font.pixelSize.normal color: Appearance.m3colors.m3outline horizontalAlignment: Text.AlignHCenter + text: emptyPlaceholderText } } } diff --git a/.config/quickshell/services/MprisController.qml b/.config/quickshell/services/MprisController.qml index be0c1939f..aa9f6ac7a 100644 --- a/.config/quickshell/services/MprisController.qml +++ b/.config/quickshell/services/MprisController.qml @@ -130,7 +130,7 @@ Singleton { function setActivePlayer(player: MprisPlayer) { const targetPlayer = player ?? Mpris.players[0]; - console.log(`setactive: ${targetPlayer} from ${activePlayer}`) + console.log(`[Mpris] Active player ${targetPlayer} << ${activePlayer}`) if (targetPlayer && this.activePlayer) { this.__reverse = Mpris.players.indexOf(targetPlayer) < Mpris.players.indexOf(this.activePlayer); diff --git a/.config/quickshell/services/Notifications.qml b/.config/quickshell/services/Notifications.qml index 98a3212d5..6b8967b88 100644 --- a/.config/quickshell/services/Notifications.qml +++ b/.config/quickshell/services/Notifications.qml @@ -66,6 +66,15 @@ Singleton { root.discard(id); } + function discardAll() { + root.list = [] + triggerListChange() + notifFileView.setText(JSON.stringify(root.list, null, 2)) + notifServer.trackedNotifications.values.forEach((notif) => { + notif.dismiss() + }) + } + function attemptInvokeAction(id, notifIdentifier) { const notifServerIndex = notifServer.trackedNotifications.values.findIndex((notif) => notif.id === id); if (notifServerIndex !== -1) {