mirror of
https://github.com/firestar5683/StarPilot.git
synced 2026-07-04 13:02:09 +08:00
cefddf4b9b
* initial * start to support nav stack in settings panels + fix some navwidget bugs * add deprecation warning and move more to new nav stack * fix overriding NavWidget enabled and do developer panel * fix interactive timeout and do main * more device, not done yet * minor network fixes * dcam dialog * start onboarding * fix onboarding * do mici setup * remove now useless CUSTOM_SOFTWARE * support big ui with old modal overlay * reset can be old modal overlay, but updater needs new since it uses wifiui * flip name truthiness to inspire excitement * all *should* work, but will do pass later * clean up main * clean up settiings * clean up dialog and developer * cleanup mici setup some * rm one more * fix keyboard * revert * might as well but clarify * fix networkinfopage buttons * lint * nice clean up from cursor * animate background fade with position * fix device overlays * cursor fix pt1 cursor fix pt2 * rm print * capital * temp fix from cursor for onboarding not freeing space after reviewing training guide * fix home screen scroller snap not resetting * stash * nice gradient on top * 40 * 20 * no gradient * return unused returns and always show regulatory btn * nice! * revert selfdrive/ui * let's do tici first * bring back ui * not sure why __del__, SetupWidget was never deleted? * device "done" * network "done!!" * toggles "done" * software "done" * developer "done" * fix onboarding * use new modal for debug windows * and aug * setup "done" * clean up * updater "done" * reset "done" * pop first before callbacks in case callbacks push * fix cmt * not needed * remove two commented functions for mici * clean up application * typing * static * not sure what this means * fix big * more static * actually great catch * fix cmt
95 lines
3.9 KiB
Python
95 lines
3.9 KiB
Python
import pyray as rl
|
|
from collections.abc import Callable
|
|
from openpilot.system.ui.lib.application import gui_app, FontWeight
|
|
from openpilot.system.ui.lib.multilang import tr
|
|
from openpilot.system.ui.widgets import DialogResult
|
|
from openpilot.system.ui.widgets.button import ButtonStyle, Button
|
|
from openpilot.system.ui.widgets.label import Label
|
|
from openpilot.system.ui.widgets.html_render import HtmlRenderer, ElementType
|
|
from openpilot.system.ui.widgets import Widget
|
|
from openpilot.system.ui.widgets.scroller_tici import Scroller
|
|
|
|
OUTER_MARGIN = 200
|
|
RICH_OUTER_MARGIN = 100
|
|
BUTTON_HEIGHT = 160
|
|
MARGIN = 50
|
|
TEXT_PADDING = 10
|
|
BACKGROUND_COLOR = rl.Color(27, 27, 27, 255)
|
|
|
|
|
|
class ConfirmDialog(Widget):
|
|
def __init__(self, text: str, confirm_text: str, cancel_text: str | None = None, rich: bool = False, callback: Callable[[DialogResult], None] | None = None):
|
|
super().__init__()
|
|
if cancel_text is None:
|
|
cancel_text = tr("Cancel")
|
|
self._label = Label(text, 70, FontWeight.BOLD, text_color=rl.Color(201, 201, 201, 255))
|
|
self._html_renderer = HtmlRenderer(text=text, text_size={ElementType.P: 50}, center_text=True)
|
|
self._cancel_button = Button(cancel_text, self._cancel_button_callback)
|
|
self._confirm_button = Button(confirm_text, self._confirm_button_callback, button_style=ButtonStyle.PRIMARY)
|
|
self._rich = rich
|
|
self._callback = callback
|
|
self._cancel_text = cancel_text
|
|
self._scroller = Scroller([self._html_renderer], line_separator=False, spacing=0)
|
|
|
|
def set_text(self, text):
|
|
if not self._rich:
|
|
self._label.set_text(text)
|
|
else:
|
|
self._html_renderer.parse_html_content(text)
|
|
|
|
def _cancel_button_callback(self):
|
|
gui_app.pop_widget()
|
|
if self._callback:
|
|
self._callback(DialogResult.CANCEL)
|
|
|
|
def _confirm_button_callback(self):
|
|
gui_app.pop_widget()
|
|
if self._callback:
|
|
self._callback(DialogResult.CONFIRM)
|
|
|
|
def _render(self, rect: rl.Rectangle):
|
|
dialog_x = OUTER_MARGIN if not self._rich else RICH_OUTER_MARGIN
|
|
dialog_y = OUTER_MARGIN if not self._rich else RICH_OUTER_MARGIN
|
|
dialog_width = gui_app.width - 2 * dialog_x
|
|
dialog_height = gui_app.height - 2 * dialog_y
|
|
dialog_rect = rl.Rectangle(dialog_x, dialog_y, dialog_width, dialog_height)
|
|
|
|
bottom = dialog_rect.y + dialog_rect.height
|
|
button_width = (dialog_rect.width - 3 * MARGIN) // 2
|
|
cancel_button_x = dialog_rect.x + MARGIN
|
|
confirm_button_x = dialog_rect.x + dialog_rect.width - button_width - MARGIN
|
|
button_y = bottom - BUTTON_HEIGHT - MARGIN
|
|
cancel_button = rl.Rectangle(cancel_button_x, button_y, button_width, BUTTON_HEIGHT)
|
|
confirm_button = rl.Rectangle(confirm_button_x, button_y, button_width, BUTTON_HEIGHT)
|
|
|
|
rl.draw_rectangle_rec(dialog_rect, BACKGROUND_COLOR)
|
|
|
|
text_rect = rl.Rectangle(dialog_rect.x + MARGIN, dialog_rect.y + TEXT_PADDING,
|
|
dialog_rect.width - 2 * MARGIN, dialog_rect.height - BUTTON_HEIGHT - MARGIN - TEXT_PADDING * 2)
|
|
if not self._rich:
|
|
self._label.render(text_rect)
|
|
else:
|
|
html_rect = rl.Rectangle(text_rect.x, text_rect.y, text_rect.width,
|
|
self._html_renderer.get_total_height(int(text_rect.width)))
|
|
self._html_renderer.set_rect(html_rect)
|
|
self._scroller.render(text_rect)
|
|
|
|
if rl.is_key_pressed(rl.KeyboardKey.KEY_ENTER):
|
|
self._confirm_button_callback()
|
|
elif rl.is_key_pressed(rl.KeyboardKey.KEY_ESCAPE):
|
|
self._cancel_button_callback()
|
|
|
|
if self._cancel_text:
|
|
self._confirm_button.render(confirm_button)
|
|
self._cancel_button.render(cancel_button)
|
|
else:
|
|
full_button_width = dialog_rect.width - 2 * MARGIN
|
|
full_confirm_button = rl.Rectangle(dialog_rect.x + MARGIN, button_y, full_button_width, BUTTON_HEIGHT)
|
|
self._confirm_button.render(full_confirm_button)
|
|
|
|
|
|
def alert_dialog(message: str, button_text: str | None = None):
|
|
if button_text is None:
|
|
button_text = tr("OK")
|
|
return ConfirmDialog(message, button_text, cancel_text="")
|