summaryrefslogtreecommitdiff
path: root/Source/Core
diff options
context:
space:
mode:
authorLillyJadeKatrin <lilly.kitty.1988@gmail.com>2024-07-19 23:07:41 -0400
committerLillyJadeKatrin <lilly.kitty.1988@gmail.com>2025-04-13 08:06:00 -0400
commit9caa02493dee4b162bf1991171301d2595704910 (patch)
treebd4ea6a17866ea2e3d6e407bb8d85ffca6aeb12b /Source/Core
parent36c7e7f3c72604b4e037af8d8d44755e59d90235 (diff)
Add RetroAchievements development menu
When the menu exists, it replaces the Achievements action in the Tools menu.
Diffstat (limited to 'Source/Core')
-rw-r--r--Source/Core/Core/AchievementManager.cpp19
-rw-r--r--Source/Core/Core/AchievementManager.h18
-rw-r--r--Source/Core/DolphinQt/MenuBar.cpp47
-rw-r--r--Source/Core/DolphinQt/MenuBar.h7
4 files changed, 89 insertions, 2 deletions
diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp
index 813fc3a868..fb652f50a3 100644
--- a/Source/Core/Core/AchievementManager.cpp
+++ b/Source/Core/Core/AchievementManager.cpp
@@ -637,6 +637,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))
@@ -732,6 +748,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.");
}
}
@@ -1420,6 +1437,8 @@ void AchievementManager::LoadIntegrationCallback(int result, const char* error_m
{
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;
diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h
index f65ffc8252..4027d20841 100644
--- a/Source/Core/Core/AchievementManager.h
+++ b/Source/Core/Core/AchievementManager.h
@@ -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();
@@ -271,6 +284,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;
diff --git a/Source/Core/DolphinQt/MenuBar.cpp b/Source/Core/DolphinQt/MenuBar.cpp
index 24c6cc2d04..14e5fd0900 100644
--- a/Source/Core/DolphinQt/MenuBar.cpp
+++ b/Source/Core/DolphinQt/MenuBar.cpp
@@ -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->UpdateAchievementDevelopmentMenu(); }); });
+ m_achievements_dev_menu->menuAction()->setVisible(false);
+#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
tools_menu->addSeparator();
#endif // USE_RETRO_ACHIEVEMENTS
@@ -1123,6 +1134,38 @@ void MenuBar::UpdateToolsMenu(const Core::State state)
}
}
+#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
+void MenuBar::UpdateAchievementDevelopmentMenu()
+{
+ auto* dev_menu = AchievementManager::GetInstance().GetDevelopmentMenu();
+ if (dev_menu)
+ {
+ m_achievements_dev_menu->menuAction()->setVisible(true);
+ m_achievements_dev_menu->clear();
+ for (u32 i = 0; i < dev_menu->num_items; i++)
+ {
+ const auto& menu_item = dev_menu->items[i];
+ if (menu_item.label == nullptr)
+ {
+ m_achievements_dev_menu->addSeparator();
+ continue;
+ }
+ auto* ra_dev_menu_item = m_achievements_dev_menu->addAction(
+ QString::fromStdString(menu_item.label), this,
+ [menu_item]() { AchievementManager::GetInstance().ActivateDevMenuItem(menu_item.id); });
+ ra_dev_menu_item->setEnabled(menu_item.enabled);
+ // Recommended hardcode by RAIntegration.dll developer Jamiras
+ ra_dev_menu_item->setCheckable(i < 2);
+ 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"),
diff --git a/Source/Core/DolphinQt/MenuBar.h b/Source/Core/DolphinQt/MenuBar.h
index 29457c15f7..c3309a2f54 100644
--- a/Source/Core/DolphinQt/MenuBar.h
+++ b/Source/Core/DolphinQt/MenuBar.h
@@ -44,6 +44,9 @@ public:
explicit MenuBar(QWidget* parent = nullptr);
void UpdateToolsMenu(Core::State state);
+#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
+ void UpdateAchievementDevelopmentMenu();
+#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;