Files
z-bar-qt/Modules/Sidebar/NotifDockList.qml
T
zach 11e7aac195
C++ / fmt (pull_request) Failing after 5s
C++ / build (pull_request) Failing after 11s
C++ / clang-tidy (pull_request) Failing after 10s
JS/TS / fmt (pull_request) Successful in 12s
JS/TS / lint (pull_request) Successful in 10s
Python / static (pull_request) Failing after 27s
Rust / build (pull_request) Successful in 54s
Python / verify (pull_request) Failing after 1m26s
Rust / fmt (pull_request) Successful in 46s
Rust / clippy (pull_request) Successful in 1m6s
feat: better notification storage and image caching + blobs
2026-11-02 19:00:43 +01:00

153 lines
3.1 KiB
QML

pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import ZShell.Components
import ZShell.Config
import ZShell.Services
import qs.Components
import qs.Components.Notifs
import qs.Daemons
import qs.Services
LazyListView {
id: root
required property Flickable container
required property ScreenState screenState
anchors.left: parent?.left
anchors.right: parent?.right
implicitHeight: contentHeight
spacing: Tokens.spacing.small
readyDelay: 1
cacheBuffer: 400
asynchronous: true
onViewportAdjustNeeded: d => {
if (contentYAnim.running)
contentYAnim.complete();
contentYAnim.to = Math.max(0, container.contentY + d);
contentYAnim.start();
}
useCustomViewport: true
viewport: Qt.rect(0, container.contentY, width, container.height)
removeDuration: Tokens.anim.durations.normal
model: ScriptModel {
values: [...NotifServer.groups]
}
delegate: Component {
NotifSwipeArea {
id: notif
required property int index
required property NotificationGroup modelData
readonly property bool closed: card.notifs.length === 0
function toggleExpand(expand: bool): void {
if (expand) {
if (!expanded)
root.screenState.expandedNotifs.push(modelData.appName);
} else if (expanded) {
root.screenState.expandedNotifs.splice(root.screenState.expandedNotifs.indexOf(modelData.appName), 1);
}
}
function closeAll(): void {
clearTimer.start();
}
Component.onDestruction: {
if (closed && expanded)
toggleExpand(false);
}
LazyListView.trackViewport: !expanded && card.nonAnimHeight < card.implicitHeight
LazyListView.preferredHeight: closed ? 0 : card.nonAnimHeight
LazyListView.visibleHeight: card.implicitHeight
implicitHeight: card.implicitHeight
opacity: LazyListView.removing || closed || LazyListView.adding ? 0 : 1
scale: LazyListView.adding ? 0 : 1
expanded: root.screenState.expandedNotifs.includes(modelData.appName)
enabled: !closed
onClosedChanged: {
if (closed)
slideOut.start();
}
onRequestExpand: expand => toggleExpand(expand)
onSwiped: closeAll()
onDismissed: closeAll()
Anim {
id: slideOut
target: notif
property: "x"
to: notif.x >= 0 ? notif.width : -notif.width
}
Timer {
id: clearTimer
interval: 15
repeat: true
triggeredOnStart: true
onTriggered: {
const notifs = [...notif.modelData.activeNotifs];
if (notifs.length === 0) {
stop();
return;
}
for (const n of notifs.slice(0, 30))
n.dismiss();
}
}
NotifGroupCard {
id: card
group: notif.modelData
container: root.container
expanded: notif.expanded
baseLayer: 1
onRequestExpand: expand => notif.toggleExpand(expand)
onSwiped: notif => notif.dismiss()
onLinkActivated: root.screenState.sidebar = false
}
Behavior on y {
enabled: notif.LazyListView.ready
Anim {}
}
Behavior on opacity {
Anim {
type: Anim.DefaultEffects
}
}
Behavior on scale {
Anim {}
}
}
}
Anim {
id: contentYAnim
target: root.container
property: "contentY"
}
}