nova-shell/modules/BarGroup.qml

124 lines
3.7 KiB
QML

import QtQuick
import QtQuick.Effects
import Quickshell
import "." as M
Item {
id: root
default property alias content: row.children
// Auto-compute border color from top gradient position (base0C → base09)
readonly property real _posFrac: {
const scr = QsWindow.window?.screen;
if (!scr)
return 0.5;
const gx = mapToGlobal(width / 2, 0).x - scr.x;
return Math.max(0, Math.min(1, gx / scr.width));
}
property color borderColor: Qt.rgba(M.Theme.base0C.r + (M.Theme.base09.r - M.Theme.base0C.r) * _posFrac, M.Theme.base0C.g + (M.Theme.base09.g - M.Theme.base0C.g) * _posFrac, M.Theme.base0C.b + (M.Theme.base09.b - M.Theme.base0C.b) * _posFrac, 1)
property bool leftEdge: false
property bool rightEdge: false
readonly property real _tlr: leftEdge ? M.Theme.screenRadius : M.Theme.radius
readonly property real _trr: rightEdge ? M.Theme.screenRadius : M.Theme.radius
readonly property real _blr: M.Theme.radius
readonly property real _brr: M.Theme.radius
visible: row.visibleChildren.length > 0
implicitWidth: row.implicitWidth + _pad * 2
implicitHeight: M.Theme.barHeight - 3 - _pad
readonly property int _pad: 6
// Shadow source — rendered offscreen, only its glow is visible
Rectangle {
id: shadowSource
anchors.fill: parent
color: "transparent"
border.color: root.borderColor
border.width: 1
topLeftRadius: root._tlr
topRightRadius: root._trr
bottomLeftRadius: root._blr
bottomRightRadius: root._brr
visible: false
}
MultiEffect {
source: shadowSource
anchors.fill: shadowSource
shadowEnabled: true
shadowColor: root.borderColor
shadowBlur: 1.0
shadowVerticalOffset: 0
shadowHorizontalOffset: 0
}
// Solid background
Rectangle {
anchors.fill: parent
topLeftRadius: root._tlr
topRightRadius: root._trr
bottomLeftRadius: root._blr
bottomRightRadius: root._brr
color: M.Theme.base01
}
// Accent gradient overlay
Rectangle {
anchors.fill: parent
topLeftRadius: root._tlr
topRightRadius: root._trr
bottomLeftRadius: root._blr
bottomRightRadius: root._brr
gradient: Gradient {
GradientStop {
position: 0
color: Qt.rgba(root.borderColor.r, root.borderColor.g, root.borderColor.b, 0.15)
}
GradientStop {
position: 1
color: "transparent"
}
}
}
// Visible border
Rectangle {
anchors.fill: parent
color: "transparent"
border.color: root.borderColor
border.width: 1
topLeftRadius: root._tlr
topRightRadius: root._trr
bottomLeftRadius: root._blr
bottomRightRadius: root._brr
}
Row {
id: row
property color accentColor: root.borderColor
anchors.centerIn: parent
spacing: M.Theme.moduleSpacing + 2
}
// Separator lines overlaid between visible row children
Repeater {
model: row.visibleChildren.length > 1 ? row.visibleChildren.length - 1 : 0
delegate: Rectangle {
required property int index
readonly property Item _left: row.visibleChildren[index]
readonly property real _rightEdge: _left ? _left.x + _left.width : 0
x: row.x + _rightEdge + row.spacing / 2
y: root._pad
width: 1
height: row.implicitHeight
color: Qt.rgba(root.borderColor.r, root.borderColor.g, root.borderColor.b, 0.4)
}
}
}