import pyray as rl
from enum import IntEnum
from openpilot . system . ui . lib . application import gui_app , FontWeight
class ButtonStyle ( IntEnum ) :
NORMAL = 0 # Most common, neutral buttons
PRIMARY = 1 # For main actions
DANGER = 2 # For critical actions, like reboot or delete
TRANSPARENT = 3 # For buttons with transparent background and border
DEFAULT_BUTTON_FONT_SIZE = 60
BUTTON_ENABLED_TEXT_COLOR = rl . Color ( 228 , 228 , 228 , 255 )
BUTTON_DISABLED_TEXT_COLOR = rl . Color ( 228 , 228 , 228 , 51 )
BUTTON_BACKGROUND_COLORS = {
ButtonStyle . NORMAL : rl . Color ( 51 , 51 , 51 , 255 ) ,
ButtonStyle . PRIMARY : rl . Color ( 70 , 91 , 234 , 255 ) ,
ButtonStyle . DANGER : rl . Color ( 255 , 36 , 36 , 255 ) ,
ButtonStyle . TRANSPARENT : rl . BLACK ,
}
BUTTON_PRESSED_BACKGROUND_COLORS = {
ButtonStyle . NORMAL : rl . Color ( 74 , 74 , 74 , 255 ) ,
ButtonStyle . PRIMARY : rl . Color ( 48 , 73 , 244 , 255 ) ,
ButtonStyle . DANGER : rl . Color ( 255 , 36 , 36 , 255 ) ,
ButtonStyle . TRANSPARENT : rl . BLACK ,
}
def gui_button (
rect : rl . Rectangle ,
text : str ,
font_size : int = DEFAULT_BUTTON_FONT_SIZE ,
font_weight : FontWeight = FontWeight . MEDIUM ,
button_style : ButtonStyle = ButtonStyle . NORMAL ,
is_enabled : bool = True ,
border_radius : int = 10 , # Corner rounding in pixels
) - > int :
result = 0
# Set background color based on button type
bg_color = BUTTON_BACKGROUND_COLORS [ button_style ]
if is_enabled and rl . check_collision_point_rec ( rl . get_mouse_position ( ) , rect ) :
if rl . is_mouse_button_down ( rl . MouseButton . MOUSE_BUTTON_LEFT ) :
bg_color = BUTTON_PRESSED_BACKGROUND_COLORS [ button_style ]
elif rl . is_mouse_button_released ( rl . MouseButton . MOUSE_BUTTON_LEFT ) :
result = 1
# Draw the button with rounded corners
roundness = border_radius / ( min ( rect . width , rect . height ) / 2 )
if button_style != ButtonStyle . TRANSPARENT :
rl . draw_rectangle_rounded ( rect , roundness , 20 , bg_color )
else :
rl . draw_rectangle_rounded ( rect , roundness , 20 , rl . BLACK )
rl . draw_rectangle_rounded_lines_ex ( rect , roundness , 20 , 2 , rl . WHITE )
font = gui_app . font ( font_weight )
# Center text in the button
text_size = rl . measure_text_ex ( font , text , font_size , 0 )
text_pos = rl . Vector2 (
rect . x + ( rect . width - text_size . x ) / / 2 , rect . y + ( rect . height - text_size . y ) / / 2
)
# Draw the button text
text_color = BUTTON_ENABLED_TEXT_COLOR if is_enabled else BUTTON_DISABLED_TEXT_COLOR
rl . draw_text_ex ( font , text , text_pos , font_size , 0 , text_color )
return result