From e53e809fce28a5d04a152c6611d02e163f3e4f88 Mon Sep 17 00:00:00 2001 From: mawei Date: Wed, 3 Jun 2026 11:25:21 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E9=A6=96=E9=A1=B5=E5=86=85=E5=AE=B9?= =?UTF-8?q?=E5=8C=BA=E6=9B=BF=E6=8D=A2=E4=B8=BA=20HelloKitty=20=E5=9B=BE?= =?UTF-8?q?=E7=89=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- selfdrive/ui/layouts/home.py | 36 +++----------------- sunnypilot/selfdrive/assets/hello_kitty.png | Bin 0 -> 13178 bytes 2 files changed, 5 insertions(+), 31 deletions(-) create mode 100644 sunnypilot/selfdrive/assets/hello_kitty.png diff --git a/selfdrive/ui/layouts/home.py b/selfdrive/ui/layouts/home.py index be231dcd..cf61056f 100644 --- a/selfdrive/ui/layouts/home.py +++ b/selfdrive/ui/layouts/home.py @@ -5,8 +5,6 @@ from enum import IntEnum from openpilot.common.params import Params from openpilot.selfdrive.ui.widgets.offroad_alerts import UpdateAlert, OffroadAlert from openpilot.selfdrive.ui.widgets.exp_mode_button import ExperimentalModeButton -from openpilot.selfdrive.ui.widgets.prime import PrimeWidget -from openpilot.selfdrive.ui.widgets.setup import SetupWidget from openpilot.system.ui.lib.text_measure import measure_text_cached from openpilot.system.ui.lib.application import gui_app, FontWeight, MousePos from openpilot.system.ui.lib.multilang import tr, trn @@ -55,22 +53,16 @@ class HomeLayout(Widget): self.update_notif_rect = rl.Rectangle(0, 0, 200, HEADER_HEIGHT - 10) self.alert_notif_rect = rl.Rectangle(0, 0, 220, HEADER_HEIGHT - 10) - self._prime_widget = PrimeWidget() - self._setup_widget = SetupWidget() - - self._exp_mode_button = ExperimentalModeButton() self._setup_callbacks() def show_event(self): super().show_event() - self._exp_mode_button.show_event() self.last_refresh = time.monotonic() self._refresh() def _setup_callbacks(self): self.update_alert.set_dismiss_callback(lambda: self._set_state(HomeLayoutState.HOME)) self.offroad_alert.set_dismiss_callback(lambda: self._set_state(HomeLayoutState.HOME)) - self._exp_mode_button.set_click_callback(lambda: self.settings_callback() if self.settings_callback else None) def set_settings_callback(self, callback: Callable): self.settings_callback = callback @@ -78,9 +70,6 @@ class HomeLayout(Widget): def _set_state(self, state: HomeLayoutState): # propagate show/hide events if state != self.current_state: - if state == HomeLayoutState.HOME: - self._exp_mode_button.show_event() - if state in self._layout_widgets: self._layout_widgets[state].show_event() if self.current_state in self._layout_widgets: @@ -181,8 +170,11 @@ class HomeLayout(Widget): gui_label(version_rect, self._version_text, 48, rl.WHITE, alignment=rl.GuiTextAlignment.TEXT_ALIGN_RIGHT) def _render_home_content(self): - self._render_left_column() - self._render_right_column() + # Draw Hello Kitty image centered in content area + kitty_tex = gui_app.texture("../../sunnypilot/selfdrive/assets/hello_kitty.png", int(self.content_rect.width * 0.6), int(self.content_rect.height * 0.6), keep_aspect_ratio=True) + x = self.content_rect.x + (self.content_rect.width - kitty_tex.width) / 2 + y = self.content_rect.y + (self.content_rect.height - kitty_tex.height) / 2 + rl.draw_texture_ex(kitty_tex, rl.Vector2(x, y), 0.0, 1.0, rl.WHITE) def _render_update_view(self): self.update_alert.render(self.content_rect) @@ -190,24 +182,6 @@ class HomeLayout(Widget): def _render_alerts_view(self): self.offroad_alert.render(self.content_rect) - def _render_left_column(self): - self._prime_widget.render(self.left_column_rect) - - def _render_right_column(self): - exp_height = 125 - exp_rect = rl.Rectangle( - self.right_column_rect.x, self.right_column_rect.y, self.right_column_rect.width, exp_height - ) - self._exp_mode_button.render(exp_rect) - - setup_rect = rl.Rectangle( - self.right_column_rect.x, - self.right_column_rect.y + exp_height + SPACING, - self.right_column_rect.width, - self.right_column_rect.height - exp_height - SPACING, - ) - self._setup_widget.render(setup_rect) - def _refresh(self): self._version_text = self._get_version_text() update_available = self.update_alert.refresh() diff --git a/sunnypilot/selfdrive/assets/hello_kitty.png b/sunnypilot/selfdrive/assets/hello_kitty.png new file mode 100644 index 0000000000000000000000000000000000000000..3845202021ce8bedc8fc4415dc6bc77c53ff7298 GIT binary patch literal 13178 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