diff --git a/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.cpp b/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.cpp index bfa008db5a..548bd5b9c1 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.cpp @@ -27,10 +27,7 @@ AchievementProgressWidget::AchievementProgressWidget(QWidget* parent) : QWidget( m_common_box = new QGroupBox(); m_common_layout = new QVBoxLayout(); - { - std::lock_guard lg{AchievementManager::GetInstance().GetLock()}; - UpdateData(); - } + UpdateData(true); m_common_box->setLayout(m_common_layout); @@ -41,24 +38,48 @@ AchievementProgressWidget::AchievementProgressWidget(QWidget* parent) : QWidget( setLayout(layout); } -void AchievementProgressWidget::UpdateData() +void AchievementProgressWidget::UpdateData(bool clean_all) { - ClearLayoutRecursively(m_common_layout); - - auto& instance = AchievementManager::GetInstance(); - if (!instance.IsGameLoaded()) - return; - - auto* client = instance.GetClient(); - auto* achievement_list = - rc_client_create_achievement_list(client, RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL, - RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE); - for (u32 ix = 0; ix < achievement_list->num_buckets; ix++) + if (clean_all) { - for (u32 jx = 0; jx < achievement_list->buckets[ix].num_achievements; jx++) + m_achievement_boxes.clear(); + ClearLayoutRecursively(m_common_layout); + + auto& instance = AchievementManager::GetInstance(); + if (!instance.IsGameLoaded()) + return; + auto* client = instance.GetClient(); + auto* achievement_list = rc_client_create_achievement_list( + client, RC_CLIENT_ACHIEVEMENT_CATEGORY_CORE_AND_UNOFFICIAL, + RC_CLIENT_ACHIEVEMENT_LIST_GROUPING_LOCK_STATE); + for (u32 ix = 0; ix < achievement_list->num_buckets; ix++) { - m_common_layout->addWidget( - new AchievementBox(this, achievement_list->buckets[ix].achievements[jx])); + for (u32 jx = 0; jx < achievement_list->buckets[ix].num_achievements; jx++) + { + auto* achievement = achievement_list->buckets[ix].achievements[jx]; + m_achievement_boxes[achievement->id] = std::make_shared(this, achievement); + m_common_layout->addWidget(m_achievement_boxes[achievement->id].get()); + } + } + rc_client_destroy_achievement_list(achievement_list); + } + else + { + for (auto box : m_achievement_boxes) + { + box.second->UpdateData(); + } + } +} + +void AchievementProgressWidget::UpdateData( + const std::set& update_ids) +{ + for (auto& [id, box] : m_achievement_boxes) + { + if (update_ids.contains(id)) + { + box->UpdateData(); } } } diff --git a/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.h b/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.h index 32d2754fd3..9aa2f8cfe7 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.h +++ b/Source/Core/DolphinQt/Achievements/AchievementProgressWidget.h @@ -7,7 +7,9 @@ #include #include "Common/CommonTypes.h" +#include "Core/AchievementManager.h" +class AchievementBox; class QCheckBox; class QGroupBox; class QLineEdit; @@ -21,11 +23,13 @@ class AchievementProgressWidget final : public QWidget Q_OBJECT public: explicit AchievementProgressWidget(QWidget* parent); - void UpdateData(); + void UpdateData(bool clean_all); + void UpdateData(const std::set& update_ids); private: QGroupBox* m_common_box; QVBoxLayout* m_common_layout; + std::map> m_achievement_boxes; }; #endif // USE_RETRO_ACHIEVEMENTS diff --git a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp index f8dcda0a25..a95e844e29 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementsWindow.cpp @@ -81,7 +81,7 @@ void AchievementsWindow::UpdateData() m_header_widget->UpdateData(); m_header_widget->setVisible(instance.HasAPIToken()); m_settings_widget->UpdateData(); - m_progress_widget->UpdateData(); + m_progress_widget->UpdateData(true); m_tab_widget->setTabVisible(1, is_game_loaded); m_leaderboard_widget->UpdateData(); m_tab_widget->setTabVisible(2, is_game_loaded);