diff --git a/src/game/input.cpp b/src/game/input.cpp index 69c6b73..a1ddacd 100644 --- a/src/game/input.cpp +++ b/src/game/input.cpp @@ -10,6 +10,7 @@ #include "promptfont.h" #include "GamepadMotion.hpp" #include "../ui/ui_assign_players_modal.h" +#include "../ui/ui_config_page_controls_element.h" constexpr float axis_threshold = 0.5f; @@ -146,6 +147,10 @@ void process_player_assignment(SDL_Event* event) { if (queue_close_player_assignment_modal) { recompui::assign_players_modal->close(); queue_close_player_assignment_modal = false; + if (recompui::controls_page != nullptr) { + recompui::controls_page->force_update(); + } + return; } if (!player_assignment_state.is_assigning) { @@ -1099,4 +1104,4 @@ std::string recomp::InputField::to_string() const { default: return std::to_string((uint32_t)input_type) + "," + std::to_string(input_id); } -} \ No newline at end of file +} diff --git a/src/ui/elements/ui_config_page.cpp b/src/ui/elements/ui_config_page.cpp index 033db10..0b7eb58 100644 --- a/src/ui/elements/ui_config_page.cpp +++ b/src/ui/elements/ui_config_page.cpp @@ -113,6 +113,10 @@ namespace recompui { return header; } + void ConfigPage::hide_header() { + header->set_visibility(Visibility::Hidden); + } + ConfigHeaderFooter* ConfigPage::add_footer() { footer->set_visibility(Visibility::Visible); set_border_bottom_left_radius(0); @@ -120,6 +124,10 @@ namespace recompui { return footer; } - + void ConfigPage::hide_footer() { + footer->set_visibility(Visibility::Hidden); + set_border_bottom_left_radius(theme::border::radius_lg); + set_border_bottom_right_radius(theme::border::radius_lg); + } } // namespace recompui diff --git a/src/ui/elements/ui_config_page.h b/src/ui/elements/ui_config_page.h index 7a684a0..48a918e 100644 --- a/src/ui/elements/ui_config_page.h +++ b/src/ui/elements/ui_config_page.h @@ -39,7 +39,9 @@ namespace recompui { public: ConfigPage(Element *parent); ConfigHeaderFooter *add_header(); + void hide_header(); ConfigHeaderFooter *add_footer(); + void hide_footer(); ConfigHeaderFooter *get_header() { return header; }; ConfigBody *get_body() { return body; }; ConfigHeaderFooter *get_footer() { return footer; }; diff --git a/src/ui/ui_config_page_controls.cpp b/src/ui/ui_config_page_controls.cpp index fc2e055..65130bc 100644 --- a/src/ui/ui_config_page_controls.cpp +++ b/src/ui/ui_config_page_controls.cpp @@ -5,6 +5,7 @@ #include "elements/ui_toggle.h" #include "elements/ui_container.h" #include "elements/ui_binding_button.h" +#include "elements/ui_select.h" namespace recompui { @@ -125,70 +126,179 @@ ConfigPageControls::ConfigPageControls( int num_players, std::vector game_input_contexts, std::vector game_input_bindings, - std::vector player_keyboard_enabled, - on_player_bind_callback on_player_bind, - set_player_keyboard_enabled_callback set_player_keyboard_enabled + on_player_bind_callback on_player_bind ) : ConfigPage(parent) { this->on_player_bind = on_player_bind; this->game_input_contexts = game_input_contexts; this->num_players = num_players; this->game_input_bindings = game_input_bindings; - this->player_keyboard_enabled = player_keyboard_enabled; this->multiplayer_enabled = num_players > 1; + multiplayer_view_mappings = !multiplayer_enabled; + + set_selected_player(selected_player); + recompui::ContextId context = get_current_context(); + render_all(); +} + +void ConfigPageControls::process_event(const Event &e) { + switch (e.type) { + case EventType::Update: + if (last_update_index != update_index) { + last_update_index = update_index; + render_all(); + } + queue_update(); + break; + default: + break; + } +} + +void ConfigPageControls::force_update() { + update_index++; +} + +void ConfigPageControls::render_all() { + render_header(); + render_body(); + render_footer(); +} + +void ConfigPageControls::render_header() { + if (!multiplayer_enabled) { + hide_header(); + return; + } + + recompui::ContextId context = get_current_context(); add_header(); + + // header left { auto header_left = header->get_left(); - for (uint8_t i = 0; i < num_players; i++) { - std::string player_text = "P" + std::to_string(i + 1); - auto player_button = context.create_element(header_left, player_text, "icons/Cont.svg", ButtonStyle::Basic, PillButtonSize::XLarge); - player_elements.push_back(player_button); - player_button->add_pressed_callback([this, i]() { - set_selected_player(i); - update_control_mappings(); + header_left->clear_children(); + if (multiplayer_view_mappings) { + auto profile_name = context.create_element