Add RetroAchievements Development Menu

When the menu exists, it replaces the Achievements action in the Tools menu.
This commit is contained in:
LillyJadeKatrin 2024-07-19 23:07:41 -04:00
parent 6b87de0df0
commit b5b61291b9
4 changed files with 90 additions and 2 deletions

View File

@ -638,6 +638,22 @@ std::vector<std::string> AchievementManager::GetActiveLeaderboards() const
return display_values;
}
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
const rc_client_raintegration_menu_t* AchievementManager::GetDevelopmentMenu()
{
if (!m_dll_found)
return nullptr;
return rc_client_raintegration_get_menu(m_client);
}
u32 AchievementManager::ActivateDevMenuItem(u32 menu_item_id)
{
if (!m_dll_found)
return 0;
return rc_client_raintegration_activate_menu_item(m_client, menu_item_id);
}
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
void AchievementManager::DoState(PointerWrap& p)
{
if (!m_client || !Config::Get(Config::RA_ENABLED))
@ -733,6 +749,7 @@ void AchievementManager::Shutdown()
// DON'T log out - keep those credentials for next run.
rc_client_destroy(m_client);
m_client = nullptr;
m_dll_found = false;
INFO_LOG_FMT(ACHIEVEMENTS, "Achievement Manager shut down.");
}
}
@ -1416,10 +1433,13 @@ void AchievementManager::EventHandler(const rc_client_event_t* event, rc_client_
void AchievementManager::LoadIntegrationCallback(int result, const char* error_message,
rc_client_t* client, void* userdata)
{
auto& instance = AchievementManager::GetInstance();
switch (result)
{
case RC_OK:
INFO_LOG_FMT(ACHIEVEMENTS, "RAIntegration.dll found.");
instance.m_dll_found = true;
instance.m_dev_menu_callback();
// TODO: hook up menu and dll event handlers
break;

View File

@ -34,6 +34,10 @@
#include "DiscIO/Volume.h"
#include "VideoCommon/Assets/CustomTextureData.h"
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
#include <rcheevos/include/rc_client_raintegration.h>
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
namespace Core
{
class CPUThreadGuard;
@ -161,6 +165,15 @@ public:
const std::unordered_set<AchievementId>& GetActiveChallenges() const;
std::vector<std::string> GetActiveLeaderboards() const;
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
const rc_client_raintegration_menu_t* GetDevelopmentMenu();
u32 ActivateDevMenuItem(u32 menu_item_id);
void SetDevMenuUpdateCallback(std::function<void(void)> callback)
{
m_dev_menu_callback = callback;
};
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
void DoState(PointerWrap& p);
void CloseGame();
@ -270,6 +283,11 @@ private:
std::unordered_set<AchievementId> m_active_challenges;
std::vector<rc_client_leaderboard_tracker_t> m_active_leaderboards;
bool m_dll_found = false;
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
std::function<void(void)> m_dev_menu_callback;
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
Common::WorkQueueThread<std::function<void()>> m_queue;
Common::WorkQueueThread<std::function<void()>> m_image_queue;
mutable std::recursive_mutex m_lock;

View File

@ -64,6 +64,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Updater.h"
@ -71,6 +72,10 @@
#include "UICommon/AutoUpdate.h"
#include "UICommon/GameFile.h"
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
#include <rcheevos/include/rc_client_raintegration.h>
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QPointer<MenuBar> MenuBar::s_menu_bar;
QString MenuBar::GetSignatureSelector() const
@ -284,8 +289,14 @@ void MenuBar::AddToolsMenu()
tools_menu->addSeparator();
#ifdef USE_RETRO_ACHIEVEMENTS
tools_menu->addAction(tr("Achievements"), this, [this] { emit ShowAchievementsWindow(); });
m_achievements_action =
tools_menu->addAction(tr("Achievements"), this, [this] { emit ShowAchievementsWindow(); });
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
m_achievements_dev_menu = tools_menu->addMenu(tr("RetroAchievements Development"));
AchievementManager::GetInstance().SetDevMenuUpdateCallback(
[this]() { QueueOnObject(this, [this] { this->UpdateToolsAchievements(); }); });
m_achievements_dev_menu->menuAction()->setVisible(false);
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
tools_menu->addSeparator();
#endif // USE_RETRO_ACHIEVEMENTS
@ -1122,6 +1133,38 @@ void MenuBar::UpdateToolsMenu(const Core::State state)
}
}
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
void MenuBar::UpdateToolsAchievements()
{
auto* dev_menu = AchievementManager::GetInstance().GetDevelopmentMenu();
if (dev_menu)
{
m_achievements_dev_menu->menuAction()->setVisible(true);
m_achievements_dev_menu->clear();
for (u32 ix = 0; ix < dev_menu->num_items; ix++)
{
const auto& menu_item = dev_menu->items[ix];
if (menu_item.label == nullptr)
{
m_achievements_dev_menu->addSeparator();
continue;
}
auto* ra_dev_menu_item =
m_achievements_dev_menu->addAction(tr(menu_item.label), this, [menu_item]() {
AchievementManager::GetInstance().ActivateDevMenuItem(menu_item.id);
});
ra_dev_menu_item->setEnabled(menu_item.enabled);
ra_dev_menu_item->setCheckable(menu_item.checked);
ra_dev_menu_item->setChecked(menu_item.checked);
}
}
else
{
m_achievements_dev_menu->menuAction()->setVisible(false);
}
}
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
void MenuBar::InstallWAD()
{
QString wad_file = DolphinFileDialog::getOpenFileName(this, tr("Select Title to Install to NAND"),

View File

@ -44,6 +44,9 @@ public:
explicit MenuBar(QWidget* parent = nullptr);
void UpdateToolsMenu(Core::State state);
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
void UpdateToolsAchievements();
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QMenu* GetListColumnsMenu() const { return m_cols_menu; }
@ -205,6 +208,10 @@ private:
QAction* m_wad_install_action;
QMenu* m_perform_online_update_menu;
QAction* m_perform_online_update_for_current_region;
QAction* m_achievements_action;
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
QMenu* m_achievements_dev_menu;
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QAction* m_ntscj_ipl;
QAction* m_ntscu_ipl;
QAction* m_pal_ipl;