AchievementManager: Use HookableEvent instead of std::function callbacks

The callback mechanism AchievementManager had until now only supported
one caller registering a callback, and it didn't have any
synchronization. This isn't a problem for DolphinQt, but the PR to add
Android support for RetroAchievements exposes these problems. Let's
replace it with HookableEvent, which can handle all of this.
This commit is contained in:
JosJuice
2025-08-24 14:47:13 +02:00
parent 0c7fe651bb
commit de98c3b96f
6 changed files with 39 additions and 44 deletions
@@ -30,12 +30,16 @@ AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent)
CreateMainLayout();
ConnectWidgets();
AchievementManager::GetInstance().SetUpdateCallback(
m_event_hook = AchievementManager::UpdateEvent::Register(
[this](AchievementManager::UpdatedItems updated_items) {
QueueOnObject(this, [this, updated_items = std::move(updated_items)] {
AchievementsWindow::UpdateData(std::move(updated_items));
});
});
},
"AchievementsWindow");
UpdateData(AchievementManager::UpdatedItems{.all = true});
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[this] { m_settings_widget->UpdateData(RC_OK); });
}
@@ -6,6 +6,7 @@
#ifdef USE_RETRO_ACHIEVEMENTS
#include <QDialog>
#include "Common/HookableEvent.h"
#include "Core/AchievementManager.h"
class AchievementHeaderWidget;
@@ -35,6 +36,8 @@ private:
AchievementProgressWidget* m_progress_widget;
AchievementLeaderboardWidget* m_leaderboard_widget;
QDialogButtonBox* m_button_box;
Common::EventHook m_event_hook;
};
#endif // USE_RETRO_ACHIEVEMENTS
+2 -2
View File
@@ -294,8 +294,8 @@ void MenuBar::AddToolsMenu()
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_raintegration_event_hook = AchievementManager::DevMenuUpdateEvent::Register(
[this] { QueueOnObject(this, [this] { UpdateAchievementDevelopmentMenu(); }); }, "MenuBar");
m_achievements_dev_menu->menuAction()->setVisible(false);
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
tools_menu->addSeparator();
+7
View File
@@ -12,6 +12,9 @@
#include <QPointer>
#include "Common/CommonTypes.h"
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
#include "Common/HookableEvent.h"
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
class QMenu;
class ParallelProgressDialog;
@@ -299,4 +302,8 @@ private:
QAction* m_jit_register_cache_off;
bool m_game_selected = false;
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
Common::EventHook m_raintegration_event_hook;
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
};