From 110279cf4c3e9d74250dcabc377cbe357bc6067b Mon Sep 17 00:00:00 2001 From: kristijanribaric <96492763+kristijanribaric@users.noreply.github.com> Date: Sun, 10 Nov 2024 19:05:15 +0100 Subject: [PATCH] (feat) Add workspace switching by scrolling sidebar (#2828) This commit adds the ability to switch workspaces by horizontally scrolling the sidebar. A scroll cooldown and threshold are implemented to prevent accidental workspace changes. The `_setupHoverDetection` method is renamed to `_setupSidebarHandlers` as it now handles both hover and scroll events. --- .../base/zen-components/ZenWorkspaces.mjs | 29 +++++++++++++++++-- 1 file changed, 27 insertions(+), 2 deletions(-) diff --git a/src/browser/base/zen-components/ZenWorkspaces.mjs b/src/browser/base/zen-components/ZenWorkspaces.mjs index e964ff047..7f7dd3c3a 100644 --- a/src/browser/base/zen-components/ZenWorkspaces.mjs +++ b/src/browser/base/zen-components/ZenWorkspaces.mjs @@ -12,6 +12,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { direction: null }; _hoveringSidebar = false; + _lastScrollTime = 0; async init() { if (!this.shouldHaveWorkspaces) { @@ -58,7 +59,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { initializeWorkspaceNavigation() { this._setupAppCommandHandlers(); - this._setupHoverDetection(); + this._setupSidebarHandlers(); } _setupAppCommandHandlers() { @@ -91,7 +92,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { } } - _setupHoverDetection() { + _setupSidebarHandlers() { const toolbox = document.getElementById('navigator-toolbox'); toolbox.addEventListener('mouseenter', () => { @@ -101,6 +102,30 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature { toolbox.addEventListener('mouseleave', () => { this._hoveringSidebar = false; }); + + const scrollCooldown = 500; // Milliseconds to wait before allowing another scroll + const scrollThreshold = 5; // Minimum scroll delta to trigger workspace change + + toolbox.addEventListener('wheel', async (event) => { + if (!this.workspaceEnabled) return; + // Only process horizontal scroll (deltaX) + if (!event.deltaX) return; + + const currentTime = Date.now(); + if (currentTime - this._lastScrollTime < scrollCooldown) { + return; + } + + // Only process if the horizontal scroll is significant enough + if (Math.abs(event.deltaX) < scrollThreshold) { + return; + } + + // Change workspace based on scroll direction + const direction = event.deltaX > 0 ? -1 : 1; + await this.changeWorkspaceShortcut(direction); + this._lastScrollTime = currentTime; + }, { passive: true }); } initializeGestureHandlers() {