import pyray as rl from openpilot.selfdrive.ui.lib.prime_state import PrimeType from openpilot.selfdrive.ui.widgets.pairing_dialog import PairingDialog from openpilot.selfdrive.ui.ui_state import ui_state from openpilot.system.ui.lib.application import gui_app, Widget, FontWeight from openpilot.system.ui.lib.button import gui_button, ButtonStyle from openpilot.system.ui.lib.wrap_text import wrap_text class SetupWidget(Widget): def __init__(self): super().__init__() self._pairing_dialog: PairingDialog | None = None def _render(self, rect: rl.Rectangle): if ui_state.prime_state.get_type() == PrimeType.UNPAIRED: self._render_registration(rect) else: self._render_firehose_prompt(rect) def _render_registration(self, rect: rl.Rectangle): """Render registration prompt.""" rl.draw_rectangle_rounded(rl.Rectangle(rect.x, rect.y, rect.width, 590), 0.02, 20, rl.Color(51, 51, 51, 255)) x = rect.x + 64 y = rect.y + 48 w = rect.width - 128 # Title font = gui_app.font(FontWeight.BOLD) rl.draw_text_ex(font, "Finish Setup", rl.Vector2(x, y), 75, 0, rl.WHITE) y += 113 # 75 + 38 spacing # Description desc = "Pair your device with comma connect (connect.comma.ai) and claim your comma prime offer." light_font = gui_app.font(FontWeight.LIGHT) wrapped = wrap_text(light_font, desc, 50, int(w)) for line in wrapped: rl.draw_text_ex(light_font, line, rl.Vector2(x, y), 50, 0, rl.WHITE) y += 50 button_rect = rl.Rectangle(x, y + 50, w, 128) if gui_button(button_rect, "Pair device", button_style=ButtonStyle.PRIMARY): self._show_pairing() def _render_firehose_prompt(self, rect: rl.Rectangle): """Render firehose prompt widget.""" rl.draw_rectangle_rounded(rl.Rectangle(rect.x, rect.y, rect.width, 450), 0.02, 20, rl.Color(51, 51, 51, 255)) # Content margins (56, 40, 56, 40) x = rect.x + 56 y = rect.y + 40 w = rect.width - 112 spacing = 42 # Title with fire emojis title_font = gui_app.font(FontWeight.MEDIUM) title_text = "Firehose Mode" rl.draw_text_ex(title_font, title_text, rl.Vector2(x, y), 64, 0, rl.WHITE) y += 64 + spacing # Description desc_font = gui_app.font(FontWeight.NORMAL) desc_text = "Maximize your training data uploads to improve openpilot's driving models." wrapped_desc = wrap_text(desc_font, desc_text, 40, int(w)) for line in wrapped_desc: rl.draw_text_ex(desc_font, line, rl.Vector2(x, y), 40, 0, rl.WHITE) y += 40 y += spacing # Open button button_height = 48 + 64 # font size + padding button_rect = rl.Rectangle(x, y, w, button_height) if gui_button(button_rect, "Open", button_style=ButtonStyle.PRIMARY): self._open_firehose_settings() def _show_pairing(self): if not self._pairing_dialog: self._pairing_dialog = PairingDialog() gui_app.set_modal_overlay(self._pairing_dialog, lambda result: setattr(self, '_pairing_dialog', None)) def _open_firehose_settings(self): pass def __del__(self): if self._pairing_dialog: del self._pairing_dialog