You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
64 lines
2.3 KiB
64 lines
2.3 KiB
#!/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()
|
|
|