Merge pull request #12949 from LillyJadeKatrin/retroachievements-new-dev-branch

RetroAchievements - Dev Branch Refactor
This commit is contained in:
JMC47
2025-04-21 14:08:40 -04:00
committed by GitHub
19 changed files with 359 additions and 51 deletions

View File

@ -22,7 +22,7 @@
static constexpr size_t PROGRESS_LENGTH = 24;
AchievementBox::AchievementBox(QWidget* parent, rc_client_achievement_t* achievement)
AchievementBox::AchievementBox(QWidget* parent, const rc_client_achievement_t* achievement)
: QGroupBox(parent), m_achievement(achievement)
{
const auto& instance = AchievementManager::GetInstance();

View File

@ -18,7 +18,7 @@ class AchievementBox final : public QGroupBox
{
Q_OBJECT
public:
explicit AchievementBox(QWidget* parent, rc_client_achievement_t* achievement);
explicit AchievementBox(QWidget* parent, const rc_client_achievement_t* achievement);
void UpdateData();
void UpdateProgress();
@ -28,7 +28,7 @@ private:
QProgressBar* m_progress_bar;
QLabel* m_progress_label;
rc_client_achievement_t* m_achievement;
const rc_client_achievement_t* m_achievement;
};
#endif // USE_RETRO_ACHIEVEMENTS

View File

@ -34,10 +34,6 @@ AchievementSettingsWidget::AchievementSettingsWidget(QWidget* parent) : QWidget(
connect(&Settings::Instance(), &Settings::ConfigChanged, this,
&AchievementSettingsWidget::LoadSettings);
// If hardcore is enabled when the emulator starts, make sure it turns off what it needs to
if (Config::Get(Config::RA_HARDCORE_ENABLED))
UpdateHardcoreMode();
}
void AchievementSettingsWidget::UpdateData(int login_failed_code)
@ -256,10 +252,9 @@ void AchievementSettingsWidget::ToggleRAIntegration()
auto& instance = AchievementManager::GetInstance();
if (Config::Get(Config::RA_ENABLED))
instance.Init();
instance.Init(reinterpret_cast<void*>(winId()));
else
instance.Shutdown();
UpdateHardcoreMode();
}
void AchievementSettingsWidget::Login()
@ -297,7 +292,6 @@ void AchievementSettingsWidget::ToggleHardcore()
}
}
SaveSettings();
UpdateHardcoreMode();
}
void AchievementSettingsWidget::ToggleUnofficial()
@ -327,14 +321,4 @@ void AchievementSettingsWidget::ToggleProgress()
SaveSettings();
}
void AchievementSettingsWidget::UpdateHardcoreMode()
{
if (Config::Get(Config::RA_HARDCORE_ENABLED))
{
Settings::Instance().SetDebugModeEnabled(false);
}
emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance()));
emit Settings::Instance().HardcoreStateChanged();
}
#endif // USE_RETRO_ACHIEVEMENTS

View File

@ -39,8 +39,6 @@ private:
void ToggleDiscordPresence();
void ToggleProgress();
void UpdateHardcoreMode();
QGroupBox* m_common_box;
QVBoxLayout* m_common_layout;
ToolTipCheckBox* m_common_integration_enabled_input;

View File

@ -39,8 +39,6 @@ AchievementsWindow::AchievementsWindow(QWidget* parent) : QDialog(parent)
});
connect(&Settings::Instance(), &Settings::EmulationStateChanged, this,
[this] { m_settings_widget->UpdateData(RC_OK); });
connect(&Settings::Instance(), &Settings::HardcoreStateChanged, this,
[this] { AchievementsWindow::UpdateData({.all = true}); });
}
void AchievementsWindow::showEvent(QShowEvent* event)

View File

@ -677,4 +677,7 @@ endif()
if(USE_RETRO_ACHIEVEMENTS)
target_link_libraries(dolphin-emu PRIVATE rcheevos)
target_compile_definitions(dolphin-emu PRIVATE -DUSE_RETRO_ACHIEVEMENTS)
if(RC_CLIENT_SUPPORTS_RAINTEGRATION)
target_compile_definitions(dolphin-emu PRIVATE -DRC_CLIENT_SUPPORTS_RAINTEGRATION)
endif()
endif()

View File

@ -43,6 +43,7 @@
#include "Core/BootManager.h"
#include "Core/CommonTitles.h"
#include "Core/Config/AchievementSettings.h"
#include "Core/Config/FreeLookSettings.h"
#include "Core/Config/MainSettings.h"
#include "Core/Config/NetplaySettings.h"
#include "Core/Config/UISettings.h"
@ -272,9 +273,15 @@ MainWindow::MainWindow(Core::System& system, std::unique_ptr<BootParameters> boo
NetPlayInit();
#ifdef USE_RETRO_ACHIEVEMENTS
AchievementManager::GetInstance().Init();
AchievementManager::GetInstance().Init(reinterpret_cast<void*>(winId()));
if (AchievementManager::GetInstance().IsHardcoreModeActive())
Settings::Instance().SetDebugModeEnabled(false);
// This needs to trigger on both RA_HARDCORE_ENABLED and RA_ENABLED
Config::AddConfigChangedCallback(
[this]() { QueueOnObject(this, [this] { this->OnHardcoreChanged(); }); });
// If hardcore is enabled when the emulator starts, make sure it turns off what it needs to
if (Config::Get(Config::RA_HARDCORE_ENABLED))
OnHardcoreChanged();
#endif // USE_RETRO_ACHIEVEMENTS
#if defined(__unix__) || defined(__unix) || defined(__APPLE__)
@ -935,7 +942,11 @@ bool MainWindow::RequestStop()
else
FullScreen();
if (Config::Get(Config::MAIN_CONFIRM_ON_STOP))
bool confirm_on_stop = Config::Get(Config::MAIN_CONFIRM_ON_STOP);
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
confirm_on_stop = confirm_on_stop || AchievementManager::GetInstance().CheckForModifications();
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
if (confirm_on_stop)
{
if (std::exchange(m_stop_confirm_showing, true))
return true;
@ -960,13 +971,27 @@ bool MainWindow::RequestStop()
// This is to avoid any "race conditions" between the "Window Activate" message and the
// message box returning, which could break cursor locking depending on the order
m_render_widget->SetWaitingForMessageBox(true);
auto confirm = ModalMessageBox::question(
confirm_parent, tr("Confirm"),
m_stop_requested ? tr("A shutdown is already in progress. Unsaved data "
"may be lost if you stop the current emulation "
"before it completes. Force stop?") :
tr("Do you want to stop the current emulation?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton, Qt::ApplicationModal);
QString message;
if (m_stop_requested)
{
message = tr("A shutdown is already in progress. Unsaved data "
"may be lost if you stop the current emulation "
"before it completes. Force stop?");
}
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
else if (AchievementManager::GetInstance().CheckForModifications())
{
message = tr(
"Do you want to stop the current emulation? Unsaved achievement modifications detected.");
}
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
else
{
message = tr("Do you want to stop the current emulation?");
}
auto confirm = ModalMessageBox::question(confirm_parent, tr("Confirm"), message,
QMessageBox::Yes | QMessageBox::No,
QMessageBox::NoButton, Qt::ApplicationModal);
// If a user confirmed stopping the emulation, we do not capture the cursor again,
// even if the render widget will stay alive for a while.
@ -1992,6 +2017,13 @@ void MainWindow::ShowAchievementSettings()
ShowAchievementsWindow();
m_achievements_window->ForceSettingsTab();
}
void MainWindow::OnHardcoreChanged()
{
if (Config::Get(Config::RA_HARDCORE_ENABLED))
Settings::Instance().SetDebugModeEnabled(false);
emit Settings::Instance().EmulationStateChanged(Core::GetState(Core::System::GetInstance()));
}
#endif // USE_RETRO_ACHIEVEMENTS
void MainWindow::ShowMemcardManager()

View File

@ -181,6 +181,7 @@ private:
#ifdef USE_RETRO_ACHIEVEMENTS
void ShowAchievementsWindow();
void ShowAchievementSettings();
void OnHardcoreChanged();
#endif // USE_RETRO_ACHIEVEMENTS
void NetPlayInit();

View File

@ -64,6 +64,7 @@
#include "DolphinQt/QtUtils/DolphinFileDialog.h"
#include "DolphinQt/QtUtils/ModalMessageBox.h"
#include "DolphinQt/QtUtils/ParallelProgressDialog.h"
#include "DolphinQt/QtUtils/QueueOnObject.h"
#include "DolphinQt/QtUtils/SetWindowDecorations.h"
#include "DolphinQt/Settings.h"
#include "DolphinQt/Updater.h"
@ -71,6 +72,10 @@
#include "UICommon/AutoUpdate.h"
#include "UICommon/GameFile.h"
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
#include <rcheevos/include/rc_client_raintegration.h>
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QPointer<MenuBar> MenuBar::s_menu_bar;
QString MenuBar::GetSignatureSelector() const
@ -284,8 +289,14 @@ void MenuBar::AddToolsMenu()
tools_menu->addSeparator();
#ifdef USE_RETRO_ACHIEVEMENTS
tools_menu->addAction(tr("Achievements"), this, [this] { emit ShowAchievementsWindow(); });
m_achievements_action =
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_achievements_dev_menu->menuAction()->setVisible(false);
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
tools_menu->addSeparator();
#endif // USE_RETRO_ACHIEVEMENTS
@ -1124,6 +1135,38 @@ void MenuBar::UpdateToolsMenu(const Core::State state)
}
}
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
void MenuBar::UpdateAchievementDevelopmentMenu()
{
auto* dev_menu = AchievementManager::GetInstance().GetDevelopmentMenu();
if (dev_menu)
{
m_achievements_dev_menu->menuAction()->setVisible(true);
m_achievements_dev_menu->clear();
for (u32 i = 0; i < dev_menu->num_items; i++)
{
const auto& menu_item = dev_menu->items[i];
if (menu_item.label == nullptr)
{
m_achievements_dev_menu->addSeparator();
continue;
}
auto* ra_dev_menu_item = m_achievements_dev_menu->addAction(
QString::fromStdString(menu_item.label), this,
[menu_item]() { AchievementManager::GetInstance().ActivateDevMenuItem(menu_item.id); });
ra_dev_menu_item->setEnabled(menu_item.enabled);
// Recommended hardcode by RAIntegration.dll developer Jamiras
ra_dev_menu_item->setCheckable(i < 2);
ra_dev_menu_item->setChecked(menu_item.checked);
}
}
else
{
m_achievements_dev_menu->menuAction()->setVisible(false);
}
}
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
void MenuBar::InstallWAD()
{
QString wad_file = DolphinFileDialog::getOpenFileName(this, tr("Select Title to Install to NAND"),

View File

@ -44,6 +44,9 @@ public:
explicit MenuBar(QWidget* parent = nullptr);
void UpdateToolsMenu(Core::State state);
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
void UpdateAchievementDevelopmentMenu();
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QMenu* GetListColumnsMenu() const { return m_cols_menu; }
@ -205,6 +208,10 @@ private:
QAction* m_wad_install_action;
QMenu* m_perform_online_update_menu;
QAction* m_perform_online_update_for_current_region;
QAction* m_achievements_action;
#ifdef RC_CLIENT_SUPPORTS_RAINTEGRATION
QMenu* m_achievements_dev_menu;
#endif // RC_CLIENT_SUPPORTS_RAINTEGRATION
QAction* m_ntscj_ipl;
QAction* m_ntscu_ipl;
QAction* m_pal_ipl;

View File

@ -222,7 +222,6 @@ signals:
void SDCardInsertionChanged(bool inserted);
void USBKeyboardConnectionChanged(bool connected);
void EnableGfxModsChanged(bool enabled);
void HardcoreStateChanged();
private:
Settings();