From ec8664fa93039ce7d6f02fc6cc75f3f9de3ee644 Mon Sep 17 00:00:00 2001 From: rav4kumar Date: Fri, 5 Jun 2026 11:28:47 -0700 Subject: [PATCH] fix mapd scorll --- openpilot/system/ui/lib/scroll_panel2.py | 5 +++-- openpilot/system/ui/widgets/scroller.py | 9 ++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/openpilot/system/ui/lib/scroll_panel2.py b/openpilot/system/ui/lib/scroll_panel2.py index b6193672c4..999b1798ef 100644 --- a/openpilot/system/ui/lib/scroll_panel2.py +++ b/openpilot/system/ui/lib/scroll_panel2.py @@ -45,8 +45,9 @@ class ScrollState(Enum): class GuiScrollPanel2: - def __init__(self, horizontal: bool = True) -> None: + def __init__(self, horizontal: bool = True, handle_out_of_bounds: bool = True) -> None: self._horizontal = horizontal + self._handle_out_of_bounds = handle_out_of_bounds self._state = ScrollState.STEADY self._offset: rl.Vector2 = rl.Vector2(0, 0) self._initial_click_event: MouseEvent | None = None @@ -98,7 +99,7 @@ class GuiScrollPanel2: # simple exponential return if out of bounds # out of bounds is handled by snapping, so skip if set out_of_bounds = self.get_offset() > max_offset or self.get_offset() < min_offset - if out_of_bounds and snap_target is None: + if out_of_bounds and snap_target is None and self._handle_out_of_bounds: target = max_offset if self.get_offset() > max_offset else min_offset dt = rl.get_frame_time() or 1e-6 diff --git a/openpilot/system/ui/widgets/scroller.py b/openpilot/system/ui/widgets/scroller.py index 55195b30fb..6760facd24 100644 --- a/openpilot/system/ui/widgets/scroller.py +++ b/openpilot/system/ui/widgets/scroller.py @@ -75,7 +75,6 @@ class _Scroller(Widget): self._items: list[Widget] = [] self._horizontal = horizontal self._snap_items = snap_items - assert not self._snap_items or self._horizontal, "Snapping is only supported for horizontal scrolling" self._spacing = spacing self._pad = pad @@ -191,8 +190,12 @@ class _Scroller(Widget): snap_target: float | None = None if self._snap_items and visible_items and self._scrolling_to[0] is None: # TODO: this doesn't handle two small buttons at the edges well - center_pos = self._rect.x + self._rect.width / 2 - closest_delta_pos = min((((item.rect.x + item.rect.width / 2) - center_pos) for item in visible_items), key=abs) + if self._horizontal: + center_pos = self._rect.x + self._rect.width / 2 + closest_delta_pos = min((((item.rect.x + item.rect.width / 2) - center_pos) for item in visible_items), key=abs) + else: + center_pos = self._rect.y + self._rect.height / 2 + closest_delta_pos = min((((item.rect.y + item.rect.height / 2) - center_pos) for item in visible_items), key=abs) snap_target = self.scroll_panel.get_offset() - closest_delta_pos return self.scroll_panel.update(self._rect, content_size, snap_target=snap_target)