From f9df5c2b7c9f232e233db2c377b16ea27aae89cb Mon Sep 17 00:00:00 2001 From: Mr-Wiseguy Date: Sat, 26 Apr 2025 04:00:22 -0400 Subject: [PATCH] Set mod tab to navigate down to first mod, fix redundant mod scanning --- include/recomp_ui.h | 3 ++- src/ui/ui_config.cpp | 50 +++++++++++++++++++++++------------------- src/ui/ui_mod_menu.cpp | 7 +++--- 3 files changed, 33 insertions(+), 27 deletions(-) diff --git a/include/recomp_ui.h b/include/recomp_ui.h index a3ac45b..56663ab 100644 --- a/include/recomp_ui.h +++ b/include/recomp_ui.h @@ -69,7 +69,8 @@ namespace recompui { }; void set_config_tab(ConfigTab tab); - Rml::ElementTabSet* get_config_tab(); + Rml::ElementTabSet* get_config_tabset(); + Rml::Element* get_mod_tab(); enum class ButtonVariant { Primary, diff --git a/src/ui/ui_config.cpp b/src/ui/ui_config.cpp index 6f38a7f..e4f583a 100644 --- a/src/ui/ui_config.cpp +++ b/src/ui/ui_config.cpp @@ -464,6 +464,7 @@ public: } void load_document() override { config_context = recompui::create_context(zelda64::get_asset_path("config_menu.rml")); + recompui::update_mod_list(); } void register_events(recompui::UiEventListenerInstancer& listener) override { recompui::register_event(listener, "apply_options", @@ -542,25 +543,6 @@ public: [](const std::string& param, Rml::Event& event) { zelda64::set_time(debug_context.set_time_day, debug_context.set_time_hour, debug_context.set_time_minute); }); - -#if 0 - class TabChangeListener : public Rml::EventListener { - void ProcessEvent(Rml::Event &event) override { - int new_tab_index = event.GetParameter("tab_index", 0); - if (new_tab_index == config_tab_to_index(recompui::ConfigTab::Mods)) { - // Hook up this element to the mods menu's first list entry. - recompui::get_config_tab()->SetProperty(Rml::PropertyId::NavDown, Rml::Style::Nav::None); - } - else { - // Revert the navigation to auto. - recompui::get_config_tab()->SetProperty(Rml::PropertyId::NavDown, Rml::Style::Nav::None); - } - } - }; - - static TabChangeListener tab_change_listener; - recompui::get_config_tab()->AddEventListener(Rml::EventId::Tabchange, &tab_change_listener); -#endif } void bind_config_list_events(Rml::DataModelConstructor &constructor) { @@ -996,12 +978,14 @@ void recompui::toggle_fullscreen() { } void recompui::set_config_tab(ConfigTab tab) { - get_config_tab()->SetActiveTab(config_tab_to_index(tab)); + get_config_tabset()->SetActiveTab(config_tab_to_index(tab)); } -Rml::ElementTabSet* recompui::get_config_tab() { +Rml::ElementTabSet* recompui::get_config_tabset() { ContextId config_context = recompui::get_config_context_id(); + ContextId old_context = recompui::try_close_current_context(); + Rml::ElementDocument *doc = config_context.get_document(); assert(doc != nullptr); @@ -1011,5 +995,27 @@ Rml::ElementTabSet* recompui::get_config_tab() { Rml::ElementTabSet *tabset = rmlui_dynamic_cast(tabset_el); assert(tabset != nullptr); + if (old_context != ContextId::null()) { + old_context.open(); + } + return tabset; -} \ No newline at end of file +} + +Rml::Element* recompui::get_mod_tab() { + ContextId config_context = recompui::get_config_context_id(); + + ContextId old_context = recompui::try_close_current_context(); + + Rml::ElementDocument* doc = config_context.get_document(); + assert(doc != nullptr); + + Rml::Element* tab_el = doc->GetElementById("tab_mods"); + assert(tab_el != nullptr); + + if (old_context != ContextId::null()) { + old_context.open(); + } + + return tab_el; +} diff --git a/src/ui/ui_mod_menu.cpp b/src/ui/ui_mod_menu.cpp index 51ce54e..cd3eea2 100644 --- a/src/ui/ui_mod_menu.cpp +++ b/src/ui/ui_mod_menu.cpp @@ -582,9 +582,11 @@ void ModMenu::create_mod_list() { mod_entry_buttons.front()->set_nav_manual(NavDirection::Up, mod_tab_id); mod_entry_buttons.back()->set_nav(NavDirection::Down, install_mods_button); install_mods_button->set_nav(NavDirection::Up, mod_entry_buttons.back()); + recompui::get_mod_tab()->SetProperty(Rml::PropertyId::NavDown, Rml::Property{ "#" + mod_entry_buttons.front()->get_id(), Rml::Unit::STRING }); } else { install_mods_button->set_nav_manual(NavDirection::Up, mod_tab_id); + recompui::get_mod_tab()->SetProperty(Rml::PropertyId::NavDown, Rml::Style::Nav::Auto); } // Add one extra spacer at the bottom. @@ -684,7 +686,7 @@ ModMenu::ModMenu(Element *parent) : Element(parent) { footer_spacer->set_flex(1.0f, 0.0f); refresh_button = context.create_element