summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-07 14:47:24 +1000
committer2 * r + 2 * t <61896496+soramanew@users.noreply.github.com>2025-06-07 14:47:24 +1000
commite3dcdbb67cba35d90fbf5d437466d11776fe8412 (patch)
tree192e3787eb1ab45463cb27b35c595466912da4ed
parentdashboard: make own swipeview impl (diff)
downloadcaelestia-shell-e3dcdbb67cba35d90fbf5d437466d11776fe8412.tar.gz
caelestia-shell-e3dcdbb67cba35d90fbf5d437466d11776fe8412.tar.bz2
caelestia-shell-e3dcdbb67cba35d90fbf5d437466d11776fe8412.zip
internal: move bar to drawer window
Fixes a few bugs, also removes need for hyprland order layerrule
-rw-r--r--modules/bar/Bar.qml158
-rw-r--r--modules/bar/Content.qml174
-rw-r--r--modules/bar/components/workspaces/Workspaces.qml2
-rw-r--r--modules/drawers/Backgrounds.qml3
-rw-r--r--modules/drawers/Border.qml3
-rw-r--r--modules/drawers/Drawers.qml23
-rw-r--r--modules/drawers/Exclusions.qml3
-rw-r--r--modules/drawers/Interactions.qml11
-rw-r--r--modules/drawers/Panels.qml2
-rw-r--r--services/Visibilities.qml1
-rw-r--r--shell.qml2
11 files changed, 179 insertions, 203 deletions
diff --git a/modules/bar/Bar.qml b/modules/bar/Bar.qml
index 8860e47..914ee24 100644
--- a/modules/bar/Bar.qml
+++ b/modules/bar/Bar.qml
@@ -1,30 +1,158 @@
import "root:/widgets"
+import "root:/services"
import "root:/config"
+import "components"
+import "components/workspaces"
import Quickshell
import QtQuick
-Variants {
- model: Quickshell.screens
+Item {
+ id: root
- StyledWindow {
- id: win
+ required property ShellScreen screen
- required property ShellScreen modelData
+ function checkPopout(y: real): void {
+ const spacing = Appearance.spacing.small;
+ const aw = activeWindow.child;
+ const awy = activeWindow.y + aw.y;
- screen: modelData
- name: "bar"
+ const ty = tray.y;
+ const th = tray.implicitHeight;
+ const trayItems = tray.items;
- implicitWidth: content.implicitWidth
- exclusiveZone: content.implicitWidth
+ const n = statusIconsInner.network;
+ const ny = statusIcons.y + statusIconsInner.y + n.y - spacing / 2;
- anchors.top: true
- anchors.bottom: true
- anchors.left: true
+ const bls = statusIcons.y + statusIconsInner.y + statusIconsInner.bs - spacing / 2;
+ const ble = statusIcons.y + statusIconsInner.y + statusIconsInner.be + spacing / 2;
- Content {
- id: content
+ const b = statusIconsInner.battery;
+ const by = statusIcons.y + statusIconsInner.y + b.y - spacing / 2;
- screen: win.modelData
+ if (y >= awy && y <= awy + aw.implicitHeight) {
+ Popouts.currentName = "activewindow";
+ Popouts.currentCenter = Qt.binding(() => activeWindow.y + aw.y + aw.implicitHeight / 2);
+ Popouts.hasCurrent = true;
+ } else if (y > ty && y < ty + th) {
+ const index = Math.floor(((y - ty) / th) * trayItems.count);
+ const item = trayItems.itemAt(index);
+
+ Popouts.currentName = `traymenu${index}`;
+ Popouts.currentCenter = Qt.binding(() => tray.y + item.y + item.implicitHeight / 2);
+ Popouts.hasCurrent = true;
+ } else if (y >= ny && y <= ny + n.implicitHeight + spacing) {
+ Popouts.currentName = "network";
+ Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + n.y + n.implicitHeight / 2);
+ Popouts.hasCurrent = true;
+ } else if (y >= bls && y <= ble) {
+ Popouts.currentName = "bluetooth";
+ Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + statusIconsInner.bs + (statusIconsInner.be - statusIconsInner.bs) / 2);
+ Popouts.hasCurrent = true;
+ } else if (y >= by && y <= by + b.implicitHeight + spacing) {
+ Popouts.currentName = "battery";
+ Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + b.y + b.implicitHeight / 2);
+ Popouts.hasCurrent = true;
+ } else {
+ Popouts.hasCurrent = false;
+ }
+ }
+
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.left: parent.left
+
+ implicitWidth: child.implicitWidth + BorderConfig.thickness * 2
+
+ Item {
+ id: child
+
+ anchors.top: parent.top
+ anchors.bottom: parent.bottom
+ anchors.horizontalCenter: parent.horizontalCenter
+
+ implicitWidth: Math.max(osIcon.implicitWidth, workspaces.implicitWidth, activeWindow.implicitWidth, tray.implicitWidth, clock.implicitWidth, statusIcons.implicitWidth, power.implicitWidth)
+
+ OsIcon {
+ id: osIcon
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: parent.top
+ anchors.topMargin: Appearance.padding.large
+ }
+
+ StyledClippingRect {
+ id: workspaces
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: osIcon.bottom
+ anchors.topMargin: Appearance.spacing.normal
+
+ radius: Appearance.rounding.full
+ color: Colours.palette.m3surfaceContainer
+
+ implicitWidth: workspacesInner.implicitWidth + Appearance.padding.small * 2
+ implicitHeight: workspacesInner.implicitHeight + Appearance.padding.small * 2
+
+ Workspaces {
+ id: workspacesInner
+
+ anchors.centerIn: parent
+ }
+ }
+
+ ActiveWindow {
+ id: activeWindow
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.top: workspaces.bottom
+ anchors.bottom: tray.top
+ anchors.margins: Appearance.spacing.large
+
+ monitor: Brightness.getMonitorForScreen(root.screen)
+ }
+
+ Tray {
+ id: tray
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: clock.top
+ anchors.bottomMargin: Appearance.spacing.larger
+ }
+
+ Clock {
+ id: clock
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: statusIcons.top
+ anchors.bottomMargin: Appearance.spacing.normal
+ }
+
+ StyledRect {
+ id: statusIcons
+
+ anchors.left: parent.left
+ anchors.right: parent.right
+ anchors.bottom: power.top
+ anchors.bottomMargin: Appearance.spacing.normal
+
+ radius: Appearance.rounding.full
+ color: Colours.palette.m3surfaceContainer
+
+ implicitHeight: statusIconsInner.implicitHeight + Appearance.padding.normal * 2
+
+ StatusIcons {
+ id: statusIconsInner
+
+ anchors.centerIn: parent
+ }
+ }
+
+ Power {
+ id: power
+
+ anchors.horizontalCenter: parent.horizontalCenter
+ anchors.bottom: parent.bottom
+ anchors.bottomMargin: Appearance.padding.large
}
}
}
diff --git a/modules/bar/Content.qml b/modules/bar/Content.qml
deleted file mode 100644
index 54879fa..0000000
--- a/modules/bar/Content.qml
+++ /dev/null
@@ -1,174 +0,0 @@
-import "root:/widgets"
-import "root:/services"
-import "root:/config"
-import "components"
-import "components/workspaces"
-import Quickshell
-import QtQuick
-
-StyledRect {
- id: root
-
- required property ShellScreen screen
-
- function checkPopout(y: real): var {
- const spacing = Appearance.spacing.small;
- const aw = activeWindow.child;
- const awy = activeWindow.y + aw.y;
-
- const ty = tray.y;
- const th = tray.implicitHeight;
- const trayItems = tray.items;
-
- const n = statusIconsInner.network;
- const ny = statusIcons.y + statusIconsInner.y + n.y - spacing / 2;
-
- const bls = statusIcons.y + statusIconsInner.y + statusIconsInner.bs - spacing / 2;
- const ble = statusIcons.y + statusIconsInner.y + statusIconsInner.be + spacing / 2;
-
- const b = statusIconsInner.battery;
- const by = statusIcons.y + statusIconsInner.y + b.y - spacing / 2;
-
- if (y >= awy && y <= awy + aw.implicitHeight) {
- Popouts.currentName = "activewindow";
- Popouts.currentCenter = Qt.binding(() => activeWindow.y + aw.y + aw.implicitHeight / 2);
- Popouts.hasCurrent = true;
- } else if (y > ty && y < ty + th) {
- const index = Math.floor(((y - ty) / th) * trayItems.count);
- const item = trayItems.itemAt(index);
-
- Popouts.currentName = `traymenu${index}`;
- Popouts.currentCenter = Qt.binding(() => tray.y + item.y + item.implicitHeight / 2);
- Popouts.hasCurrent = true;
- } else if (y >= ny && y <= ny + n.implicitHeight + spacing) {
- Popouts.currentName = "network";
- Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + n.y + n.implicitHeight / 2);
- Popouts.hasCurrent = true;
- } else if (y >= bls && y <= ble) {
- Popouts.currentName = "bluetooth";
- Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + statusIconsInner.bs + (statusIconsInner.be - statusIconsInner.bs) / 2);
- Popouts.hasCurrent = true;
- } else if (y >= by && y <= by + b.implicitHeight + spacing) {
- Popouts.currentName = "battery";
- Popouts.currentCenter = Qt.binding(() => statusIcons.y + statusIconsInner.y + b.y + b.implicitHeight / 2);
- Popouts.hasCurrent = true;
- } else {
- Popouts.hasCurrent = false;
- }
- }
-
- anchors.top: parent.top
- anchors.bottom: parent.bottom
-
- implicitWidth: child.implicitWidth + BorderConfig.thickness
-
- color: BorderConfig.colour
-
- Component.onCompleted: Visibilities.bars[screen] = this
-
- MouseArea {
- anchors.fill: parent
-
- hoverEnabled: true
-
- onPositionChanged: event => root.checkPopout(event.y)
-
- onContainsMouseChanged: {
- if (!containsMouse)
- Popouts.hasCurrent = false;
- }
- }
-
- Item {
- id: child
-
- anchors.top: parent.top
- anchors.bottom: parent.bottom
- anchors.right: parent.right
-
- implicitWidth: Math.max(osIcon.implicitWidth, workspaces.implicitWidth, activeWindow.implicitWidth, tray.implicitWidth, clock.implicitWidth, statusIcons.implicitWidth, power.implicitWidth)
-
- OsIcon {
- id: osIcon
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.top: parent.top
- anchors.topMargin: Appearance.padding.large
- }
-
- StyledClippingRect {
- id: workspaces
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.top: osIcon.bottom
- anchors.topMargin: Appearance.spacing.normal
-
- radius: Appearance.rounding.full
- color: Colours.palette.m3surfaceContainer
-
- implicitWidth: workspacesInner.implicitWidth + Appearance.spacing.small
- implicitHeight: workspacesInner.implicitHeight + Appearance.spacing.small * 2
-
- Workspaces {
- id: workspacesInner
-
- anchors.centerIn: parent
- }
- }
-
- ActiveWindow {
- id: activeWindow
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.top: workspaces.bottom
- anchors.bottom: tray.top
- anchors.margins: Appearance.spacing.large
-
- monitor: Brightness.getMonitorForScreen(root.screen)
- }
-
- Tray {
- id: tray
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.bottom: clock.top
- anchors.bottomMargin: Appearance.spacing.larger
- }
-
- Clock {
- id: clock
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.bottom: statusIcons.top
- anchors.bottomMargin: Appearance.spacing.normal
- }
-
- StyledRect {
- id: statusIcons
-
- anchors.left: parent.left
- anchors.right: parent.right
- anchors.bottom: power.top
- anchors.bottomMargin: Appearance.spacing.normal
-
- radius: Appearance.rounding.full
- color: Colours.palette.m3surfaceContainer
-
- implicitHeight: statusIconsInner.implicitHeight + Appearance.padding.normal * 2
-
- StatusIcons {
- id: statusIconsInner
-
- anchors.centerIn: parent
- }
- }
-
- Power {
- id: power
-
- anchors.horizontalCenter: parent.horizontalCenter
- anchors.bottom: parent.bottom
- anchors.bottomMargin: Appearance.padding.large
- }
- }
-}
diff --git a/modules/bar/components/workspaces/Workspaces.qml b/modules/bar/components/workspaces/Workspaces.qml
index 86392ec..8a1c49c 100644
--- a/modules/bar/components/workspaces/Workspaces.qml
+++ b/modules/bar/components/workspaces/Workspaces.qml
@@ -65,6 +65,8 @@ Item {
MouseArea {
anchors.fill: parent
+ anchors.leftMargin: -(Appearance.padding.small + BorderConfig.thickness)
+ anchors.rightMargin: -(Appearance.padding.small + BorderConfig.thickness)
onPressed: event => {
const ws = layout.childAt(event.x, event.y).index + root.groupOffset + 1;
diff --git a/modules/drawers/Backgrounds.qml b/modules/drawers/Backgrounds.qml
index df8d2eb..2b08b7b 100644
--- a/modules/drawers/Backgrounds.qml
+++ b/modules/drawers/Backgrounds.qml
@@ -6,15 +6,18 @@ import "root:/modules/session" as Session
import "root:/modules/launcher" as Launcher
import "root:/modules/dashboard" as Dashboard
import "root:/modules/bar/popouts" as BarPopouts
+import QtQuick
import QtQuick.Shapes
Shape {
id: root
required property Panels panels
+ required property Item bar
anchors.fill: parent
anchors.margins: BorderConfig.thickness
+ anchors.leftMargin: bar.implicitWidth
preferredRendererType: Shape.CurveRenderer
opacity: Colours.transparency.enabled ? Colours.transparency.base : 1
diff --git a/modules/drawers/Border.qml b/modules/drawers/Border.qml
index 64fd7f9..9014d07 100644
--- a/modules/drawers/Border.qml
+++ b/modules/drawers/Border.qml
@@ -8,6 +8,8 @@ import QtQuick.Effects
Item {
id: root
+ required property Item bar
+
anchors.fill: parent
StyledRect {
@@ -28,6 +30,7 @@ Item {
Rectangle {
anchors.fill: parent
anchors.margins: BorderConfig.thickness
+ anchors.leftMargin: root.bar.implicitWidth
radius: BorderConfig.rounding
}
}
diff --git a/modules/drawers/Drawers.qml b/modules/drawers/Drawers.qml
index 3aabc48..c897f4a 100644
--- a/modules/drawers/Drawers.qml
+++ b/modules/drawers/Drawers.qml
@@ -3,6 +3,7 @@ pragma ComponentBehavior: Bound
import "root:/widgets"
import "root:/services"
import "root:/config"
+import "root:/modules/bar"
import Quickshell
import Quickshell.Wayland
import Quickshell.Hyprland
@@ -18,6 +19,7 @@ Variants {
Exclusions {
screen: scope.modelData
+ bar: bar
}
StyledWindow {
@@ -29,9 +31,9 @@ Variants {
WlrLayershell.keyboardFocus: visibilities.launcher || visibilities.session ? WlrKeyboardFocus.OnDemand : WlrKeyboardFocus.None
mask: Region {
- x: BorderConfig.thickness
+ x: bar.implicitWidth
y: BorderConfig.thickness
- width: win.width - BorderConfig.thickness * 2
+ width: win.width - bar.implicitWidth - BorderConfig.thickness
height: win.height - BorderConfig.thickness * 2
intersection: Intersection.Xor
@@ -43,8 +45,6 @@ Variants {
anchors.left: true
anchors.right: true
- margins.left: Visibilities.bars[screen]?.implicitWidth ?? 0
-
Variants {
id: regions
@@ -53,7 +53,7 @@ Variants {
Region {
required property Item modelData
- x: modelData.x + BorderConfig.thickness
+ x: modelData.x + bar.implicitWidth
y: modelData.y + BorderConfig.thickness
width: modelData.width
height: modelData.height
@@ -90,10 +90,13 @@ Variants {
anchors.fill: parent
visible: false
- Border {}
+ Border {
+ bar: bar
+ }
Backgrounds {
panels: panels
+ bar: bar
}
}
@@ -116,14 +119,22 @@ Variants {
screen: scope.modelData
visibilities: visibilities
panels: panels
+ bar: bar
Panels {
id: panels
screen: scope.modelData
visibilities: visibilities
+ bar: bar
}
}
+
+ Bar {
+ id: bar
+
+ screen: scope.modelData
+ }
}
}
}
diff --git a/modules/drawers/Exclusions.qml b/modules/drawers/Exclusions.qml
index 8ad23a2..188aadb 100644
--- a/modules/drawers/Exclusions.qml
+++ b/modules/drawers/Exclusions.qml
@@ -3,14 +3,17 @@ pragma ComponentBehavior: Bound
import "root:/widgets"
import "root:/config"
import Quickshell
+import QtQuick
Scope {
id: root
required property ShellScreen screen
+ required property Item bar
ExclusionZone {
anchors.left: true
+ exclusiveZone: root.bar.implicitWidth
}
ExclusionZone {
diff --git a/modules/drawers/Interactions.qml b/modules/drawers/Interactions.qml
index 42e423d..e66c24d 100644
--- a/modules/drawers/Interactions.qml
+++ b/modules/drawers/Interactions.qml
@@ -10,6 +10,7 @@ MouseArea {
required property ShellScreen screen
required property PersistentProperties visibilities
required property Panels panels
+ required property Item bar
property bool osdHovered
property point dragStart
@@ -20,11 +21,11 @@ MouseArea {
}
function inRightPanel(panel: Item, x: real, y: real): bool {
- return x > BorderConfig.thickness + panel.x && withinPanelHeight(panel, x, y);
+ return x > bar.implicitWidth + panel.x && withinPanelHeight(panel, x, y);
}
function inTopPanel(panel: Item, x: real, y: real): bool {
- const panelX = BorderConfig.thickness + panel.x;
+ const panelX = bar.implicitWidth + panel.x;
return y < BorderConfig.thickness + panel.y + panel.height && x >= panelX - BorderConfig.rounding && x <= panelX + panel.width + BorderConfig.rounding;
}
@@ -61,10 +62,10 @@ MouseArea {
// Show popouts on hover
const popout = panels.popouts;
- if (x < BorderConfig.thickness + popout.width) {
- if (x < BorderConfig.thickness)
+ if (x < bar.implicitWidth + popout.width) {
+ if (x < bar.implicitWidth)
// Handle like part of bar
- Visibilities.bars[screen].checkPopout(y);
+ bar.checkPopout(y);
else
// Keep on hover
Popouts.hasCurrent = withinPanelHeight(popout, x, y);
diff --git a/modules/drawers/Panels.qml b/modules/drawers/Panels.qml
index b127031..0514b3e 100644
--- a/modules/drawers/Panels.qml
+++ b/modules/drawers/Panels.qml
@@ -14,6 +14,7 @@ Item {
required property ShellScreen screen
required property PersistentProperties visibilities
+ required property Item bar
readonly property Osd.Wrapper osd: osd
readonly property Notifications.Wrapper notifications: notifications
@@ -24,6 +25,7 @@ Item {
anchors.fill: parent
anchors.margins: BorderConfig.thickness
+ anchors.leftMargin: bar.implicitWidth
Component.onCompleted: Visibilities.panels[screen] = this
diff --git a/services/Visibilities.qml b/services/Visibilities.qml
index f7dc29e..eb6ddfb 100644
--- a/services/Visibilities.qml
+++ b/services/Visibilities.qml
@@ -4,7 +4,6 @@ import Quickshell
Singleton {
property var screens: ({})
- property var bars: ({})
property var panels: ({})
function getForActive(): PersistentProperties {
diff --git a/shell.qml b/shell.qml
index d3d681f..2a58cb2 100644
--- a/shell.qml
+++ b/shell.qml
@@ -1,11 +1,9 @@
import "modules"
-import "modules/bar"
import "modules/drawers"
import "modules/background"
import Quickshell
ShellRoot {
- Bar {}
Background {}
Drawers {}