gpui: Fix slow scrolling in lists (#33608)
matches editor element's behavior https://github.com/user-attachments/assets/f70912e1-5adb-403b-a98c-63e2e89929ac - in first version editor scrolls like 1.5 pages, but agent panel only scrolls half a page. - in second version, agent panel also scrolls like 1.5 pages. Release Notes: - Fixed skipping of some scroll events in the non-uniform list UI element, which fixes slow scrolling of the agent panel.
This commit is contained in:
parent
9a4bcd11a2
commit
49bc2e61da
1 changed files with 6 additions and 3 deletions
|
@ -10,8 +10,8 @@
|
||||||
use crate::{
|
use crate::{
|
||||||
AnyElement, App, AvailableSpace, Bounds, ContentMask, DispatchPhase, Edges, Element, EntityId,
|
AnyElement, App, AvailableSpace, Bounds, ContentMask, DispatchPhase, Edges, Element, EntityId,
|
||||||
FocusHandle, GlobalElementId, Hitbox, HitboxBehavior, InspectorElementId, IntoElement,
|
FocusHandle, GlobalElementId, Hitbox, HitboxBehavior, InspectorElementId, IntoElement,
|
||||||
Overflow, Pixels, Point, ScrollWheelEvent, Size, Style, StyleRefinement, Styled, Window, point,
|
Overflow, Pixels, Point, ScrollDelta, ScrollWheelEvent, Size, Style, StyleRefinement, Styled,
|
||||||
px, size,
|
Window, point, px, size,
|
||||||
};
|
};
|
||||||
use collections::VecDeque;
|
use collections::VecDeque;
|
||||||
use refineable::Refineable as _;
|
use refineable::Refineable as _;
|
||||||
|
@ -962,12 +962,15 @@ impl Element for List {
|
||||||
let height = bounds.size.height;
|
let height = bounds.size.height;
|
||||||
let scroll_top = prepaint.layout.scroll_top;
|
let scroll_top = prepaint.layout.scroll_top;
|
||||||
let hitbox_id = prepaint.hitbox.id;
|
let hitbox_id = prepaint.hitbox.id;
|
||||||
|
let mut accumulated_scroll_delta = ScrollDelta::default();
|
||||||
window.on_mouse_event(move |event: &ScrollWheelEvent, phase, window, cx| {
|
window.on_mouse_event(move |event: &ScrollWheelEvent, phase, window, cx| {
|
||||||
if phase == DispatchPhase::Bubble && hitbox_id.should_handle_scroll(window) {
|
if phase == DispatchPhase::Bubble && hitbox_id.should_handle_scroll(window) {
|
||||||
|
accumulated_scroll_delta = accumulated_scroll_delta.coalesce(event.delta);
|
||||||
|
let pixel_delta = accumulated_scroll_delta.pixel_delta(px(20.));
|
||||||
list_state.0.borrow_mut().scroll(
|
list_state.0.borrow_mut().scroll(
|
||||||
&scroll_top,
|
&scroll_top,
|
||||||
height,
|
height,
|
||||||
event.delta.pixel_delta(px(20.)),
|
pixel_delta,
|
||||||
current_view,
|
current_view,
|
||||||
window,
|
window,
|
||||||
cx,
|
cx,
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue