#!/usr/bin/env python3
import sys
import pyray as rl
from openpilot . system . hardware import HARDWARE
from openpilot . system . ui . lib . button import gui_button , ButtonStyle
from openpilot . system . ui . lib . scroll_panel import GuiScrollPanel
from openpilot . system . ui . lib . application import gui_app
MARGIN = 50
SPACING = 50
FONT_SIZE = 60
LINE_HEIGHT = 64
BUTTON_SIZE = rl . Vector2 ( 310 , 160 )
DEMO_TEXT = """ This is a sample text that will be wrapped and scrolled if necessary.
The text is long enough to demonstrate scrolling and word wrapping . """ * 30
def wrap_text ( text , font_size , max_width ) :
lines = [ ]
current_line = " "
font = gui_app . font ( )
for word in text . split ( ) :
test_line = current_line + word + " "
if rl . measure_text_ex ( font , test_line , font_size , 0 ) . x < = max_width :
current_line = test_line
else :
lines . append ( current_line )
current_line = word + " "
if current_line :
lines . append ( current_line )
return lines
def main ( ) :
gui_app . init_window ( " Text " )
text_content = sys . argv [ 1 ] if len ( sys . argv ) > 1 else DEMO_TEXT
textarea_rect = rl . Rectangle ( MARGIN , MARGIN , gui_app . width - MARGIN * 2 , gui_app . height - MARGIN * 2 - BUTTON_SIZE . y - SPACING )
wrapped_lines = wrap_text ( text_content , FONT_SIZE , textarea_rect . width - 20 )
content_rect = rl . Rectangle ( 0 , 0 , textarea_rect . width - 20 , len ( wrapped_lines ) * LINE_HEIGHT )
scroll_panel = GuiScrollPanel ( textarea_rect , content_rect , show_vertical_scroll_bar = True )
for _ in gui_app . render ( ) :
scroll = scroll_panel . handle_scroll ( )
rl . begin_scissor_mode ( int ( textarea_rect . x ) , int ( textarea_rect . y ) , int ( textarea_rect . width ) , int ( textarea_rect . height ) )
for i , line in enumerate ( wrapped_lines ) :
position = rl . Vector2 ( textarea_rect . x + scroll . x , textarea_rect . y + scroll . y + i * LINE_HEIGHT )
if position . y + LINE_HEIGHT < textarea_rect . y or position . y > textarea_rect . y + textarea_rect . height :
continue
rl . draw_text_ex ( gui_app . font ( ) , line . strip ( ) , position , FONT_SIZE , 0 , rl . WHITE )
rl . end_scissor_mode ( )
button_bounds = rl . Rectangle ( gui_app . width - MARGIN - BUTTON_SIZE . x , gui_app . height - MARGIN - BUTTON_SIZE . y , BUTTON_SIZE . x , BUTTON_SIZE . y )
if gui_button ( button_bounds , " Reboot " , button_style = ButtonStyle . TRANSPARENT ) :
HARDWARE . reboot ( )
if __name__ == " __main__ " :
main ( )