From dd093477a399e699592b5c5fef84002d43e7da71 Mon Sep 17 00:00:00 2001 From: Antonio Scandurra Date: Fri, 22 Dec 2023 15:56:37 +0100 Subject: [PATCH] Allow horizontal scrolling of tab bar on vertical mouse wheel Now, if we receive a scroll event for an axis, but that axis can't be scrolled (overflow != scroll), we will apply it to the opposite axis instead if that axis supports scrolling. --- crates/gpui2/src/elements/div.rs | 25 ++++++++++++++++++++----- 1 file changed, 20 insertions(+), 5 deletions(-) diff --git a/crates/gpui2/src/elements/div.rs b/crates/gpui2/src/elements/div.rs index 7c74eb1039f6277c99c562392b26ad925d4d6e5a..fc129b4f1df6d36e9d480b9f2da7e1c5a0ac38bf 100644 --- a/crates/gpui2/src/elements/div.rs +++ b/crates/gpui2/src/elements/div.rs @@ -1,9 +1,10 @@ use crate::{ point, px, Action, AnyDrag, AnyElement, AnyTooltip, AnyView, AppContext, BorrowAppContext, BorrowWindow, Bounds, ClickEvent, DispatchPhase, Element, ElementId, FocusHandle, IntoElement, - KeyContext, KeyDownEvent, KeyUpEvent, LayoutId, MouseButton, MouseDownEvent, MouseMoveEvent, - MouseUpEvent, ParentElement, Pixels, Point, Render, ScrollWheelEvent, SharedString, Size, - StackingOrder, Style, StyleRefinement, Styled, Task, View, Visibility, WindowContext, + IsZero, KeyContext, KeyDownEvent, KeyUpEvent, LayoutId, MouseButton, MouseDownEvent, + MouseMoveEvent, MouseUpEvent, ParentElement, Pixels, Point, Render, ScrollWheelEvent, + SharedString, Size, StackingOrder, Style, StyleRefinement, Styled, Task, View, Visibility, + WindowContext, }; use collections::HashMap; @@ -1509,12 +1510,26 @@ impl Interactivity { let delta = event.delta.pixel_delta(line_height); if overflow.x == Overflow::Scroll { - scroll_offset.x = (scroll_offset.x + delta.x) + let mut delta_x = Pixels::ZERO; + if !delta.x.is_zero() { + delta_x = delta.x; + } else if overflow.y != Overflow::Scroll { + delta_x = delta.y; + } + + scroll_offset.x = (scroll_offset.x + delta_x) .clamp(-scroll_max.width, px(0.)); } if overflow.y == Overflow::Scroll { - scroll_offset.y = (scroll_offset.y + delta.y) + let mut delta_y = Pixels::ZERO; + if !delta.y.is_zero() { + delta_y = delta.y; + } else if overflow.x != Overflow::Scroll { + delta_y = delta.x; + } + + scroll_offset.y = (scroll_offset.y + delta_y) .clamp(-scroll_max.height, px(0.)); }