From 5574b91d17df1cb667534405c1baf2bcd335b997 Mon Sep 17 00:00:00 2001 From: Dean Lee Date: Mon, 10 Mar 2025 23:28:32 +0800 Subject: [PATCH] python ui: add confirm dialog implementation (#34828) add confirm dialog implementation --- system/ui/widgets/confirm_dialog.py | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) create mode 100644 system/ui/widgets/confirm_dialog.py diff --git a/system/ui/widgets/confirm_dialog.py b/system/ui/widgets/confirm_dialog.py new file mode 100644 index 0000000000..e5ca002ecf --- /dev/null +++ b/system/ui/widgets/confirm_dialog.py @@ -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