#include #include "recomp_ui.h" #include "elements/ui_element.h" #include "elements/ui_label.h" #include "elements/ui_button.h" struct { recompui::ContextId ui_context; recompui::Label* prompt_header; recompui::Label* prompt_label; recompui::Element* prompt_controls; recompui::Button* confirm_button; recompui::Button* cancel_button; std::function confirm_action; std::function cancel_action; std::string return_element_id; std::mutex mutex; } prompt_state; void run_confirm_callback() { std::function confirm_action; { std::lock_guard lock{ prompt_state.mutex }; confirm_action = std::move(prompt_state.confirm_action); } if (confirm_action) { confirm_action(); } recompui::hide_context(prompt_state.ui_context); // TODO nav: focus on return_element_id // or just remove it as the usage of the prompt can change now } void run_cancel_callback() { std::function cancel_action; { std::lock_guard lock{ prompt_state.mutex }; cancel_action = std::move(prompt_state.cancel_action); } if (cancel_action) { cancel_action(); } recompui::hide_context(prompt_state.ui_context); // TODO nav: focus on return_element_id // or just remove it as the usage of the prompt can change now } void recompui::init_prompt_context() { ContextId context = create_context(); std::lock_guard lock{ prompt_state.mutex }; context.open(); prompt_state.ui_context = context; Element* window = context.create_element(context.get_root_element()); window->set_display(Display::Flex); window->set_flex_direction(FlexDirection::Column); window->set_background_color({0, 0, 0, 0}); Element* prompt_overlay = context.create_element(window); prompt_overlay->set_background_color(Color{ 190, 184, 219, 25 }); prompt_overlay->set_position(Position::Absolute); prompt_overlay->set_top(0); prompt_overlay->set_right(0); prompt_overlay->set_bottom(0); prompt_overlay->set_left(0); Element* prompt_content_wrapper = context.create_element(window); prompt_content_wrapper->set_display(Display::Flex); prompt_content_wrapper->set_position(Position::Absolute); prompt_content_wrapper->set_top(0); prompt_content_wrapper->set_right(0); prompt_content_wrapper->set_bottom(0); prompt_content_wrapper->set_left(0); prompt_content_wrapper->set_align_items(AlignItems::Center); prompt_content_wrapper->set_justify_content(JustifyContent::Center); Element* prompt_content = context.create_element(prompt_content_wrapper); prompt_content->set_display(Display::Flex); prompt_content->set_position(Position::Relative); prompt_content->set_flex(1.0f, 1.0f); prompt_content->set_flex_basis(100, Unit::Percent); prompt_content->set_flex_direction(FlexDirection::Column); prompt_content->set_width(100, Unit::Percent); prompt_content->set_max_width(700, Unit::Dp); prompt_content->set_height_auto(); prompt_content->set_margin_auto(); prompt_content->set_border_width(1.1, Unit::Dp); prompt_content->set_border_radius(16, Unit::Dp); prompt_content->set_border_color(Color{ 255, 255, 255, 51 }); prompt_content->set_background_color(Color{ 8, 7, 13, 229 }); prompt_state.prompt_header = context.create_element