feat: add notification module with functionality to display notifications on focused monitor with a NotificationServer as Singleton
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Services.Notifications
|
||||
import "../../config"
|
||||
import "./notificationServer"
|
||||
|
||||
PanelWindow {
|
||||
mask: Region {}
|
||||
|
||||
id: notificationWindow
|
||||
|
||||
anchors.top: true
|
||||
anchors.left: true
|
||||
|
||||
implicitHeight: screen.height/6
|
||||
implicitWidth: screen.width/6
|
||||
|
||||
color: "transparent"
|
||||
|
||||
Connections {
|
||||
target: NotificationS
|
||||
|
||||
function onNotificationReceived(notification) {
|
||||
if (!NotificationS.correctMonitor(screen))
|
||||
return
|
||||
if (NotificationS.correctMonitor(screen)) {
|
||||
console.log("[Notification]: This notification belongs to me!", screen.x, screen.y)
|
||||
// currentNotifications.push(notification)
|
||||
// currentNotifications = currentNotifications
|
||||
currentNotification = notification
|
||||
currentNotifications = currentNotifications.concat([notification])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
property var currentNotification: null
|
||||
property var currentNotifications: []
|
||||
|
||||
Rectangle {
|
||||
anchors.fill: parent
|
||||
|
||||
border.width: Config.border_width
|
||||
border.color: Colors.primary
|
||||
color: "transparent"
|
||||
|
||||
Column {
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
spacing: 5
|
||||
|
||||
Repeater {
|
||||
model: currentNotifications
|
||||
|
||||
delegate: NotificationBody {
|
||||
required property int index
|
||||
|
||||
notification: currentNotifications[index]
|
||||
width: notificationWindow.width
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Component.onCompleted: {
|
||||
console.log(
|
||||
"[Notification]:",
|
||||
NotificationS,
|
||||
"notification:",
|
||||
NotificationS.newestNotification
|
||||
|
||||
)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import "../../config"
|
||||
|
||||
Rectangle {
|
||||
id: root
|
||||
|
||||
required property var notification
|
||||
|
||||
|
||||
Component.onCompleted: {
|
||||
console.log(
|
||||
"[NotificationBody]:",
|
||||
notification,
|
||||
"notification:",
|
||||
notification.appName
|
||||
)
|
||||
}
|
||||
|
||||
implicitWidth: parent ? parent.width : 300
|
||||
implicitHeight: content.implicitHeight + 20
|
||||
|
||||
color: "transparent"
|
||||
|
||||
border.width: Config.border_width
|
||||
border.color: Colors.primary
|
||||
|
||||
Column {
|
||||
id: content
|
||||
|
||||
anchors.fill: parent
|
||||
anchors.margins: 10
|
||||
|
||||
spacing: 5
|
||||
|
||||
Text {
|
||||
width: parent.width
|
||||
|
||||
text: root.notification?.appName ?? ""
|
||||
font.family: Config.font
|
||||
font.pixelSize: 18
|
||||
color: Colors.primary
|
||||
|
||||
elide: Text.ElideRight
|
||||
}
|
||||
|
||||
Text {
|
||||
width: parent.width
|
||||
|
||||
text: root.notification?.summary ?? ""
|
||||
font.family: Config.font
|
||||
font.pixelSize: 22
|
||||
color: Colors.primary
|
||||
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
|
||||
Text {
|
||||
width: parent.width
|
||||
|
||||
text: root.notification?.body ?? ""
|
||||
font.family: Config.font
|
||||
font.pixelSize: 16
|
||||
color: Colors.primary
|
||||
|
||||
wrapMode: Text.Wrap
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import "./notificationServer"
|
||||
|
||||
|
||||
Item {
|
||||
id: notification_root
|
||||
Repeater { // Bars
|
||||
model: Quickshell.screens
|
||||
delegate: Loader {
|
||||
active: true // loads object
|
||||
sourceComponent: Notification {screen: modelData} // creates instance of bar component
|
||||
}
|
||||
}
|
||||
|
||||
Component.onCompleted: {
|
||||
console.log("[NotificationLoader]:", NotificationS)
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
pragma Singleton
|
||||
|
||||
import QtQuick
|
||||
import Quickshell
|
||||
import Quickshell.Hyprland
|
||||
import Quickshell.Services.Notifications
|
||||
|
||||
Item {
|
||||
id: notificationServerState
|
||||
|
||||
property var focusedMonitor: null
|
||||
property var newestNotification: null
|
||||
property var trackedNotifications: [] // TODO
|
||||
|
||||
signal notificationReceived(var notification)
|
||||
|
||||
function correctMonitor(screen) {
|
||||
return (Hyprland.monitorFor(screen) === focusedMonitor)
|
||||
}
|
||||
|
||||
NotificationServer {
|
||||
id: notificationServer
|
||||
onNotification: function(notification) {
|
||||
if(notification.lastGeneration){
|
||||
console.log(
|
||||
"[NotificationServer] Closing Notification:",
|
||||
notification.appName, notification.id, notification.summary, notification.body
|
||||
)
|
||||
notification.dismiss()
|
||||
return
|
||||
}
|
||||
notification.tracked = true
|
||||
console.log(
|
||||
"[NotificationServer] Notification received:",
|
||||
notification.appName, notification.id, notification.summary, notification.body
|
||||
)
|
||||
notificationReceived(notification)
|
||||
Hyprland.refreshMonitors()
|
||||
waitTimer.start()
|
||||
}
|
||||
}
|
||||
|
||||
Timer {
|
||||
id: waitTimer
|
||||
interval: 2000
|
||||
repeat: false
|
||||
onTriggered: focusedMonitor = Hyprland.focusedMonitor
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1 @@
|
||||
singleton NotificationS NotificationServer.qml
|
||||
Reference in New Issue
Block a user