Files
dotfiles/.config/quickshell/nucleus-shell/modules/interface/bar/Bar.qml

164 lines
6.2 KiB
QML

import QtQuick
import Quickshell
import Quickshell.Wayland
import qs.config
import qs.services
import qs.modules.components
Scope {
id: root
GothCorners {
opacity: ConfigResolver.bar(bar.displayName).gothCorners && !ConfigResolver.bar(bar.displayName).floating && ConfigResolver.bar(bar.displayName).enabled && !ConfigResolver.bar(bar.displayName).merged ? 1 : 0
}
Variants {
model: Quickshell.screens
PanelWindow {
// some exclusiveSpacing so it won't look like its sticking into the window when floating
id: bar
required property var modelData
property string displayName: modelData.name
property int rd: ConfigResolver.bar(displayName).radius * Config.runtime.appearance.rounding.factor // So it won't be modified when factor is 0
property int margin: ConfigResolver.bar(displayName).margins
property bool floating: ConfigResolver.bar(displayName).floating
property bool merged: ConfigResolver.bar(displayName).merged
property string pos: ConfigResolver.bar(displayName).position
property bool vertical: pos === "left" || pos === "right"
// Simple position properties
property bool attachedTop: pos === "top"
property bool attachedBottom: pos === "bottom"
property bool attachedLeft: pos === "left"
property bool attachedRight: pos === "right"
screen: modelData // Show bar on all screens
visible: ConfigResolver.bar(displayName).enabled && Config.initialized
WlrLayershell.namespace: "nucleus:bar"
exclusiveZone: ConfigResolver.bar(displayName).floating ? ConfigResolver.bar(displayName).density + Metrics.margin("tiny") : ConfigResolver.bar(displayName).density
implicitHeight: ConfigResolver.bar(displayName).density // density === height. (horizontal orientation)
implicitWidth: ConfigResolver.bar(displayName).density // density === width. (vertical orientation)
color: "transparent" // Keep panel window's color transparent, so that it can be modified by background rect
// This is probably a little weird way to set anchors but I think it's the best way. (and it works)
anchors {
top: ConfigResolver.bar(displayName).position === "top" || ConfigResolver.bar(displayName).position === "left" || ConfigResolver.bar(displayName).position === "right"
bottom: ConfigResolver.bar(displayName).position === "bottom" || ConfigResolver.bar(displayName).position === "left" || ConfigResolver.bar(displayName).position === "right"
left: ConfigResolver.bar(displayName).position === "left" || ConfigResolver.bar(displayName).position === "top" || ConfigResolver.bar(displayName).position === "bottom"
right: ConfigResolver.bar(displayName).position === "right" || ConfigResolver.bar(displayName).position === "top" || ConfigResolver.bar(displayName).position === "bottom"
}
margins {
top: {
if (floating)
return margin;
if (merged && vertical)
return margin;
return 0;
}
bottom: {
if (floating)
return margin;
if (merged && vertical)
return margin;
return 0;
}
left: {
if (floating)
return margin;
if (merged && !vertical)
return margin;
return 0;
}
right: {
if (floating)
return margin;
if (merged && !vertical)
return margin;
return 0;
}
}
StyledRect {
id: background
color: Appearance.m3colors.m3background
anchors.fill: parent
topLeftRadius: {
if (floating)
return rd;
if (!merged)
return 0;
return attachedBottom || attachedRight ? rd : 0;
}
topRightRadius: {
if (floating)
return rd;
if (!merged)
return 0;
return attachedBottom || attachedLeft ? rd : 0;
}
bottomLeftRadius: {
if (floating)
return rd;
if (!merged)
return 0;
return attachedTop || attachedRight ? rd : 0;
}
bottomRightRadius: {
if (floating)
return rd;
if (!merged)
return 0;
return attachedTop || attachedLeft ? rd : 0;
}
BarContent {
anchors.fill: parent
}
Behavior on bottomLeftRadius {
enabled: Config.runtime.appearance.animations.enabled
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on topLeftRadius {
enabled: Config.runtime.appearance.animations.enabled
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on bottomRightRadius {
enabled: Config.runtime.appearance.animations.enabled
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
Behavior on topRightRadius {
enabled: Config.runtime.appearance.animations.enabled
animation: Appearance.animation.elementMove.numberAnimation.createObject(this)
}
}
}
}
}