mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-08-01 05:38:50 +00:00
Refactor AchievementsWindow::UpdateData to take a partial update parameter
UpdateData in AchievementsWindow now only updates the components being requested, massively improving the window's performance. The parameter is UpdatedItems in AchievementManager, which tracks which portions of the system have been updated for every update callback.
This commit is contained in:
parent
fa2210f80d
commit
4214c301ef
8 changed files with 88 additions and 48 deletions
|
@ -62,13 +62,11 @@ AchievementHeaderWidget::AchievementHeaderWidget(QWidget* parent) : QWidget(pare
|
|||
m_total->setContentsMargins(0, 0, 0, 0);
|
||||
m_total->setAlignment(Qt::AlignTop);
|
||||
setLayout(m_total);
|
||||
|
||||
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
|
||||
UpdateData();
|
||||
}
|
||||
|
||||
void AchievementHeaderWidget::UpdateData()
|
||||
{
|
||||
std::lock_guard lg{AchievementManager::GetInstance().GetLock()};
|
||||
auto& instance = AchievementManager::GetInstance();
|
||||
if (!instance.HasAPIToken())
|
||||
{
|
||||
|
|
|
@ -24,8 +24,6 @@ AchievementLeaderboardWidget::AchievementLeaderboardWidget(QWidget* parent) : QW
|
|||
m_common_box = new QGroupBox();
|
||||
m_common_layout = new QGridLayout();
|
||||
|
||||
UpdateData(true);
|
||||
|
||||
m_common_box->setLayout(m_common_layout);
|
||||
|
||||
auto* layout = new QVBoxLayout;
|
||||
|
|
|
@ -27,8 +27,6 @@ AchievementProgressWidget::AchievementProgressWidget(QWidget* parent) : QWidget(
|
|||
m_common_box = new QGroupBox();
|
||||
m_common_layout = new QVBoxLayout();
|
||||
|
||||
UpdateData(true);
|
||||
|
||||
m_common_box->setLayout(m_common_layout);
|
||||
|
||||
auto* layout = new QVBoxLayout;
|
||||
|
|
|
@ -28,11 +28,13 @@ AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent)
|
|||
CreateMainLayout();
|
||||
ConnectWidgets();
|
||||
AchievementManager::GetInstance().SetUpdateCallback(
|
||||
[this] { QueueOnObject(this, &AchievementsWindow::UpdateData); });
|
||||
[this](AchievementManager::UpdatedItems updated_items) {
|
||||
QueueOnObject(this, [this, updated_items = std::move(updated_items)] {
|
||||
AchievementsWindow::UpdateData(std::move(updated_items));
|
||||
});
|
||||
});
|
||||
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
|
||||
&AchievementsWindow::UpdateData);
|
||||
|
||||
UpdateData();
|
||||
[this] { AchievementsWindow::UpdateData({.all = true}); });
|
||||
}
|
||||
|
||||
void AchievementsWindow::showEvent(QShowEvent* event)
|
||||
|
@ -71,19 +73,38 @@ void AchievementsWindow::ConnectWidgets()
|
|||
connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
||||
}
|
||||
|
||||
void AchievementsWindow::UpdateData()
|
||||
void AchievementsWindow::UpdateData(AchievementManager::UpdatedItems updated_items)
|
||||
{
|
||||
m_settings_widget->UpdateData();
|
||||
if (updated_items.all)
|
||||
{
|
||||
m_header_widget->UpdateData();
|
||||
m_progress_widget->UpdateData(true);
|
||||
m_leaderboard_widget->UpdateData(true);
|
||||
}
|
||||
else
|
||||
{
|
||||
if (updated_items.player_icon || updated_items.game_icon || updated_items.rich_presence ||
|
||||
updated_items.all_achievements || updated_items.achievements.size() > 0)
|
||||
{
|
||||
m_header_widget->UpdateData();
|
||||
}
|
||||
if (updated_items.all_achievements)
|
||||
m_progress_widget->UpdateData(false);
|
||||
else if (updated_items.achievements.size() > 0)
|
||||
m_progress_widget->UpdateData(updated_items.achievements);
|
||||
if (updated_items.all_leaderboards)
|
||||
m_leaderboard_widget->UpdateData(false);
|
||||
else if (updated_items.leaderboards.size() > 0)
|
||||
m_leaderboard_widget->UpdateData(updated_items.leaderboards);
|
||||
}
|
||||
|
||||
{
|
||||
auto& instance = AchievementManager::GetInstance();
|
||||
std::lock_guard lg{instance.GetLock()};
|
||||
const bool is_game_loaded = instance.IsGameLoaded();
|
||||
|
||||
m_header_widget->UpdateData();
|
||||
m_header_widget->setVisible(instance.HasAPIToken());
|
||||
m_settings_widget->UpdateData();
|
||||
m_progress_widget->UpdateData(true);
|
||||
m_tab_widget->setTabVisible(1, is_game_loaded);
|
||||
m_leaderboard_widget->UpdateData(true);
|
||||
m_tab_widget->setTabVisible(2, is_game_loaded);
|
||||
}
|
||||
update();
|
||||
|
|
|
@ -6,6 +6,8 @@
|
|||
#ifdef USE_RETRO_ACHIEVEMENTS
|
||||
#include <QDialog>
|
||||
|
||||
#include "Core/AchievementManager.h"
|
||||
|
||||
class AchievementHeaderWidget;
|
||||
class AchievementLeaderboardWidget;
|
||||
class AchievementSettingsWidget;
|
||||
|
@ -19,7 +21,7 @@ class AchievementsWindow : public QDialog
|
|||
Q_OBJECT
|
||||
public:
|
||||
explicit AchievementsWindow(QWidget* parent);
|
||||
void UpdateData();
|
||||
void UpdateData(AchievementManager::UpdatedItems updated_items);
|
||||
void ForceSettingsTab();
|
||||
|
||||
private:
|
||||
|
|
|
@ -2005,6 +2005,7 @@ void MainWindow::ShowAchievementsWindow()
|
|||
m_achievements_window->show();
|
||||
m_achievements_window->raise();
|
||||
m_achievements_window->activateWindow();
|
||||
m_achievements_window->UpdateData(AchievementManager::UpdatedItems{.all = true});
|
||||
}
|
||||
|
||||
void MainWindow::ShowAchievementSettings()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue