From 62ce148c19ece6f65b65140711866da9af2eb2e8 Mon Sep 17 00:00:00 2001 From: Jason Lee Date: Mon, 9 Dec 2024 17:21:48 +0800 Subject: [PATCH] scrollbar: Fix position may out of container bounds when clicked scrollbar bg. (#475) --- crates/ui/src/scroll/scrollbar.rs | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/crates/ui/src/scroll/scrollbar.rs b/crates/ui/src/scroll/scrollbar.rs index ffcbe0ce..295afbe1 100644 --- a/crates/ui/src/scroll/scrollbar.rs +++ b/crates/ui/src/scroll/scrollbar.rs @@ -496,6 +496,8 @@ impl Element for Scrollbar { } }); + let safe_range = (-scroll_area_size + container_size)..px(0.); + cx.on_mouse_event({ let state = self.state.clone(); let view_id = self.view_id; @@ -526,11 +528,17 @@ impl Element for Scrollbar { .min(1.); if is_vertical { - scroll_handle - .set_offset(point(offset.x, -scroll_area_size * percentage)); + scroll_handle.set_offset(point( + offset.x, + (-scroll_area_size * percentage) + .clamp(safe_range.start, safe_range.end), + )); } else { - scroll_handle - .set_offset(point(-scroll_area_size * percentage, offset.y)); + scroll_handle.set_offset(point( + (-scroll_area_size * percentage) + .clamp(safe_range.start, safe_range.end), + offset.y, + )); } } } @@ -589,11 +597,13 @@ impl Element for Scrollbar { let offset = if is_vertical { point( scroll_handle.offset().x, - -(scroll_area_size - container_size) * percentage, + (-(scroll_area_size - container_size) * percentage) + .clamp(safe_range.start, safe_range.end), ) } else { point( - -(scroll_area_size - container_size) * percentage, + (-(scroll_area_size - container_size) * percentage) + .clamp(safe_range.start, safe_range.end), scroll_handle.offset().y, ) };