diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 27e82a8c55..407e0bed58 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -38,11 +38,20 @@ void AchievementManager::Init() } } +void AchievementManager::SetUpdateCallback(UpdateCallback callback) +{ + m_update_callback = std::move(callback); + m_update_callback(); +} + AchievementManager::ResponseType AchievementManager::Login(const std::string& password) { if (!m_is_runtime_initialized) return AchievementManager::ResponseType::MANAGER_NOT_INITIALIZED; - return VerifyCredentials(password); + AchievementManager::ResponseType r_type = VerifyCredentials(password); + if (m_update_callback) + m_update_callback(); + return r_type; } void AchievementManager::LoginAsync(const std::string& password, const ResponseCallback& callback) @@ -52,7 +61,11 @@ void AchievementManager::LoginAsync(const std::string& password, const ResponseC callback(AchievementManager::ResponseType::MANAGER_NOT_INITIALIZED); return; } - m_queue.EmplaceItem([this, password, callback] { callback(VerifyCredentials(password)); }); + m_queue.EmplaceItem([this, password, callback] { + callback(VerifyCredentials(password)); + if (m_update_callback) + m_update_callback(); + }); } bool AchievementManager::IsLoggedIn() const @@ -179,6 +192,8 @@ void AchievementManager::LoadGameByFilenameAsync(const std::string& iso_path, // Reset this to zero so that RP immediately triggers on the first frame m_last_ping_time = 0; + if (m_update_callback) + m_update_callback(); callback(fetch_game_data_response); }); } @@ -199,6 +214,8 @@ void AchievementManager::LoadUnlockData(const ResponseCallback& callback) } callback(FetchUnlockData(false)); + if (m_update_callback) + m_update_callback(); }); } @@ -316,6 +333,8 @@ void AchievementManager::AchievementEventHandler(const rc_runtime_event_t* runti HandleLeaderboardTriggeredEvent(runtime_event); break; } + if (m_update_callback) + m_update_callback(); } std::string AchievementManager::GetPlayerDisplayName() const @@ -386,12 +405,16 @@ void AchievementManager::CloseGame() ActivateDeactivateAchievements(); ActivateDeactivateLeaderboards(); ActivateDeactivateRichPresence(); + if (m_update_callback) + m_update_callback(); } void AchievementManager::Logout() { CloseGame(); Config::SetBaseOrCurrent(Config::RA_API_TOKEN, ""); + if (m_update_callback) + m_update_callback(); } void AchievementManager::Shutdown() diff --git a/Source/Core/Core/AchievementManager.h b/Source/Core/Core/AchievementManager.h index 00c2055920..9a4289612d 100644 --- a/Source/Core/Core/AchievementManager.h +++ b/Source/Core/Core/AchievementManager.h @@ -41,6 +41,7 @@ public: UNKNOWN_FAILURE }; using ResponseCallback = std::function; + using UpdateCallback = std::function; struct PointSpread { @@ -67,6 +68,7 @@ public: static AchievementManager* GetInstance(); void Init(); + void SetUpdateCallback(UpdateCallback callback); ResponseType Login(const std::string& password); void LoginAsync(const std::string& password, const ResponseCallback& callback); bool IsLoggedIn() const; @@ -125,6 +127,7 @@ private: rc_runtime_t m_runtime{}; Core::System* m_system{}; bool m_is_runtime_initialized = false; + UpdateCallback m_update_callback; std::string m_display_name; u32 m_player_score = 0; std::array m_game_hash{}; diff --git a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp index 451408fde5..40de94ee92 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp @@ -11,6 +11,7 @@ #include "DolphinQt/Achievements/AchievementHeaderWidget.h" #include "DolphinQt/Achievements/AchievementProgressWidget.h" #include "DolphinQt/Achievements/AchievementSettingsWidget.h" +#include "DolphinQt/QtUtils/QueueOnObject.h" #include "DolphinQt/QtUtils/WrapInScrollArea.h" AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent) @@ -20,6 +21,8 @@ AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent) CreateMainLayout(); ConnectWidgets(); + AchievementManager::GetInstance()->SetUpdateCallback( + [this] { QueueOnObject(this, &AchievementsWindow::UpdateData); }); } void AchievementsWindow::showEvent(QShowEvent* event) diff --git a/Source/Core/DolphinQt/Achievements/AchievementsWindow.h b/Source/Core/DolphinQt/Achievements/AchievementsWindow.h index 1d9f089836..d8407a3a17 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementsWindow.h +++ b/Source/Core/DolphinQt/Achievements/AchievementsWindow.h @@ -7,11 +7,13 @@ #include #include "Core/AchievementManager.h" +#include "DolphinQt/QtUtils/QueueOnObject.h" class AchievementHeaderWidget; class AchievementProgressWidget; -class QTabWidget; class QDialogButtonBox; +class QTabWidget; +class UpdateCallback; class AchievementsWindow : public QDialog {