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
JsonObject {
property bool persistent: true
property bool showOnHover: true
property int dragThreshold: 20
property JsonObject sizes: JsonObject {
property int innerHeight: 30
property int windowPreviewSize: 400

View file

@ -1,7 +1,7 @@
import "root:/widgets"
import "root:/services"
import "root:/config"
import "root:/modules/bar/popouts" as BarPopouts
import "popouts" as BarPopouts
import "components"
import "components/workspaces"
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 {
id: visibilities
property bool bar
property bool osd
property bool session
property bool launcher
@ -132,9 +133,12 @@ Variants {
}
}
Bar {
BarWrapper {
id: bar
anchors.top: parent.top
anchors.bottom: parent.bottom
screen: scope.modelData
visibilities: visibilities
popouts: panels.popouts

View file

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

View file

@ -60,6 +60,9 @@ MouseArea {
visibilities.utilities = false;
}
popouts.hasCurrent = false;
if (bar.isHovered && Config.bar.showOnHover)
visibilities.bar = false;
}
}
@ -67,6 +70,23 @@ MouseArea {
const x = event.x;
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
const showOsd = inRightPanel(panels.osd, x, y);