mirror of
https://github.com/danbulant/dots-hyprland
synced 2026-05-19 04:08:48 +00:00
257 lines
10 KiB
QML
257 lines
10 KiB
QML
import "./weather"
|
|
import QtQuick
|
|
import QtQuick.Layouts
|
|
import Quickshell
|
|
import Quickshell.Io
|
|
import Quickshell.Wayland
|
|
import Quickshell.Hyprland
|
|
import Quickshell.Services.UPower
|
|
import qs
|
|
import qs.services
|
|
import qs.modules.common
|
|
import qs.modules.common.widgets
|
|
import qs.modules.common.functions
|
|
|
|
Scope {
|
|
id: bar
|
|
property bool showBarBackground: Config.options.bar.showBackground
|
|
|
|
Variants {
|
|
// For each monitor
|
|
model: {
|
|
const screens = Quickshell.screens;
|
|
const list = Config.options.bar.screenList;
|
|
if (!list || list.length === 0)
|
|
return screens;
|
|
return screens.filter(screen => list.includes(screen.name));
|
|
}
|
|
LazyLoader {
|
|
id: barLoader
|
|
active: GlobalStates.barOpen && !GlobalStates.screenLocked
|
|
required property ShellScreen modelData
|
|
component: PanelWindow { // Bar window
|
|
id: barRoot
|
|
screen: barLoader.modelData
|
|
|
|
property var brightnessMonitor: Brightness.getMonitorForScreen(barLoader.modelData)
|
|
property real useShortenedForm: (Appearance.sizes.barHellaShortenScreenWidthThreshold >= screen.width) ? 2 : (Appearance.sizes.barShortenScreenWidthThreshold >= screen.width) ? 1 : 0
|
|
readonly property int centerSideModuleWidth: (useShortenedForm == 2) ? Appearance.sizes.barCenterSideModuleWidthHellaShortened : (useShortenedForm == 1) ? Appearance.sizes.barCenterSideModuleWidthShortened : Appearance.sizes.barCenterSideModuleWidth
|
|
|
|
Timer {
|
|
id: showBarTimer
|
|
interval: (Config?.options.bar.autoHide.showWhenPressingSuper.delay ?? 100)
|
|
repeat: false
|
|
onTriggered: {
|
|
barRoot.superShow = true
|
|
}
|
|
}
|
|
Connections {
|
|
target: GlobalStates
|
|
function onSuperDownChanged() {
|
|
if (!Config?.options.bar.autoHide.showWhenPressingSuper.enable) return;
|
|
if (GlobalStates.superDown) showBarTimer.restart();
|
|
else {
|
|
showBarTimer.stop();
|
|
barRoot.superShow = false;
|
|
}
|
|
}
|
|
}
|
|
property bool superShow: false
|
|
property bool mustShow: hoverRegion.containsMouse || superShow
|
|
exclusionMode: ExclusionMode.Ignore
|
|
exclusiveZone: (Config?.options.bar.autoHide.enable && (!mustShow || !Config?.options.bar.autoHide.pushWindows)) ? 0 :
|
|
Appearance.sizes.baseBarHeight + (Config.options.bar.cornerStyle === 1 ? Appearance.sizes.hyprlandGapsOut : 0)
|
|
WlrLayershell.namespace: "quickshell:bar"
|
|
implicitHeight: Appearance.sizes.barHeight + Appearance.rounding.screenRounding
|
|
mask: Region {
|
|
item: hoverMaskRegion
|
|
}
|
|
color: "transparent"
|
|
|
|
anchors {
|
|
top: !Config.options.bar.bottom
|
|
bottom: Config.options.bar.bottom
|
|
left: true
|
|
right: true
|
|
}
|
|
|
|
margins {
|
|
right: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.right) * -1
|
|
bottom: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.bottom) * -1
|
|
}
|
|
|
|
MouseArea {
|
|
id: hoverRegion
|
|
hoverEnabled: true
|
|
anchors {
|
|
fill: parent
|
|
rightMargin: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.right) * 1
|
|
bottomMargin: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.bottom) * 1
|
|
}
|
|
|
|
Item {
|
|
id: hoverMaskRegion
|
|
anchors {
|
|
fill: barContent
|
|
topMargin: -1
|
|
bottomMargin: -1
|
|
}
|
|
}
|
|
|
|
BarContent {
|
|
id: barContent
|
|
|
|
implicitHeight: Appearance.sizes.barHeight
|
|
anchors {
|
|
right: parent.right
|
|
left: parent.left
|
|
top: parent.top
|
|
bottom: undefined
|
|
topMargin: (Config?.options.bar.autoHide.enable && !mustShow) ? -Appearance.sizes.barHeight : 0
|
|
bottomMargin: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.bottom) * -1
|
|
rightMargin: (Config.options.interactions.deadPixelWorkaround.enable && barRoot.anchors.right) * -1
|
|
}
|
|
Behavior on anchors.topMargin {
|
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
|
}
|
|
Behavior on anchors.bottomMargin {
|
|
animation: Appearance.animation.elementMoveFast.numberAnimation.createObject(this)
|
|
}
|
|
|
|
states: State {
|
|
name: "bottom"
|
|
when: Config.options.bar.bottom
|
|
AnchorChanges {
|
|
target: barContent
|
|
anchors {
|
|
right: parent.right
|
|
left: parent.left
|
|
top: undefined
|
|
bottom: parent.bottom
|
|
}
|
|
}
|
|
PropertyChanges {
|
|
target: barContent
|
|
anchors.topMargin: 0
|
|
anchors.bottomMargin: (Config?.options.bar.autoHide.enable && !mustShow) ? -Appearance.sizes.barHeight : 0
|
|
}
|
|
}
|
|
}
|
|
|
|
// Round decorators
|
|
Loader {
|
|
id: roundDecorators
|
|
anchors {
|
|
left: parent.left
|
|
right: parent.right
|
|
top: barContent.bottom
|
|
bottom: undefined
|
|
}
|
|
height: Appearance.rounding.screenRounding
|
|
active: showBarBackground && Config.options.bar.cornerStyle === 0 // Hug
|
|
|
|
states: State {
|
|
name: "bottom"
|
|
when: Config.options.bar.bottom
|
|
AnchorChanges {
|
|
target: roundDecorators
|
|
anchors {
|
|
right: parent.right
|
|
left: parent.left
|
|
top: undefined
|
|
bottom: barContent.top
|
|
}
|
|
}
|
|
}
|
|
|
|
sourceComponent: Item {
|
|
implicitHeight: Appearance.rounding.screenRounding
|
|
RoundCorner {
|
|
id: leftCorner
|
|
anchors {
|
|
top: parent.top
|
|
bottom: parent.bottom
|
|
left: parent.left
|
|
}
|
|
|
|
implicitSize: Appearance.rounding.screenRounding
|
|
color: showBarBackground ? Appearance.colors.colLayer0 : "transparent"
|
|
|
|
corner: RoundCorner.CornerEnum.TopLeft
|
|
states: State {
|
|
name: "bottom"
|
|
when: Config.options.bar.bottom
|
|
PropertyChanges {
|
|
leftCorner.corner: RoundCorner.CornerEnum.BottomLeft
|
|
}
|
|
}
|
|
}
|
|
RoundCorner {
|
|
id: rightCorner
|
|
anchors {
|
|
right: parent.right
|
|
top: !Config.options.bar.bottom ? parent.top : undefined
|
|
bottom: Config.options.bar.bottom ? parent.bottom : undefined
|
|
}
|
|
implicitSize: Appearance.rounding.screenRounding
|
|
color: showBarBackground ? Appearance.colors.colLayer0 : "transparent"
|
|
|
|
corner: RoundCorner.CornerEnum.TopRight
|
|
states: State {
|
|
name: "bottom"
|
|
when: Config.options.bar.bottom
|
|
PropertyChanges {
|
|
rightCorner.corner: RoundCorner.CornerEnum.BottomRight
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
IpcHandler {
|
|
target: "bar"
|
|
|
|
function toggle(): void {
|
|
GlobalStates.barOpen = !GlobalStates.barOpen
|
|
}
|
|
|
|
function close(): void {
|
|
GlobalStates.barOpen = false
|
|
}
|
|
|
|
function open(): void {
|
|
GlobalStates.barOpen = true
|
|
}
|
|
}
|
|
|
|
GlobalShortcut {
|
|
name: "barToggle"
|
|
description: "Toggles bar on press"
|
|
|
|
onPressed: {
|
|
GlobalStates.barOpen = !GlobalStates.barOpen;
|
|
}
|
|
}
|
|
|
|
GlobalShortcut {
|
|
name: "barOpen"
|
|
description: "Opens bar on press"
|
|
|
|
onPressed: {
|
|
GlobalStates.barOpen = true;
|
|
}
|
|
}
|
|
|
|
GlobalShortcut {
|
|
name: "barClose"
|
|
description: "Closes bar on press"
|
|
|
|
onPressed: {
|
|
GlobalStates.barOpen = false;
|
|
}
|
|
}
|
|
}
|