feat: non persistent bar option

This commit is contained in:
2 * r + 2 * t 2025-07-10 13:37:34 +10:00
parent 938b2f1f71
commit 6222f969d4
6 changed files with 109 additions and 3 deletions

View file

@ -1,6 +1,10 @@
import Quickshell.Io import Quickshell.Io
JsonObject { JsonObject {
property bool persistent: true
property bool showOnHover: true
property int dragThreshold: 20
property JsonObject sizes: JsonObject { property JsonObject sizes: JsonObject {
property int innerHeight: 30 property int innerHeight: 30
property int windowPreviewSize: 400 property int windowPreviewSize: 400

View file

@ -1,7 +1,7 @@
import "root:/widgets" import "root:/widgets"
import "root:/services" import "root:/services"
import "root:/config" import "root:/config"
import "root:/modules/bar/popouts" as BarPopouts import "popouts" as BarPopouts
import "components" import "components"
import "components/workspaces" import "components/workspaces"
import Quickshell import Quickshell

View file

@ -0,0 +1,78 @@
pragma ComponentBehavior: Bound
import "root:/services"
import "root:/config"
import "popouts" as BarPopouts
import Quickshell
import QtQuick
Item {
id: root
required property ShellScreen screen
required property PersistentProperties visibilities
required property BarPopouts.Wrapper popouts
readonly property int exclusiveZone: Config.bar.persistent || (visibilities.bar && !isHovered) ? content.implicitWidth : Config.border.thickness
property bool isHovered
function checkPopout(y: real): void {
content.item?.checkPopout(y);
}
visible: width > Config.border.thickness
implicitWidth: Config.border.thickness
implicitHeight: content.implicitHeight
states: State {
name: "visible"
when: Config.bar.persistent || root.visibilities.bar
PropertyChanges {
root.implicitWidth: content.implicitWidth
}
}
transitions: [
Transition {
from: ""
to: "visible"
NumberAnimation {
target: root
property: "implicitWidth"
duration: Appearance.anim.durations.expressiveDefaultSpatial
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.anim.curves.expressiveDefaultSpatial
}
},
Transition {
from: "visible"
to: ""
NumberAnimation {
target: root
property: "implicitWidth"
duration: Appearance.anim.durations.normal
easing.type: Easing.BezierSpline
easing.bezierCurve: Appearance.anim.curves.emphasized
}
}
]
Loader {
id: content
Component.onCompleted: active = Qt.binding(() => root.visibilities.bar || root.visible)
anchors.top: parent.top
anchors.bottom: parent.bottom
anchors.right: parent.right
sourceComponent: Bar {
screen: root.screen
visibilities: root.visibilities
popouts: root.popouts
}
}
}

View file

@ -107,6 +107,7 @@ Variants {
PersistentProperties { PersistentProperties {
id: visibilities id: visibilities
property bool bar
property bool osd property bool osd
property bool session property bool session
property bool launcher property bool launcher
@ -132,9 +133,12 @@ Variants {
} }
} }
Bar { BarWrapper {
id: bar id: bar
anchors.top: parent.top
anchors.bottom: parent.bottom
screen: scope.modelData screen: scope.modelData
visibilities: visibilities visibilities: visibilities
popouts: panels.popouts popouts: panels.popouts

View file

@ -13,7 +13,7 @@ Scope {
ExclusionZone { ExclusionZone {
anchors.left: true anchors.left: true
exclusiveZone: root.bar.implicitWidth exclusiveZone: root.bar.exclusiveZone
} }
ExclusionZone { ExclusionZone {

View file

@ -60,6 +60,9 @@ MouseArea {
visibilities.utilities = false; visibilities.utilities = false;
} }
popouts.hasCurrent = false; popouts.hasCurrent = false;
if (bar.isHovered && Config.bar.showOnHover)
visibilities.bar = false;
} }
} }
@ -67,6 +70,23 @@ MouseArea {
const x = event.x; const x = event.x;
const y = event.y; const y = event.y;
// Show bar in non-exclusive mode on hover
if (!visibilities.bar && Config.bar.showOnHover && x < bar.implicitWidth) {
visibilities.bar = true;
bar.isHovered = true;
}
// Show/hide bar on drag
if (pressed && dragStart.x < bar.implicitWidth) {
const dragX = x - dragStart.x;
if (dragX > Config.bar.dragThreshold) {
visibilities.bar = true;
bar.isHovered = false;
} else if (!bar.isHovered && dragX < -Config.bar.dragThreshold) {
visibilities.bar = false;
}
}
// Show osd on hover // Show osd on hover
const showOsd = inRightPanel(panels.osd, x, y); const showOsd = inRightPanel(panels.osd, x, y);