Files
nix/home-configuration/config/quickshell/shell.qml
T
2026-08-21 04:43:52 +03:30

170 lines
6.3 KiB
QML

import Quickshell
import Quickshell.Wayland
import Quickshell.Services.Notifications
import QtQuick
import QtQuick.Layouts
import "config.js" as Config
Scope {
id: root
NotificationServer {
id: server
actionsSupported: true
bodySupported: true
imageSupported: true
onNotification: n => {
n.tracked = true
}
}
PanelWindow {
anchors { top: true; right: true }
margins { top: 12; right: 12 }
implicitWidth: 380
implicitHeight: Math.max(1, column.implicitHeight)
color: "transparent"
exclusionMode: ExclusionMode.Ignore
ColumnLayout {
id: column
width: parent.width
spacing: 10
Repeater {
model: server.trackedNotifications
delegate: Rectangle {
id: card
required property var modelData
Layout.fillWidth: true
implicitHeight: cardLayout.implicitHeight + 20
radius: 12
color: Config.colors.bgDark
border.color: hoverArea.containsMouse ? Config.colors.purple : "transparent"
border.width: 1
Behavior on border.color { ColorAnimation { duration: 150 } }
Timer {
id: dismissTimer
running: card.modelData.urgency !== NotificationUrgency.Critical && !hoverArea.containsMouse
interval: Config.notifications.timeout
repeat: false
onTriggered: card.modelData.dismiss()
}
Rectangle {
anchors.left: parent.left
anchors.top: parent.top
anchors.bottom: parent.bottom
width: 4
radius: 12
color: card.modelData.urgency === NotificationUrgency.Critical
? Config.colors.red
: Config.colors.purple
}
ColumnLayout {
id: cardLayout
anchors.fill: parent
anchors.margins: 10
anchors.leftMargin: 18
spacing: 8
RowLayout {
Layout.fillWidth: true
spacing: 10
Image {
Layout.preferredWidth: 36
Layout.preferredHeight: 36
Layout.alignment: Qt.AlignTop
fillMode: Image.PreserveAspectFit
visible: source.toString() !== ""
source: card.modelData.image || card.modelData.appIcon || ""
}
ColumnLayout {
Layout.fillWidth: true
spacing: 2
Text {
Layout.fillWidth: true
text: card.modelData.summary
color: Config.colors.cyan
font.family: Config.bar.fontFamily
font.pixelSize: Config.bar.fontSize
font.bold: true
elide: Text.ElideRight
}
Text {
Layout.fillWidth: true
visible: text !== ""
text: card.modelData.body
color: Config.colors.fg
font.family: Config.bar.fontFamily
font.pixelSize: Config.bar.fontSize - 1
wrapMode: Text.WordWrap
maximumLineCount: 4
elide: Text.ElideRight
}
}
}
RowLayout {
Layout.fillWidth: true
visible: card.modelData.actions.length > 0
spacing: 8
Repeater {
model: card.modelData.actions
delegate: Rectangle {
required property var modelData
Layout.fillWidth: true
Layout.preferredHeight: 26
radius: 6
color: actionArea.containsMouse ? Config.colors.purple : Qt.rgba(1, 1, 1, 0.05)
Text {
anchors.centerIn: parent
text: parent.modelData.text
color: Config.colors.fg
font.family: Config.bar.fontFamily
font.pixelSize: Config.bar.fontSize - 2
}
MouseArea {
id: actionArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: card.modelData.invokeAction(parent.modelData.identifier)
}
}
}
}
}
MouseArea {
id: hoverArea
anchors.fill: parent
hoverEnabled: true
cursorShape: Qt.PointingHandCursor
onClicked: card.modelData.dismiss()
z: -1
}
}
}
}
}
}