summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorlittleblack111 <littleblack11111@gmail.com>2025-07-26 16:00:50 +0800
committerlittleblack111 <littleblack11111@gmail.com>2025-07-26 16:00:50 +0800
commita675e7f09d8f6d5fef1686ee9415a0389fa73f98 (patch)
treede5a1c1fee3a516d13f1ad9f7e717d28aa6a12c0
parent4167bdc70e55926f57e8710b74dc860fd1fc2a1c (diff)
ws: animation in between ws w/ mouse
-rw-r--r--bar/Workspace.qml39
1 files changed, 32 insertions, 7 deletions
diff --git a/bar/Workspace.qml b/bar/Workspace.qml
index 22fef12..f8b8510 100644
--- a/bar/Workspace.qml
+++ b/bar/Workspace.qml
@@ -16,6 +16,7 @@ Item {
property int activeIndex: -1
property bool activeOccupied: false
property int previousActiveIndex: -1
+ property bool toChild: false
property real activeRectX: {
if (activeIndex < 0)
@@ -77,6 +78,12 @@ Item {
easing.type: Easing.InOutQuad
}
}
+ Behavior on implicitWidth {
+ NumberAnimation {
+ duration: Bar.workspaceAnimationDuration
+ easing.type: Easing.InOutQuad
+ }
+ }
}
RowLayout {
@@ -127,14 +134,13 @@ Item {
Hyprland.dispatch(`workspace ${index + 1}`);
}
function moveActive() {
- if (!active) {
- previousActiveIndex = root.activeIndex;
- activeRect.x = parent.x;
- root.activeOccupied = st.isOccupied || false;
- activeRect.implicitWidth = Bar.workspaceIconSize;
- }
+ previousActiveIndex = root.activeIndex;
+ activeRect.x = parent.x;
+ root.activeOccupied = st.isOccupied || false;
+ activeRect.implicitWidth = active ? Bar.workspaceActiveIconSize : Bar.workspaceIconSize;
}
onEntered: {
+ root.toChild = true;
moveActive();
}
// https://github.com/quickshell-mirror/quickshell/issues/118
@@ -142,11 +148,12 @@ Item {
// moveActive();
// }
onExited: {
+ root.toChild = false;
if (!active && previousActiveIndex >= 0) {
// just in case
activeRect.x = layout.x + previousActiveIndex * Bar.workspaceIconSize + previousActiveIndex * Bar.workspaceSpacing;
activeRect.implicitWidth = Bar.workspaceActiveIconSize;
- root.activeOccupied = parent.st.isOccupied || false;
+ // root.activeOccupied = parent.st.isOccupied || false;
root.activeOccupied = getWorkspaceStats(previousActiveIndex).isOccupied || false;
previousActiveIndex = -1;
}
@@ -200,9 +207,27 @@ Item {
MouseArea {
height: Bar.height
width: parent.width
+ hoverEnabled: true
+ z: -1000 // to be below the child's MouseArea
acceptedButtons: Qt.MiddleButton
// sync w the inner MouseArea
+ // https://github.com/quickshell-mirror/quickshell/issues/118 // but onEnter won't update the mouseX
+ onPositionChanged: {
+ const abovedItemIndex = Math.round((mouseX - layout.x) / (Bar.workspaceIconSize + Bar.workspaceSpacing)) - 1; // TODO: workspaceActiveIconSize might be before
+ previousActiveIndex = root.activeIndex;
+ activeRect.x = mouseX - activeRect.width / 2;
+ root.activeOccupied = getWorkspaceStats(abovedItemIndex).isOccupied || false;
+ activeRect.implicitWidth = previousActiveIndex === abovedItemIndex ? Bar.workspaceActiveIconSize : Bar.workspaceIconSize;
+ }
+ onExited: {
+ if (!root.toChild) {
+ // just in case
+ activeRect.x = layout.x + previousActiveIndex * Bar.workspaceIconSize + previousActiveIndex * Bar.workspaceSpacing;
+ activeRect.implicitWidth = Bar.workspaceActiveIconSize;
+ root.activeOccupied = getWorkspaceStats(previousActiveIndex).isOccupied || false;
+ }
+ }
onWheel: event => {
// no idea wats wrong w/ prev so we just unify it to use +/- 1
if (event.angleDelta.y < 0) {