diff options
| author | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-07-09 21:48:28 +1000 |
|---|---|---|
| committer | 2 * r + 2 * t <61896496+soramanew@users.noreply.github.com> | 2025-07-09 21:48:28 +1000 |
| commit | fbb939403832b0860302f1b400ad021794e1fadb (patch) | |
| tree | 06e116a06f6ac6845ec04bcfd9f74eef8e7aa2b1 | |
| parent | lock: fix notifs height on startup (diff) | |
| download | caelestia-shell-fbb939403832b0860302f1b400ad021794e1fadb.tar.gz caelestia-shell-fbb939403832b0860302f1b400ad021794e1fadb.tar.bz2 caelestia-shell-fbb939403832b0860302f1b400ad021794e1fadb.zip | |
notifs: add indicators for offscreen notifs
| -rw-r--r-- | modules/lock/Status.qml | 36 | ||||
| -rw-r--r-- | modules/notifications/Content.qml | 42 | ||||
| -rw-r--r-- | widgets/ExtraIndicator.qml | 52 |
3 files changed, 96 insertions, 34 deletions
diff --git a/modules/lock/Status.qml b/modules/lock/Status.qml index a3a0cac..65331b1 100644 --- a/modules/lock/Status.qml +++ b/modules/lock/Status.qml @@ -220,41 +220,9 @@ WrapperItem { } } - StyledRect { + ExtraIndicator { anchors.bottom: parent.bottom - anchors.right: parent.right - anchors.margins: Appearance.padding.normal - - color: Colours.palette.m3tertiaryContainer - radius: Appearance.rounding.small - - implicitWidth: count.implicitWidth + Appearance.padding.normal * 2 - implicitHeight: count.implicitHeight + Appearance.padding.small * 2 - - opacity: Notifs.list.length > Config.lock.maxNotifs ? 1 : 0 - scale: Notifs.list.length > Config.lock.maxNotifs ? 1 : 0.8 - - StyledText { - id: count - - anchors.centerIn: parent - text: qsTr("+%1").arg(Notifs.list.length - Config.lock.maxNotifs) - color: Colours.palette.m3onTertiaryContainer - } - - Behavior on opacity { - Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.standard - } - } - - Behavior on scale { - Anim { - duration: Appearance.anim.durations.expressiveFastSpatial - easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial - } - } + extra: Notifs.list.length - Config.lock.maxNotifs } } } diff --git a/modules/notifications/Content.qml b/modules/notifications/Content.qml index 6983b95..108f8d3 100644 --- a/modules/notifications/Content.qml +++ b/modules/notifications/Content.qml @@ -147,6 +147,48 @@ Item { property: "y" } } + + ExtraIndicator { + anchors.top: parent.top + extra: { + const count = list.count; + if (count === 0) + return 0; + + const scrollY = list.contentY; + + let height = 0; + for (let i = 0; i < count; i++) { + height += (list.itemAtIndex(i)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + + if (height - Appearance.spacing.smaller >= scrollY) + return i; + } + + return count; + } + } + + ExtraIndicator { + anchors.bottom: parent.bottom + extra: { + const count = list.count; + if (count === 0) + return 0; + + const scrollY = list.contentHeight - (list.contentY + list.height); + + let height = 0; + for (let i = count - 1; i >= 0; i--) { + height += (list.itemAtIndex(i)?.nonAnimHeight ?? 0) + Appearance.spacing.smaller; + + if (height - Appearance.spacing.smaller >= scrollY) + return count - i - 1; + } + + return 0; + } + } } } diff --git a/widgets/ExtraIndicator.qml b/widgets/ExtraIndicator.qml new file mode 100644 index 0000000..807cfaf --- /dev/null +++ b/widgets/ExtraIndicator.qml @@ -0,0 +1,52 @@ +import "root:/services" +import "root:/config" +import QtQuick +import QtQuick.Effects + +StyledRect { + required property int extra + + anchors.right: parent.right + anchors.margins: Appearance.padding.normal + + color: Colours.palette.m3tertiary + radius: Appearance.rounding.small + + implicitWidth: count.implicitWidth + Appearance.padding.normal * 2 + implicitHeight: count.implicitHeight + Appearance.padding.small * 2 + + layer.enabled: opacity > 0 + layer.effect: MultiEffect { + shadowEnabled: true + blurMax: 10 + shadowColor: Colours.palette.m3shadow + } + + opacity: extra > 0 ? 1 : 0 + scale: extra > 0 ? 1 : 0.5 + + StyledText { + id: count + + anchors.centerIn: parent + animate: parent.opacity > 0 + text: qsTr("+%1").arg(parent.extra) + color: Colours.palette.m3onTertiary + } + + Behavior on opacity { + NumberAnimation { + duration: Appearance.anim.durations.expressiveFastSpatial + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.standard + } + } + + Behavior on scale { + NumberAnimation { + duration: Appearance.anim.durations.expressiveFastSpatial + easing.type: Easing.BezierSpline + easing.bezierCurve: Appearance.anim.curves.expressiveFastSpatial + } + } +} |