python ui: add confirm dialog implementation (#34828)
add confirm dialog implementationpull/34832/head
parent
2bfbb181e5
commit
5574b91d17
1 changed files with 62 additions and 0 deletions
@ -0,0 +1,62 @@ |
||||
import pyray as rl |
||||
from openpilot.system.ui.lib.button import gui_button, ButtonStyle |
||||
from openpilot.system.ui.lib.label import gui_text_box |
||||
|
||||
# Constants for dialog dimensions and styling |
||||
DIALOG_WIDTH = 1520 |
||||
DIALOG_HEIGHT = 600 |
||||
BUTTON_HEIGHT = 160 |
||||
MARGIN = 50 |
||||
TEXT_AREA_HEIGHT_REDUCTION = 200 |
||||
BACKGROUND_COLOR = rl.Color(27, 27, 27, 255) |
||||
|
||||
|
||||
def confirm_dialog(rect: rl.Rectangle, message: str, confirm_text: str, cancel_text: str = "Cancel") -> int: |
||||
# Calculate dialog position and size, centered within the parent rectangle |
||||
dialog_x = rect.x + (rect.width - DIALOG_WIDTH) / 2 |
||||
dialog_y = rect.y + (rect.height - DIALOG_HEIGHT) / 2 |
||||
dialog_rect = rl.Rectangle(dialog_x, dialog_y, DIALOG_WIDTH, DIALOG_HEIGHT) |
||||
|
||||
# Calculate button positions at the bottom of the dialog |
||||
bottom = dialog_rect.y + dialog_rect.height |
||||
button_width = (dialog_rect.width - 3 * MARGIN) // 2 |
||||
no_button_x = dialog_rect.x + MARGIN |
||||
yes_button_x = dialog_rect.x + dialog_rect.width - button_width - MARGIN |
||||
button_y = bottom - BUTTON_HEIGHT - MARGIN |
||||
no_button = rl.Rectangle(no_button_x, button_y, button_width, BUTTON_HEIGHT) |
||||
yes_button = rl.Rectangle(yes_button_x, button_y, button_width, BUTTON_HEIGHT) |
||||
|
||||
# Draw the dialog background |
||||
rl.draw_rectangle( |
||||
int(dialog_rect.x), |
||||
int(dialog_rect.y), |
||||
int(dialog_rect.width), |
||||
int(dialog_rect.height), |
||||
BACKGROUND_COLOR, |
||||
) |
||||
|
||||
# Draw the message in the dialog, centered |
||||
text_rect = rl.Rectangle(dialog_rect.x, dialog_rect.y, dialog_rect.width, dialog_rect.height - TEXT_AREA_HEIGHT_REDUCTION) |
||||
gui_text_box( |
||||
text_rect, |
||||
message, |
||||
alignment=rl.GuiTextAlignment.TEXT_ALIGN_CENTER, |
||||
alignment_vertical=rl.GuiTextAlignmentVertical.TEXT_ALIGN_MIDDLE, |
||||
) |
||||
|
||||
# Initialize result; -1 means no action taken yet |
||||
result = -1 |
||||
|
||||
# Check for keyboard input for accessibility |
||||
if rl.is_key_pressed(rl.KeyboardKey.KEY_ENTER): |
||||
result = 1 # Confirm |
||||
elif rl.is_key_pressed(rl.KeyboardKey.KEY_ESCAPE): |
||||
result = 0 # Cancel |
||||
|
||||
# Check for button clicks |
||||
if gui_button(yes_button, confirm_text, button_style=ButtonStyle.PRIMARY): |
||||
result = 1 # Confirm |
||||
if gui_button(no_button, cancel_text): |
||||
result = 0 # Cancel |
||||
|
||||
return result |
Loading…
Reference in new issue