From 0f854a4f3ae6143fceb26fa98aeef9c85353f5bf Mon Sep 17 00:00:00 2001 From: LillyJadeKatrin Date: Tue, 30 Jan 2024 23:36:57 -0500 Subject: [PATCH] Added callback for refreshing menu Menu now appropriately reflects logged in status. --- Source/Core/Core/RADevToolManager.cpp | 9 +++- Source/Core/Core/RADevToolManager.h | 5 +++ Source/Core/DolphinQt/MenuBar.cpp | 59 ++++++++++++++++----------- Source/Core/DolphinQt/MenuBar.h | 3 ++ 4 files changed, 52 insertions(+), 24 deletions(-) diff --git a/Source/Core/Core/RADevToolManager.cpp b/Source/Core/Core/RADevToolManager.cpp index cf9ef17c3f2c..bac4b31f2948 100644 --- a/Source/Core/Core/RADevToolManager.cpp +++ b/Source/Core/Core/RADevToolManager.cpp @@ -251,6 +251,12 @@ void RADevToolManager::ActivateMenuItem(int item) RA_InvokeDialog(item); } +void RADevToolManager::SetRefreshMenuCallback(std::function callback, void* callback_object) +{ + m_rebuild_callback = std::move(callback); + m_rebuild_callback_object = std::move(callback_object); +} + int RADevToolManager::RACallbackIsActive() { return m_game_id; @@ -268,7 +274,8 @@ void RADevToolManager::RACallbackCausePause() void RADevToolManager::RACallbackRebuildMenu() { - // unused + if (m_rebuild_callback_object) + m_rebuild_callback(m_rebuild_callback_object); } void RADevToolManager::RACallbackEstimateTitle(char* buf) diff --git a/Source/Core/Core/RADevToolManager.h b/Source/Core/Core/RADevToolManager.h index 54f0012a26d0..a46347f70d5c 100644 --- a/Source/Core/Core/RADevToolManager.h +++ b/Source/Core/Core/RADevToolManager.h @@ -32,6 +32,7 @@ class RADevToolManager void RAIDoFrame(); std::vector> GetMenuItems(); void ActivateMenuItem(int item); + void SetRefreshMenuCallback(std::function callback, void* callback_object); private: RADevToolManager() = default; @@ -58,4 +59,8 @@ class RADevToolManager std::vector m_cloned_memory; std::set m_modified_addresses; + + std::function m_rebuild_callback; + void* m_rebuild_callback_object; + }; // class RADevToolManager diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp index 53e78afeb02c..a595df84a364 100644 --- a/Source/Core/DolphinQt/MenuBar.cpp +++ b/Source/Core/DolphinQt/MenuBar.cpp @@ -198,6 +198,34 @@ void MenuBar::OnDebugModeToggled(bool enabled) } } +void MenuBar::RefreshRAMenu() +{ + if (!m_ra_dev_ipl) + return; + m_ra_dev_ipl->clear(); + const auto items = RADevToolManager::GetInstance()->GetMenuItems(); + for (const auto& [id, title, checked] : items) + { + if (id == 0) + { + m_ra_dev_ipl->addSeparator(); + continue; + } + + QAction* raAction = m_ra_dev_ipl->addAction(QString::fromUtf8(title)); + if (checked) + { + raAction->setCheckable(true); + raAction->setChecked(checked); + } + + connect(raAction, &QAction::triggered, this, + [this, id = id]() { emit ActivateRAMenuItem(id); }); + } +} + +void (*RefreshRAMenuLambda)(void*) = [](void* menu_bar) { return static_cast(menu_bar)->RefreshRAMenu(); }; + void MenuBar::AddFileMenu() { QMenu* file_menu = addMenu(tr("&File")); @@ -255,29 +283,6 @@ void MenuBar::AddToolsMenu() } #endif // USE_RETRO_ACHIEVEMENTS - QMenu* ra_dev_ipl = tools_menu->addMenu(tr("Achievement Development")); - const auto items = RADevToolManager::GetInstance()->GetMenuItems(); - for (const auto& [id, title, checked] : items) - { - if (id == 0) - { - ra_dev_ipl->addSeparator(); - continue; - } - - QAction* raAction = ra_dev_ipl->addAction(QString::fromUtf8(title)); - if (checked) - { - raAction->setCheckable(true); - raAction->setChecked(checked); - } - - connect(raAction, &QAction::triggered, this, - [this, id = id]() { emit ActivateRAMenuItem(id); }); - } - - tools_menu->addSeparator(); - QMenu* gc_ipl = tools_menu->addMenu(tr("Load GameCube Main Menu")); m_ntscj_ipl = gc_ipl->addAction(tr("NTSC-J"), this, @@ -342,6 +347,12 @@ void MenuBar::AddToolsMenu() m_wii_remotes[4] = menu->addAction(tr("Connect Balance Board"), this, [this] { emit ConnectWiiRemote(4); }); m_wii_remotes[4]->setCheckable(true); + + tools_menu->addSeparator(); + + m_ra_dev_ipl = tools_menu->addMenu(tr("Achievement Development")); + RADevToolManager::GetInstance()->SetRefreshMenuCallback(RefreshRAMenuLambda, this); + RefreshRAMenu(); } void MenuBar::AddEmulationMenu() @@ -1094,6 +1105,8 @@ void MenuBar::UpdateToolsMenu(bool emulation_started) if (enable_wiimotes) wii_remote->setChecked(bt->AccessWiimoteByIndex(i)->IsConnected()); } + + RefreshRAMenu(); } void MenuBar::InstallWAD() diff --git a/Source/Core/DolphinQt/MenuBar.h b/Source/Core/DolphinQt/MenuBar.h index c0e86ae3b879..24a849a1320d 100644 --- a/Source/Core/DolphinQt/MenuBar.h +++ b/Source/Core/DolphinQt/MenuBar.h @@ -49,6 +49,8 @@ class MenuBar final : public QMenuBar void InstallUpdateManually(); + void RefreshRAMenu(); + signals: // File void Open(); @@ -216,6 +218,7 @@ class MenuBar final : public QMenuBar std::array m_wii_remotes; QAction* m_import_wii_save; QAction* m_export_wii_saves; + QMenu* m_ra_dev_ipl; // Emulation QAction* m_play_action;