diff options
Diffstat (limited to 'modules/lock/NotifGroup.qml')
| -rw-r--r-- | modules/lock/NotifGroup.qml | 319 |
1 files changed, 0 insertions, 319 deletions
diff --git a/modules/lock/NotifGroup.qml b/modules/lock/NotifGroup.qml deleted file mode 100644 index 2a08c26..0000000 --- a/modules/lock/NotifGroup.qml +++ /dev/null @@ -1,319 +0,0 @@ -pragma ComponentBehavior: Bound - -import qs.components -import qs.components.effects -import qs.services -import qs.config -import qs.utils -import Quickshell -import Quickshell.Widgets -import Quickshell.Services.Notifications -import QtQuick -import QtQuick.Layouts - -StyledRect { - id: root - - required property string modelData - - readonly property list<var> notifs: Notifs.list.filter(notif => notif.appName === modelData) - readonly property string image: notifs.find(n => n.image.length > 0)?.image ?? "" - readonly property string appIcon: notifs.find(n => n.appIcon.length > 0)?.appIcon ?? "" - readonly property string urgency: notifs.some(n => n.urgency === NotificationUrgency.Critical) ? "critical" : notifs.some(n => n.urgency === NotificationUrgency.Normal) ? "normal" : "low" - - property bool expanded - - anchors.left: parent?.left - anchors.right: parent?.right - implicitHeight: content.implicitHeight + Appearance.padding.normal * 2 - - clip: true - radius: Appearance.rounding.normal - color: root.urgency === "critical" ? Colours.palette.m3secondaryContainer : Colours.layer(Colours.palette.m3surfaceContainerHigh, 2) - - RowLayout { - id: content - - anchors.left: parent.left - anchors.right: parent.right - anchors.top: parent.top - anchors.margins: Appearance.padding.normal - - spacing: Appearance.spacing.normal - - Item { - Layout.alignment: Qt.AlignLeft | Qt.AlignTop - implicitWidth: Config.notifs.sizes.image - implicitHeight: Config.notifs.sizes.image - - Component { - id: imageComp - - Image { - source: Qt.resolvedUrl(root.image) - fillMode: Image.PreserveAspectCrop - cache: false - asynchronous: true - width: Config.notifs.sizes.image - height: Config.notifs.sizes.image - } - } - - Component { - id: appIconComp - - ColouredIcon { - implicitSize: Math.round(Config.notifs.sizes.image * 0.6) - source: Quickshell.iconPath(root.appIcon) - colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - layer.enabled: root.appIcon.endsWith("symbolic") - } - } - - Component { - id: materialIconComp - - MaterialIcon { - text: Icons.getNotifIcon(root.notifs[0]?.summary, root.urgency) - color: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - font.pointSize: Appearance.font.size.large - } - } - - ClippingRectangle { - anchors.fill: parent - color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.layer(Colours.palette.m3surfaceContainerHighest, 3) : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full - - Loader { - anchors.centerIn: parent - asynchronous: true - sourceComponent: root.image ? imageComp : root.appIcon ? appIconComp : materialIconComp - } - } - - Loader { - anchors.right: parent.right - anchors.bottom: parent.bottom - asynchronous: true - active: root.appIcon && root.image - - sourceComponent: StyledRect { - implicitWidth: Config.notifs.sizes.badge - implicitHeight: Config.notifs.sizes.badge - - color: root.urgency === "critical" ? Colours.palette.m3error : root.urgency === "low" ? Colours.palette.m3surfaceContainerHighest : Colours.palette.m3secondaryContainer - radius: Appearance.rounding.full - - ColouredIcon { - anchors.centerIn: parent - implicitSize: Math.round(Config.notifs.sizes.badge * 0.6) - source: Quickshell.iconPath(root.appIcon) - colour: root.urgency === "critical" ? Colours.palette.m3onError : root.urgency === "low" ? Colours.palette.m3onSurface : Colours.palette.m3onSecondaryContainer - layer.enabled: root.appIcon.endsWith("symbolic") - } - } - } - } - - ColumnLayout { - Layout.topMargin: -Appearance.padding.small - Layout.bottomMargin: -Appearance.padding.small / 2 - (root.expanded ? 0 : spacing) - Layout.fillWidth: true - spacing: Math.round(Appearance.spacing.small / 2) - - RowLayout { - Layout.bottomMargin: -parent.spacing - Layout.fillWidth: true - spacing: Appearance.spacing.smaller - - StyledText { - Layout.fillWidth: true - text: root.modelData - color: Colours.palette.m3onSurfaceVariant - font.pointSize: Appearance.font.size.small - elide: Text.ElideRight - } - - StyledText { - animate: true - text: root.notifs[0]?.timeStr ?? "" - color: Colours.palette.m3outline - font.pointSize: Appearance.font.size.small - } - - StyledRect { - implicitWidth: expandBtn.implicitWidth + Appearance.padding.smaller * 2 - implicitHeight: groupCount.implicitHeight + Appearance.padding.small - - color: root.urgency === "critical" ? Colours.palette.m3error : Colours.layer(Colours.palette.m3surfaceContainerHighest, 2) - radius: Appearance.rounding.full - - opacity: root.notifs.length > Config.notifs.groupPreviewNum ? 1 : 0 - Layout.preferredWidth: root.notifs.length > Config.notifs.groupPreviewNum ? implicitWidth : 0 - - StateLayer { - color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface - - function onClicked(): void { - root.expanded = !root.expanded; - } - } - - RowLayout { - id: expandBtn - - anchors.centerIn: parent - spacing: Appearance.spacing.small / 2 - - StyledText { - id: groupCount - - Layout.leftMargin: Appearance.padding.small / 2 - animate: true - text: root.notifs.length - color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface - font.pointSize: Appearance.font.size.small - } - - MaterialIcon { - Layout.rightMargin: -Appearance.padding.small / 2 - animate: true - text: root.expanded ? "expand_less" : "expand_more" - color: root.urgency === "critical" ? Colours.palette.m3onError : Colours.palette.m3onSurface - } - } - - Behavior on opacity { - Anim {} - } - - Behavior on Layout.preferredWidth { - Anim {} - } - } - } - - Repeater { - model: ScriptModel { - values: root.notifs.slice(0, Config.notifs.groupPreviewNum) - } - - NotifLine { - id: notif - - ParallelAnimation { - running: true - - Anim { - target: notif - property: "opacity" - from: 0 - to: 1 - } - Anim { - target: notif - property: "scale" - from: 0.7 - to: 1 - } - Anim { - target: notif.Layout - property: "preferredHeight" - from: 0 - to: notif.implicitHeight - } - } - - ParallelAnimation { - running: notif.modelData.closed - onFinished: notif.modelData.unlock(notif) - - Anim { - target: notif - property: "opacity" - to: 0 - } - Anim { - target: notif - property: "scale" - to: 0.7 - } - Anim { - target: notif.Layout - property: "preferredHeight" - to: 0 - } - } - } - } - - Loader { - Layout.fillWidth: true - - opacity: root.expanded ? 1 : 0 - Layout.preferredHeight: root.expanded ? implicitHeight : 0 - active: opacity > 0 - asynchronous: true - - sourceComponent: ColumnLayout { - Repeater { - model: ScriptModel { - values: root.notifs.slice(Config.notifs.groupPreviewNum) - } - - NotifLine {} - } - } - - Behavior on opacity { - Anim {} - } - } - } - } - - Behavior on implicitHeight { - Anim { - duration: Appearance.anim.durations.expressiveDefaultSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial - } - } - - component NotifLine: StyledText { - id: notifLine - - required property Notifs.Notif modelData - - Layout.fillWidth: true - textFormat: Text.MarkdownText - text: { - const summary = modelData.summary.replace(/\n/g, " "); - const body = modelData.body.replace(/\n/g, " "); - const colour = root.urgency === "critical" ? Colours.palette.m3secondary : Colours.palette.m3outline; - - if (metrics.text === metrics.elidedText) - return `${summary} <span style='color:${colour}'>${body}</span>`; - - const t = metrics.elidedText.length - 3; - if (t < summary.length) - return `${summary.slice(0, t)}...`; - - return `${summary} <span style='color:${colour}'>${body.slice(0, t - summary.length)}...</span>`; - } - color: root.urgency === "critical" ? Colours.palette.m3onSecondaryContainer : Colours.palette.m3onSurface - - Component.onCompleted: modelData.lock(this) - Component.onDestruction: modelData.unlock(this) - - TextMetrics { - id: metrics - - text: `${notifLine.modelData.summary} ${notifLine.modelData.body}`.replace(/\n/g, " ") - font.pointSize: notifLine.font.pointSize - font.family: notifLine.font.family - elideWidth: notifLine.width - elide: Text.ElideRight - } - } -} |