Files
nixos/other/quickshell/notifs/NotificationCenterView.qml

141 lines
3.5 KiB
QML

import QtQuick
import QtQuick.Controls
import QtQuick.Layouts
import Quickshell
import Quickshell.Io
import "../theme" as Theme
Rectangle {
id: root
width: 500
height: 1000
anchors.top: parent.top
anchors.bottom: parent.bottom
color: Theme.Colors.notificationCenterColor1
visible: true
ListModel {
id: notificationsModel
}
function toggleNotificationCenter() {
root.visible = !root.visible
if (root.visible)
reload()
}
FileView {
id: historyFile
path: Quickshell.env("HOME") + "/.cache/notify_history"
blockLoading: true
}
Process {
id: clearProcess
command: ["QS-notifycache"]
onExited: reload()
}
function reload() {
historyFile.reload()
notificationsModel.clear()
var text = historyFile.text()
if (!text || text.length === 0)
return
var lines = text.split("\n")
var i = 1
while (i < lines.length) {
var app = lines[i++] || ""
var title = lines[i++] || ""
var bodyLines = []
while (i < lines.length && !/^\d{2}:\d{2}:\d{2}$/.test(lines[i])) {
bodyLines.push(lines[i++])
}
if (i >= lines.length)
break
var time = lines[i++] || ""
var urgency = lines[i++] || "normal"
var body = bodyLines.join("\n")
// insert at beginning to invert order
notificationsModel.insert(0, {
app: app,
title: title,
body: body,
time: time,
urgency: urgency
})
}
}
Component.onCompleted: reload()
ColumnLayout {
anchors.fill: parent
spacing: 8
Button {
text: "Clear"
Layout.fillWidth: true
onClicked: {
clearProcess.running = true
}
}
ListView {
id: listView
Layout.fillWidth: true
Layout.fillHeight: true
model: notificationsModel
spacing: 10
clip: true
delegate: Rectangle {
width: ListView.width
color: Theme.Colors.notificationCenterColor1
border.color: Theme.Colors.notificationCenterColor3
border.width: 1
radius: 4
visible: true
Column {
id: columnContent
anchors.fill: parent
anchors.margins: 8
spacing: 4
Text {
text: time
color: Theme.Colors.notificationCenterColor4
width: ListView.width - 16
}
Text {
text: title
color: Theme.Colors.notificationCenterColor4
font.bold: true
wrapMode: Text.Wrap
width: ListView.width - 16
}
Text {
text: body
color: Theme.Colors.notificationCenterColor4
wrapMode: Text.Wrap
width: ListView.width - 16
}
}
height: 100 + columnContent.implicitHeight
}
}
}
}