60 lines
1.6 KiB
QML
60 lines
1.6 KiB
QML
// The banner stack: newest at the top, tucked under the bar on the right.
|
|
//
|
|
// The window is exactly as wide and tall as the stack, so everything outside
|
|
// it stays clickable; the mask trims it further to the cards themselves.
|
|
|
|
import QtQuick
|
|
import Quickshell
|
|
import Quickshell.Wayland
|
|
import qs.config
|
|
import qs.services
|
|
|
|
PanelWindow {
|
|
id: root
|
|
|
|
visible: !Notifs.doNotDisturb && Notifs.popups.length > 0
|
|
color: "transparent"
|
|
|
|
anchors.top: true
|
|
anchors.right: true
|
|
margins.top: Theme.barHeight + Theme.barGap * 2
|
|
margins.right: Theme.barSideMargin
|
|
exclusiveZone: 0
|
|
|
|
implicitWidth: 400
|
|
implicitHeight: Math.max(1, stack.implicitHeight)
|
|
|
|
WlrLayershell.namespace: "qs-notifications"
|
|
WlrLayershell.layer: WlrLayer.Overlay
|
|
|
|
// Normally inert so banners never steal a keystroke. An open inline reply
|
|
// is the one case where the surface has to be typeable.
|
|
WlrLayershell.keyboardFocus: root.replyFocused ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
|
|
|
|
property bool replyFocused: false
|
|
|
|
mask: Region {
|
|
item: stack
|
|
}
|
|
|
|
Column {
|
|
id: stack
|
|
anchors.top: parent.top
|
|
anchors.left: parent.left
|
|
anchors.right: parent.right
|
|
spacing: Theme.itemSpacing
|
|
|
|
Repeater {
|
|
model: Notifs.popups.slice(0, Settings.maxVisibleToasts)
|
|
|
|
Toast {
|
|
required property var modelData
|
|
|
|
width: stack.width
|
|
notification: modelData
|
|
onReplyFocusChanged: focused => root.replyFocused = focused
|
|
}
|
|
}
|
|
}
|
|
}
|