From b1b48eaaf38cbc63070ca839631d4eab1fb7999f Mon Sep 17 00:00:00 2001 From: firestar5683 <168790843+firestar5683@users.noreply.github.com> Date: Sat, 24 Oct 2026 18:21:24 -0500 Subject: [PATCH] Keep UI modules within the source size limit --- .../starpilot/ui/compact_settings_page.py | 67 +++++++++++++++++++ openpilot/starpilot/ui/runtime_app.py | 56 +--------------- prebuilt.json | 2 +- 3 files changed, 70 insertions(+), 55 deletions(-) create mode 100644 openpilot/starpilot/ui/compact_settings_page.py diff --git a/openpilot/starpilot/ui/compact_settings_page.py b/openpilot/starpilot/ui/compact_settings_page.py new file mode 100644 index 0000000000..884760689e --- /dev/null +++ b/openpilot/starpilot/ui/compact_settings_page.py @@ -0,0 +1,67 @@ +"""Compact settings navigation and scroll lifecycle.""" + +from __future__ import annotations + +from typing import TYPE_CHECKING + +import pyray as rl + +from openpilot.starpilot.ui.settings_state import SettingsState, compact_menu +from openpilot.starpilot.ui.shell import ShellMode +from openpilot.system.ui.lib.application import MouseEvent, MousePos, gui_app +from openpilot.system.ui.widgets.nav_widget import NavWidget + +if TYPE_CHECKING: + from openpilot.starpilot.ui.runtime_app import StarShellSession + + +class StarCompactSettings(NavWidget): + def __init__(self, session: StarShellSession): + NavWidget.__init__(self) + self.session, self.mode = session, ShellMode.SETTINGS + from openpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2 + self._panel = GuiScrollPanel2(horizontal=True) + + def show_event(self) -> None: + super().show_event() + from openpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2 + # Reset position and momentum on a fresh push, not when a submenu is popped. + self.session.cancel() + self._panel = GuiScrollPanel2(horizontal=True) + self.session.compact_scroll_x = 0.0 + self.session._snapshot_cache = None + + def covers_camera(self, rect: rl.Rectangle) -> bool: + return bool(gui_app.get_active_widget() is self and self.enabled and self.is_visible and + not gui_app.mouse_events and not self.is_dismissing and self._drag_start_pos is None and + self._shown_callback is None and self._y_pos_filter.x == 0 and self._y_pos_filter.velocity.x == 0 and + self.rect.x == rect.x == 0 and self.rect.y == rect.y == 0 and + self.rect.width == rect.width == gui_app.width and self.rect.height == rect.height == gui_app.height) + + def _update_state(self) -> None: + NavWidget._update_state(self) + target = -422 * round(-self._panel.get_offset() / 422) + # Project the pairing snapshot after rendering updates the panel offset. + paired = bool(self.session.adapter.ui_state.prime_state.is_paired()) + self.session.compact_scroll_x = self._panel.update(self.rect, 20 + len(compact_menu(SettingsState(paired=paired))) * 422, + snap_target=target) + + def _render(self, rect) -> None: + self.session.render(self.mode, rect) + + def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: + NavWidget._handle_mouse_event(self, mouse_event) + if mouse_event.left_down and not mouse_event.left_pressed: + self.session.move(self.mode, mouse_event.pos.x - self.rect.x, mouse_event.pos.y - self.rect.y) + elif mouse_event.left_released and not rl.check_collision_point_rec(mouse_event.pos, self.rect): + self.session.cancel() + + def _handle_mouse_press(self, mouse_pos: MousePos) -> None: + self.session.press(self.mode, mouse_pos.x - self.rect.x, mouse_pos.y - self.rect.y) + + def _handle_mouse_release(self, mouse_pos: MousePos) -> None: + self.session.release(self.mode, mouse_pos.x - self.rect.x, mouse_pos.y - self.rect.y) + + def hide_event(self) -> None: + self.session.cancel() + super().hide_event() diff --git a/openpilot/starpilot/ui/runtime_app.py b/openpilot/starpilot/ui/runtime_app.py index 7662476cae..b2f7736d21 100644 --- a/openpilot/starpilot/ui/runtime_app.py +++ b/openpilot/starpilot/ui/runtime_app.py @@ -88,14 +88,14 @@ from openpilot.starpilot.feature_runtime import enabled as feature_enabled from openpilot.starpilot.conditional_mode.preferences import PreferenceError, SavedPreferences, decode_preferences from openpilot.starpilot.conditional_mode.policy import ModeChoice from openpilot.starpilot.conditional_mode.ui_action import ConditionalUiActionOwner -from openpilot.starpilot.ui.settings_state import compact_menu, Destination, SettingsAction, SettingsActionKind, SettingsState +from openpilot.starpilot.ui.settings_state import Destination, SettingsAction, SettingsActionKind from openpilot.starpilot.ui.shell import ShellInput, ShellMode, ShellRequest, ShellSnapshot, ShellView from openpilot.starpilot.ui.software_state import DownloadLabel, SoftwareAction, SoftwareRequest from openpilot.starpilot.ui.toggles_state import Personality, ToggleKey, ToggleRequest from openpilot.system.ui.lib.application import MouseEvent, MousePos, gui_app from openpilot.system.ui.widgets import Widget from openpilot.system.ui.widgets.list_view import button_item, text_item -from openpilot.system.ui.widgets.nav_widget import NavWidget +from openpilot.starpilot.ui.compact_settings_page import StarCompactSettings NATIVE_SETTINGS_PANELS = (Destination.DEVICE, Destination.SOFTWARE, Destination.BLUETOOTH, Destination.TOGGLES, Destination.DEVELOPER) _FEATURE_SETTINGS_PANES = { @@ -1792,58 +1792,6 @@ class StarShellPage(Widget): super().hide_event() -class StarCompactSettings(NavWidget): - def __init__(self, session: StarShellSession): - NavWidget.__init__(self) - self.session, self.mode = session, ShellMode.SETTINGS - from openpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2 - self._panel = GuiScrollPanel2(horizontal=True) - - def show_event(self) -> None: - super().show_event() - from openpilot.system.ui.lib.scroll_panel2 import GuiScrollPanel2 - # Reset position and momentum on a fresh push, not when a submenu is popped. - self.session.cancel() - self._panel = GuiScrollPanel2(horizontal=True) - self.session.compact_scroll_x = 0.0 - self.session._snapshot_cache = None - - def covers_camera(self, rect: rl.Rectangle) -> bool: - return bool(gui_app.get_active_widget() is self and self.enabled and self.is_visible and - not gui_app.mouse_events and not self.is_dismissing and self._drag_start_pos is None and - self._shown_callback is None and self._y_pos_filter.x == 0 and self._y_pos_filter.velocity.x == 0 and - self.rect.x == rect.x == 0 and self.rect.y == rect.y == 0 and - self.rect.width == rect.width == gui_app.width and self.rect.height == rect.height == gui_app.height) - - def _update_state(self) -> None: - NavWidget._update_state(self) - target = -422 * round(-self._panel.get_offset() / 422) - # Project the pairing snapshot after rendering updates the panel offset. - paired = bool(self.session.adapter.ui_state.prime_state.is_paired()) - self.session.compact_scroll_x = self._panel.update(self.rect, 20 + len(compact_menu(SettingsState(paired=paired))) * 422, - snap_target=target) - - def _render(self, rect) -> None: - self.session.render(self.mode, rect) - - def _handle_mouse_event(self, mouse_event: MouseEvent) -> None: - NavWidget._handle_mouse_event(self, mouse_event) - if mouse_event.left_down and not mouse_event.left_pressed: - self.session.move(self.mode, mouse_event.pos.x - self.rect.x, mouse_event.pos.y - self.rect.y) - elif mouse_event.left_released and not rl.check_collision_point_rec(mouse_event.pos, self.rect): - self.session.cancel() - - def _handle_mouse_press(self, mouse_pos: MousePos) -> None: - self.session.press(self.mode, mouse_pos.x - self.rect.x, mouse_pos.y - self.rect.y) - - def _handle_mouse_release(self, mouse_pos: MousePos) -> None: - self.session.release(self.mode, mouse_pos.x - self.rect.x, mouse_pos.y - self.rect.y) - - def hide_event(self) -> None: - self.session.cancel() - super().hide_event() - - class StarMainLayout(MainLayout): """Large existing app transitions/onboarding with full-canvas StarPilot views.""" diff --git a/prebuilt.json b/prebuilt.json index 89cf0e49c8..ee0c15218d 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "b6311a74b50a29d744d6a79ffce1144e50c23f8ed72bc62ad5bc45378b7f1c37", "schema_version": 1} +{"protected_inventory_sha256": "4666fee56112d0be24a2c26cb0c2d53bf5c7d6453eded83843ad77bf0cf0ac99", "schema_version": 1}