mirror of
https://github.com/AvengeMedia/DankMaterialShell.git
synced 2025-12-07 22:15:38 -05:00
124 lines
4.6 KiB
QML
124 lines
4.6 KiB
QML
import QtQuick
|
|
import qs.Common
|
|
import qs.Services
|
|
import qs.Widgets
|
|
|
|
DankListView {
|
|
id: listView
|
|
|
|
property var keyboardController: null
|
|
property bool enableKeyboardNavigation: false
|
|
property int currentSelectedGroupIndex: -1
|
|
property bool keyboardActive: false
|
|
|
|
|
|
// Compatibility aliases for NotificationList
|
|
property alias count: listView.count
|
|
property alias listContentHeight: listView.contentHeight
|
|
|
|
clip: true
|
|
model: NotificationService.groupedNotifications
|
|
spacing: Theme.spacingL
|
|
|
|
NotificationEmptyState {
|
|
visible: listView.count === 0
|
|
anchors.centerIn: parent
|
|
}
|
|
|
|
// Override position restoration during keyboard nav
|
|
onModelChanged: {
|
|
if (keyboardController && keyboardController.keyboardNavigationActive) {
|
|
// Preserve scroll position during model updates
|
|
Qt.callLater(function() {
|
|
if (keyboardController && keyboardController.keyboardNavigationActive) {
|
|
keyboardController.ensureVisible()
|
|
}
|
|
})
|
|
}
|
|
}
|
|
|
|
delegate: Item {
|
|
required property var modelData
|
|
required property int index
|
|
|
|
readonly property bool isExpanded: NotificationService.expandedGroups[modelData?.key] || false
|
|
readonly property bool isHighlighted: {
|
|
if (!keyboardController) return false
|
|
keyboardController.selectionVersion // Trigger re-evaluation
|
|
if (!listView.keyboardActive) return false
|
|
const selection = keyboardController.getCurrentSelection()
|
|
return selection.type === "group" && selection.groupIndex === index
|
|
}
|
|
|
|
width: ListView.view.width
|
|
height: notificationCardWrapper.height
|
|
|
|
Item {
|
|
id: notificationCardWrapper
|
|
width: parent.width
|
|
height: notificationCard.height
|
|
|
|
NotificationCard {
|
|
id: notificationCard
|
|
width: parent.width
|
|
notificationGroup: modelData
|
|
|
|
isGroupSelected: {
|
|
// Force re-evaluation when selection changes
|
|
if (!keyboardController) return false
|
|
keyboardController.selectionVersion // Trigger re-evaluation
|
|
if (!listView.keyboardActive) return false
|
|
const selection = keyboardController.getCurrentSelection()
|
|
console.log("isGroupSelected check for index", index, "selection:", JSON.stringify(selection))
|
|
return selection.type === "group" && selection.groupIndex === index
|
|
}
|
|
selectedNotificationIndex: {
|
|
// Force re-evaluation when selection changes
|
|
if (!keyboardController) return -1
|
|
keyboardController.selectionVersion // Trigger re-evaluation
|
|
if (!listView.keyboardActive) return -1
|
|
const selection = keyboardController.getCurrentSelection()
|
|
return (selection.type === "notification" && selection.groupIndex === index)
|
|
? selection.notificationIndex : -1
|
|
}
|
|
keyboardNavigationActive: listView.keyboardActive
|
|
}
|
|
|
|
// Group-level overlay only for collapsed groups when selected
|
|
Rectangle {
|
|
anchors.fill: parent
|
|
visible: {
|
|
if (!isHighlighted) return false
|
|
if (!keyboardController) return false
|
|
const selection = keyboardController.getCurrentSelection()
|
|
// Only show group overlay when selecting collapsed groups
|
|
return selection.type === "group" && (!modelData || !NotificationService.expandedGroups[modelData.key])
|
|
}
|
|
|
|
color: Qt.rgba(Theme.primary.r, Theme.primary.g, Theme.primary.b, 0.2)
|
|
border.color: Theme.primary
|
|
border.width: 2
|
|
radius: Theme.cornerRadius
|
|
z: 10
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Connect to notification changes and rebuild navigation
|
|
Connections {
|
|
function onGroupedNotificationsChanged() {
|
|
if (keyboardController) {
|
|
if (keyboardController.isTogglingGroup) {
|
|
keyboardController.rebuildFlatNavigation()
|
|
return
|
|
}
|
|
|
|
keyboardController.rebuildFlatNavigation()
|
|
}
|
|
}
|
|
target: NotificationService
|
|
}
|
|
|
|
} |