mirror of
https://github.com/dolphin-emu/dolphin.git
synced 2025-04-19 05:42:37 +00:00
AchievementProgressWidget maintains in memory a map of AchievementBox pointers so that UpdateData can operate on them individually. UpdateData is overhauled for three options: UpdateData(true) will destroy the entire list and re-create it from scratch as before, to be used if the game or player changes/closes/logs out. UpdateData(false) will loop through the map and call UpdateData on every achievement box, to be used for certain settings changes such as enabling badges or disabling hardcore mode. UpdateData(set<IDs>) will call UpdateData on only the IDs in the set, to be used when achievements are unlocked.
98 lines
3.0 KiB
C++
98 lines
3.0 KiB
C++
// Copyright 2023 Dolphin Emulator Project
|
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
|
|
|
#ifdef USE_RETRO_ACHIEVEMENTS
|
|
#include "DolphinQt/Achievements/AchievementsWindow.h"
|
|
|
|
#include <mutex>
|
|
|
|
#include <QDialogButtonBox>
|
|
#include <QTabWidget>
|
|
#include <QVBoxLayout>
|
|
|
|
#include "Core/AchievementManager.h"
|
|
|
|
#include "DolphinQt/Achievements/AchievementHeaderWidget.h"
|
|
#include "DolphinQt/Achievements/AchievementLeaderboardWidget.h"
|
|
#include "DolphinQt/Achievements/AchievementProgressWidget.h"
|
|
#include "DolphinQt/Achievements/AchievementSettingsWidget.h"
|
|
#include "DolphinQt/QtUtils/QueueOnObject.h"
|
|
#include "DolphinQt/QtUtils/WrapInScrollArea.h"
|
|
#include "DolphinQt/Settings.h"
|
|
|
|
AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent)
|
|
{
|
|
setWindowTitle(tr("Achievements"));
|
|
setWindowFlags(windowFlags() & ~Qt::WindowContextHelpButtonHint);
|
|
|
|
CreateMainLayout();
|
|
ConnectWidgets();
|
|
AchievementManager::GetInstance().SetUpdateCallback(
|
|
[this] { QueueOnObject(this, &AchievementsWindow::UpdateData); });
|
|
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
|
|
&AchievementsWindow::UpdateData);
|
|
|
|
UpdateData();
|
|
}
|
|
|
|
void AchievementsWindow::showEvent(QShowEvent* event)
|
|
{
|
|
QDialog::showEvent(event);
|
|
update();
|
|
}
|
|
|
|
void AchievementsWindow::CreateMainLayout()
|
|
{
|
|
const auto is_game_loaded = AchievementManager::GetInstance().IsGameLoaded();
|
|
|
|
m_header_widget = new AchievementHeaderWidget(this);
|
|
m_tab_widget = new QTabWidget();
|
|
m_settings_widget = new AchievementSettingsWidget(m_tab_widget);
|
|
m_progress_widget = new AchievementProgressWidget(m_tab_widget);
|
|
m_leaderboard_widget = new AchievementLeaderboardWidget(m_tab_widget);
|
|
m_tab_widget->addTab(GetWrappedWidget(m_settings_widget, this, 125, 100), tr("Settings"));
|
|
m_tab_widget->addTab(GetWrappedWidget(m_progress_widget, this, 125, 100), tr("Progress"));
|
|
m_tab_widget->setTabVisible(1, is_game_loaded);
|
|
m_tab_widget->addTab(GetWrappedWidget(m_leaderboard_widget, this, 125, 100), tr("Leaderboards"));
|
|
m_tab_widget->setTabVisible(2, is_game_loaded);
|
|
|
|
m_button_box = new QDialogButtonBox(QDialogButtonBox::Close);
|
|
|
|
auto* layout = new QVBoxLayout();
|
|
layout->addWidget(m_header_widget);
|
|
layout->addWidget(m_tab_widget);
|
|
layout->addWidget(m_button_box);
|
|
|
|
WrapInScrollArea(this, layout);
|
|
}
|
|
|
|
void AchievementsWindow::ConnectWidgets()
|
|
{
|
|
connect(m_button_box, &QDialogButtonBox::rejected, this, &QDialog::reject);
|
|
}
|
|
|
|
void AchievementsWindow::UpdateData()
|
|
{
|
|
{
|
|
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();
|
|
m_tab_widget->setTabVisible(2, is_game_loaded);
|
|
}
|
|
update();
|
|
}
|
|
|
|
void AchievementsWindow::ForceSettingsTab()
|
|
{
|
|
m_tab_widget->setCurrentIndex(0);
|
|
}
|
|
|
|
#endif // USE_RETRO_ACHIEVEMENTS
|