Skip to content

Commit

Permalink
(feat) Add workspace switching by scrolling sidebar (#2828)
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
kristijanribaric authored Nov 10, 2024
1 parent ddc4341 commit 110279c
Showing 1 changed file with 27 additions and 2 deletions.
29 changes: 27 additions & 2 deletions src/browser/base/zen-components/ZenWorkspaces.mjs
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
direction: null
};
_hoveringSidebar = false;
_lastScrollTime = 0;

async init() {
if (!this.shouldHaveWorkspaces) {
Expand Down Expand Up @@ -58,7 +59,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {

initializeWorkspaceNavigation() {
this._setupAppCommandHandlers();
this._setupHoverDetection();
this._setupSidebarHandlers();
}

_setupAppCommandHandlers() {
Expand Down Expand Up @@ -91,7 +92,7 @@ var ZenWorkspaces = new (class extends ZenMultiWindowFeature {
}
}

_setupHoverDetection() {
_setupSidebarHandlers() {
const toolbox = document.getElementById('navigator-toolbox');

toolbox.addEventListener('mouseenter', () => {
Expand All @@ -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() {
Expand Down

0 comments on commit 110279c

Please sign in to comment.