diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2025-07-26 16:00:50 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2025-07-26 16:00:50 +0800 |
| commit | a675e7f09d8f6d5fef1686ee9415a0389fa73f98 (patch) | |
| tree | de5a1c1fee3a516d13f1ad9f7e717d28aa6a12c0 | |
| parent | 4167bdc70e55926f57e8710b74dc860fd1fc2a1c (diff) | |
ws: animation in between ws w/ mouse
| -rw-r--r-- | bar/Workspace.qml | 39 |
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) { |
