#include "MenuListActivity.h" #include #include "MappedInputManager.h" #include "components/UITheme.h" #include "settings/SettingsSubmenuActivity.h" void MenuListActivity::initMenuList() { const int count = static_cast(menuItems.size()); const auto pred = UITheme::makeSelectablePredicate(count, [this](int i) { return menuItems[i].getTitle(); }); buttonNavigator.setSelectablePredicate(pred, count); if (count > 0 && !pred(selectedIndex)) { selectedIndex = buttonNavigator.nextIndex(selectedIndex); } } void MenuListActivity::onEnter() { Activity::onEnter(); if (!submenusPrepared) { prepareSubmenus(); SettingInfo::insertSubcategorySeparators(menuItems); submenusPrepared = true; } initMenuList(); requestUpdate(); } void MenuListActivity::handleNavigation() { buttonNavigator.onNext([this] { selectedIndex = buttonNavigator.nextIndex(selectedIndex); requestUpdate(); }); buttonNavigator.onPrevious([this] { selectedIndex = buttonNavigator.previousIndex(selectedIndex); requestUpdate(); }); } void MenuListActivity::toggleCurrentItem() { if (selectedIndex < 0 || selectedIndex >= static_cast(menuItems.size())) return; const auto& item = menuItems[selectedIndex]; if (item.isSeparator) return; if (item.type == SettingType::ACTION) { if (item.action == SettingAction::Submenu) { openSubmenu(item); return; } onActionSelected(selectedIndex); return; } menuItems[selectedIndex].toggleValue(); onSettingToggled(selectedIndex); requestUpdate(); } std::string MenuListActivity::getItemValueString(int index) const { return menuItems[index].getDisplayValue(); } void MenuListActivity::drawMenuList(const Rect& rect) { const int count = static_cast(menuItems.size()); GUI.drawList( renderer, rect, count, selectedIndex, [this](int index) { return menuItems[index].getTitle(); }, nullptr, nullptr, [this](int index) { return getItemValueString(index); }, true); } void MenuListActivity::prepareSubmenus() { SettingInfo::prepareSubmenus(menuItems, submenuData); } void MenuListActivity::openSubmenu(const SettingInfo& submenuEntry) { auto it = std::find_if(submenuData.begin(), submenuData.end(), [&submenuEntry](const SettingInfo::SubmenuData& d) { return d.id == submenuEntry.nameId; }); if (it == submenuData.end()) return; startActivityForResult( std::make_unique(renderer, mappedInput, submenuEntry.nameId, it->items), [this](const ActivityResult&) { requestUpdate(); }); } void MenuListActivity::loop() { if (mappedInput.wasPressed(MappedInputManager::Button::Back)) { onBackPressed(); return; } if (mappedInput.wasPressed(MappedInputManager::Button::Confirm)) { toggleCurrentItem(); return; } handleNavigation(); }