1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
|
pragma Singleton
import QtQml
import Quickshell
import Quickshell.Services.Notifications
Singleton {
id: root
property bool displayInhibited: false
property alias trackedNotifications: server.trackedNotifications
readonly property var groups: {
function matchesGroupKey(notif, groupKey) {
var matches = true;
for (const prop in groupKey.test) {
if (notif[prop] !== groupKey.test[prop]) {
matches = false;
break;
}
}
return matches;
}
var groups = new Map();
var notifs = new Array();
for (const [ix, notif] of server.trackedNotifications.values.entries()) {
var didGroup = false;
for (const groupKey of root.groupKeys) {
if (!matchesGroupKey(notif, groupKey))
continue;
const key = JSON.stringify({
"key": groupKey,
"values": Object.assign({}, ...(Array.from(groupKey["group-by"]).map(prop => {
var res = {};
res[prop] = notif[prop];
return res;
})))
});
if (!groups.has(key))
groups.set(key, new Array());
groups.get(key).push({ "ix": ix, "notif": notif });
didGroup = true;
break;
}
if (!didGroup)
notifs.push([{ "ix": ix, "notif": notif }]);
}
notifs.push(...groups.values());
notifs.sort((as, bs) => Math.min(...(as.map(o => o.ix))) - Math.min(...(bs.map(o => o.ix))));
return notifs.map(ns => ns.map(n => n.notif));
}
property var groupKeys: [
{ "test": { "appName": "Element" }, "group-by": [ "summary" ] }
];
Component {
id: expirationTimer
QtObject {
id: timer
required property QtObject parent
required property int expirationTime
property list<QtObject> data: [
Timer {
running: !root.displayInhibited
interval: timer.expirationTime
onTriggered: timer.parent.expire()
}
]
}
}
NotificationServer {
id: server
bodySupported: true
actionsSupported: true
actionIconsSupported: true
imageSupported: true
bodyMarkupSupported: true
bodyImagesSupported: true
onNotification: notification => {
var timeout = notification.expireTimeout * 1000;
if (notification.appName == "poweralertd")
timeout = 2000;
if (timeout > 0) {
Object.defineProperty(notification, "expirationTimer", { configurable: true, enumerable: true, writable: true });
notification.expirationTimer = expirationTimer.createObject(notification, { parent: notification, expirationTime: timeout });
}
notification.tracked = true;
}
}
}
|