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.
71 lines
2.7 KiB
71 lines
2.7 KiB
import pyray as rl
|
|
from openpilot.system.ui.lib.application import gui_app, FontWeight, DEFAULT_TEXT_SIZE, DEFAULT_TEXT_COLOR
|
|
from openpilot.system.ui.lib.utils import GuiStyleContext
|
|
|
|
|
|
def gui_label(
|
|
rect: rl.Rectangle,
|
|
text: str,
|
|
font_size: int = DEFAULT_TEXT_SIZE,
|
|
color: rl.Color = DEFAULT_TEXT_COLOR,
|
|
font_weight: FontWeight = FontWeight.NORMAL,
|
|
alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT,
|
|
alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE,
|
|
elide_right: bool = True
|
|
):
|
|
font = gui_app.font(font_weight)
|
|
text_size = rl.measure_text_ex(font, text, font_size, 0)
|
|
display_text = text
|
|
|
|
# Elide text to fit within the rectangle
|
|
if elide_right and text_size.x > rect.width:
|
|
ellipsis = "..."
|
|
left, right = 0, len(text)
|
|
while left < right:
|
|
mid = (left + right) // 2
|
|
candidate = text[:mid] + ellipsis
|
|
candidate_size = rl.measure_text_ex(font, candidate, font_size, 0)
|
|
if candidate_size.x <= rect.width:
|
|
left = mid + 1
|
|
else:
|
|
right = mid
|
|
display_text = text[: left - 1] + ellipsis if left > 0 else ellipsis
|
|
text_size = rl.measure_text_ex(font, display_text, font_size, 0)
|
|
|
|
# Calculate horizontal position based on alignment
|
|
text_x = rect.x + {
|
|
rl.GuiTextAlignment.TEXT_ALIGN_LEFT: 0,
|
|
rl.GuiTextAlignment.TEXT_ALIGN_CENTER: (rect.width - text_size.x) / 2,
|
|
rl.GuiTextAlignment.TEXT_ALIGN_RIGHT: rect.width - text_size.x,
|
|
}.get(alignment, 0)
|
|
|
|
# Calculate vertical position based on alignment
|
|
text_y = rect.y + {
|
|
rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP: 0,
|
|
rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE: (rect.height - text_size.y) / 2,
|
|
rl.GuiTextAlignmentVertical.TEXT_ALIGN_BOTTOM: rect.height - text_size.y,
|
|
}.get(alignment_vertical, 0)
|
|
|
|
# Draw the text in the specified rectangle
|
|
rl.draw_text_ex(font, display_text, rl.Vector2(text_x, text_y), font_size, 0, color)
|
|
|
|
|
|
def gui_text_box(
|
|
rect: rl.Rectangle,
|
|
text: str,
|
|
font_size: int = DEFAULT_TEXT_SIZE,
|
|
color: rl.Color = DEFAULT_TEXT_COLOR,
|
|
alignment: int = rl.GuiTextAlignment.TEXT_ALIGN_LEFT,
|
|
alignment_vertical: int = rl.GuiTextAlignmentVertical.TEXT_ALIGN_TOP
|
|
):
|
|
styles = [
|
|
(rl.GuiControl.DEFAULT, rl.GuiControlProperty.TEXT_COLOR_NORMAL, rl.color_to_int(color)),
|
|
(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_SIZE, font_size),
|
|
(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_LINE_SPACING, font_size),
|
|
(rl.GuiControl.DEFAULT, rl.GuiControlProperty.TEXT_ALIGNMENT, alignment),
|
|
(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_ALIGNMENT_VERTICAL, alignment_vertical),
|
|
(rl.GuiControl.DEFAULT, rl.GuiDefaultProperty.TEXT_WRAP_MODE, rl.GuiTextWrapMode.TEXT_WRAP_WORD)
|
|
]
|
|
|
|
with GuiStyleContext(styles):
|
|
rl.gui_label(rect, text)
|
|
|