quickshell/modules/notifications/Notification.qml

133 lines
4.4 KiB
QML
Raw Normal View History

pragma ComponentBehavior: Bound
import QtQuick
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
import "."
import "../../"
import QtQuick.Layouts
import Quickshell.Widgets
import "../../settings/"
Variants {
model: Quickshell.screens
delegate: WlrLayershell {
id: root
required property var modelData
screen: modelData
anchors {
top: true
right: true
bottom: true
}
margins {
top: Settings.config.barHeight + 10
right: 10
left: 10
}
2026-01-17 23:19:54 +01:00
mask: Region {
item: notifList
}
implicitHeight: notifList.contentHeight + 20
implicitWidth: modelData.width / 8
layer: WlrLayer.Overlay
exclusionMode: ExclusionMode.Ignore
color: "transparent"
ListView {
id: notifList
anchors.top: parent.top
anchors.left: parent.left
anchors.right: parent.right
spacing: 10
height: contentHeight
model: NotiServer.trackedNotifications
delegate: Item {
id: notifyItem
required property var index
2026-01-17 23:19:54 +01:00
required property var modelData
anchors.right: parent ? parent.right : root.anchors.right
implicitWidth: root.modelData.width / 8
implicitHeight: notiIcon.implicitHeight + 20
2026-01-17 23:19:54 +01:00
Timer {
id: dismissTimer
interval: 5000
running: true
onTriggered: parent.modelData.dismiss()
}
Rectangle {
anchors.fill: parent
color: Colors.background
border.color: Colors.color5
border.width: 2
RowLayout {
id: fullLayout
anchors.margins: 10
anchors.fill: parent
spacing: 10
ClippingWrapperRectangle {
id: notiIcon
radius: 0
implicitWidth: 64
implicitHeight: 64
visible: notifyItem.modelData.image !== ""
IconImage {
source: notifyItem.modelData.image
visible: notifyItem.modelData.image !== ""
implicitSize: 30
asynchronous: true
}
}
ColumnLayout {
id: textLayout
Layout.fillWidth: true
Layout.alignment: Qt.AlignTop
spacing: 2
Text {
text: notifyItem.modelData.summary
color: Colors.foreground
font.family: Settings.config.font
font.pixelSize: Settings.config.fontSize
font.bold: true
elide: Text.ElideRight
Layout.fillWidth: true
2026-01-17 23:19:54 +01:00
onTextChanged: dismissTimer.restart()
}
Text {
text: notifyItem.modelData.body
color: Colors.foreground
font.family: Settings.config.font
font.pixelSize: Settings.config.fontSize - 2
maximumLineCount: 3
wrapMode: Text.WordWrap
elide: Text.ElideRight
Layout.fillWidth: true
}
}
}
MouseArea {
anchors.fill: parent
Layout.fillWidth: true
Layout.fillHeight: true
acceptedButtons: Qt.LeftButton
onClicked: notifyItem.modelData.dismiss()
}
}
}
}
}
}