ui: add ExperimentalModeButton to the home layout for toggling between driving modes (#35504)
add ExpermentalModeButtonpull/35503/head
parent
9a1e58102d
commit
7b4e2e2430
2 changed files with 81 additions and 7 deletions
@ -0,0 +1,74 @@ |
|||||||
|
import pyray as rl |
||||||
|
from openpilot.system.ui.lib.application import Widget |
||||||
|
from openpilot.common.params import Params |
||||||
|
from openpilot.system.ui.lib.application import gui_app, FontWeight |
||||||
|
|
||||||
|
|
||||||
|
class ExperimentalModeButton(Widget): |
||||||
|
def __init__(self): |
||||||
|
super().__init__() |
||||||
|
|
||||||
|
self.img_width = 80 |
||||||
|
self.horizontal_padding = 50 |
||||||
|
self.button_height = 125 |
||||||
|
|
||||||
|
self.params = Params() |
||||||
|
self.experimental_mode = self.params.get_bool("ExperimentalMode") |
||||||
|
self.is_pressed = False |
||||||
|
|
||||||
|
self.chill_pixmap = gui_app.texture("icons/couch.png", self.img_width, self.img_width) |
||||||
|
self.experimental_pixmap = gui_app.texture("icons/experimental_grey.png", self.img_width, self.img_width) |
||||||
|
|
||||||
|
def _get_gradient_colors(self): |
||||||
|
alpha = 0xCC if self.is_pressed else 0xFF |
||||||
|
|
||||||
|
if self.experimental_mode: |
||||||
|
return rl.Color(255, 155, 63, alpha), rl.Color(219, 56, 34, alpha) |
||||||
|
else: |
||||||
|
return rl.Color(20, 255, 171, alpha), rl.Color(35, 149, 255, alpha) |
||||||
|
|
||||||
|
def _draw_gradient_background(self, rect): |
||||||
|
start_color, end_color = self._get_gradient_colors() |
||||||
|
rl.draw_rectangle_gradient_h(int(rect.x), int(rect.y), int(rect.width), int(rect.height), |
||||||
|
start_color, end_color) |
||||||
|
|
||||||
|
def _handle_interaction(self, rect): |
||||||
|
mouse_pos = rl.get_mouse_position() |
||||||
|
mouse_in_rect = rl.check_collision_point_rec(mouse_pos, rect) |
||||||
|
|
||||||
|
self.is_pressed = mouse_in_rect and rl.is_mouse_button_down(rl.MOUSE_BUTTON_LEFT) |
||||||
|
return mouse_in_rect and rl.is_mouse_button_released(rl.MOUSE_BUTTON_LEFT) |
||||||
|
|
||||||
|
def _render(self, rect): |
||||||
|
if self._handle_interaction(rect): |
||||||
|
self.experimental_mode = not self.experimental_mode |
||||||
|
# TODO: Opening settings for ExperimentalMode |
||||||
|
self.params.put_bool("ExperimentalMode", self.experimental_mode) |
||||||
|
|
||||||
|
rl.draw_rectangle_rounded(rect, 0.08, 20, rl.Color(255, 255, 255, 255)) |
||||||
|
|
||||||
|
rl.begin_scissor_mode(int(rect.x), int(rect.y), int(rect.width), int(rect.height)) |
||||||
|
self._draw_gradient_background(rect) |
||||||
|
rl.end_scissor_mode() |
||||||
|
|
||||||
|
# Draw vertical separator line |
||||||
|
line_x = rect.x + rect.width - self.img_width - (2 * self.horizontal_padding) |
||||||
|
separator_color = rl.Color(0, 0, 0, 77) # 0x4d = 77 |
||||||
|
rl.draw_line_ex(rl.Vector2(line_x, rect.y), rl.Vector2(line_x, rect.y + rect.height), 3, separator_color) |
||||||
|
|
||||||
|
# Draw text label (left aligned) |
||||||
|
text = "EXPERIMENTAL MODE ON" if self.experimental_mode else "CHILL MODE ON" |
||||||
|
text_x = rect.x + self.horizontal_padding |
||||||
|
text_y = rect.y + rect.height / 2 - 45//2 # Center vertically |
||||||
|
|
||||||
|
rl.draw_text_ex(gui_app.font(FontWeight.NORMAL), text, rl.Vector2(int(text_x), int(text_y)), 45, 0, rl.Color(0, 0, 0, 255)) |
||||||
|
|
||||||
|
# Draw icon (right aligned) |
||||||
|
icon_x = rect.x + rect.width - self.horizontal_padding - self.img_width |
||||||
|
icon_y = rect.y + (rect.height - self.img_width) / 2 |
||||||
|
icon_rect = rl.Rectangle(icon_x, icon_y, self.img_width, self.img_width) |
||||||
|
|
||||||
|
# Draw current mode icon |
||||||
|
current_icon = self.experimental_pixmap if self.experimental_mode else self.chill_pixmap |
||||||
|
source_rect = rl.Rectangle(0, 0, current_icon.width, current_icon.height) |
||||||
|
rl.draw_texture_pro(current_icon, source_rect, icon_rect, rl.Vector2(0, 0), 0, rl.Color(255, 255, 255, 255)) |
Loading…
Reference in new issue