From 33f6d69a32b5f6cd9afeb2d5835728d91b9e1102 Mon Sep 17 00:00:00 2001 From: firestarsdog <229254897+firestarsdog@users.noreply.github.com> Date: Sun, 23 Aug 2026 04:48:35 -0400 Subject: [PATCH] Sound panel blinky --- .../layouts/settings/starpilot/aethergrid.py | 16 ++++++++- .../ui/layouts/settings/starpilot/sounds.py | 9 +---- selfdrive/ui/tests/test_aethergrid.py | 34 +++++++++++++++++++ 3 files changed, 50 insertions(+), 9 deletions(-) diff --git a/selfdrive/ui/layouts/settings/starpilot/aethergrid.py b/selfdrive/ui/layouts/settings/starpilot/aethergrid.py index ce89f0112..21c23a466 100644 --- a/selfdrive/ui/layouts/settings/starpilot/aethergrid.py +++ b/selfdrive/ui/layouts/settings/starpilot/aethergrid.py @@ -603,6 +603,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget): self._page_anim_committed = False self._page_anim_prev_tiles: list = [] self._page_drag_active = False + self._page_drag_eligible = False self._page_drag_offset = 0.0 self._page_drag_start_x = 0.0 self._page_drag_start_y = 0.0 @@ -918,6 +919,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget): super()._handle_mouse_press(mouse_pos) if self._has_pagination: if self._page_clip_rect and not rl.check_collision_point_rec(mouse_pos, self._page_clip_rect): + self._page_drag_eligible = False return if self._page_animating: @@ -926,15 +928,17 @@ class PanelManagerView(AetherInteractiveMixin, Widget): self._page_drag_start_x = mouse_pos.x self._page_drag_start_y = mouse_pos.y self._page_drag_active = False + self._page_drag_eligible = True self._page_drag_offset = 0.0 def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: super()._handle_mouse_event(mouse_event) - if self._has_pagination: + if self._has_pagination and getattr(self, "_page_drag_eligible", False): dx = mouse_event.pos.x - self._page_drag_start_x dy = abs(mouse_event.pos.y - self._page_drag_start_y) if dy > abs(dx) * 1.2 and dy > 32: self._page_drag_active = False + self._page_drag_eligible = False self._page_drag_offset = 0.0 return if (self._current_page == 0 and dx > 0) or \ @@ -947,6 +951,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget): self._can_click = False def _handle_mouse_release(self, mouse_pos: MousePos) -> None: + self._page_drag_eligible = False if self._page_drag_active and self._has_pagination: self._page_drag_active = False offset = self._page_drag_offset @@ -1026,6 +1031,7 @@ class PanelManagerView(AetherInteractiveMixin, Widget): def show_event(self) -> None: super().show_event() + self._page_drag_eligible = False self._page_drag_active = False self._page_drag_offset = 0.0 self._page_animating = False @@ -1034,6 +1040,14 @@ class PanelManagerView(AetherInteractiveMixin, Widget): self._current_page = 0 self._on_page_changed() + def hide_event(self) -> None: + super().hide_event() + self._page_drag_eligible = False + self._page_drag_active = False + self._page_drag_offset = 0.0 + self._page_animating = False + self._page_anim_prev_tiles.clear() + # ═══════════════════════════════════════════════════════════════ # AdjustorTogglesPanelView — shared adjustor+toggle-grid base diff --git a/selfdrive/ui/layouts/settings/starpilot/sounds.py b/selfdrive/ui/layouts/settings/starpilot/sounds.py index 7fcb08eaa..a73da444b 100644 --- a/selfdrive/ui/layouts/settings/starpilot/sounds.py +++ b/selfdrive/ui/layouts/settings/starpilot/sounds.py @@ -59,20 +59,13 @@ class SoundsManagerView(AdjustorTogglesPanelView): self._init_adjustors() self._init_toggles() - self._forward_touch_valid() - - def _forward_touch_valid(self): - self._toggle_grid.set_touch_valid_callback( - lambda: self._scroll_panel.is_touch_valid() - ) def _init_toggles(self): if self.PANEL_STYLE.toggle_row_mode: self._toggle_grid = TileGrid(columns=1, padding=SPACING.md, min_tile_height=TOGGLE_MIN_HEIGHT) else: self._toggle_grid = TileGrid(columns=2, padding=12, min_tile_height=130.0) - self._child(self._toggle_grid) - self._page_grid = self._toggle_grid + self.register_page_grid(self._toggle_grid) toggle_defs = [] for key in self._controller.CUSTOM_ALERTS_KEYS: diff --git a/selfdrive/ui/tests/test_aethergrid.py b/selfdrive/ui/tests/test_aethergrid.py index 1fc99ce93..cf47eabe1 100644 --- a/selfdrive/ui/tests/test_aethergrid.py +++ b/selfdrive/ui/tests/test_aethergrid.py @@ -615,6 +615,40 @@ class TestAethergridContracts(unittest.TestCase): view._activate_target(mod.BACK_BTN) app_mod.gui_app.pop_widget.assert_called_once() + def test_panel_manager_view_page_drag_eligibility_and_reset(self): + mod = _import_aethergrid() + view = mod.PanelManagerView() + view._page_count = 2 + view._current_page = 1 + view._page_clip_rect = mod.rl.Rectangle(1000, 100, 800, 800) + view._scroll_rect = mod.rl.Rectangle(0, 0, 1920, 1080) + + # Press outside grid (e.g. at volume adjustor on left: x=200, y=200) + view._handle_mouse_press(types.SimpleNamespace(x=200, y=200)) + self.assertFalse(view._page_drag_eligible) + self.assertFalse(view._page_drag_active) + + # Move event while not eligible does not trigger drag offset + mouse_event = types.SimpleNamespace(pos=types.SimpleNamespace(x=500, y=200), left_pressed=False, left_down=True, left_released=False, slot=0) + view._handle_mouse_event(mouse_event) + self.assertFalse(view._page_drag_active) + self.assertEqual(view._page_drag_offset, 0.0) + + # Press inside grid (e.g. at x=1200, y=200) + view._handle_mouse_press(types.SimpleNamespace(x=1200, y=200)) + self.assertTrue(view._page_drag_eligible) + + # Move event while eligible calculates drag offset (swipe right towards page 0) + drag_event = types.SimpleNamespace(pos=types.SimpleNamespace(x=1250, y=200), left_pressed=False, left_down=True, left_released=False, slot=0) + view._handle_mouse_event(drag_event) + self.assertTrue(view._page_drag_active) + self.assertEqual(view._page_drag_offset, 50.0) + + # Release resets eligibility and active drag + view._handle_mouse_release(types.SimpleNamespace(x=1250, y=200)) + self.assertFalse(view._page_drag_eligible) + self.assertFalse(view._page_drag_active) + if __name__ == "__main__": unittest.main()