Qt: Get rid of nested event loops in achievement login

This commit is contained in:
Stenzek
2025-11-28 13:56:04 +10:00
parent ee1defd43c
commit 4cbd01d033
4 changed files with 76 additions and 41 deletions

View File

@@ -688,9 +688,7 @@ void Achievements::UpdateSettings(const Settings& old_config)
if (g_settings.achievements_hardcore_mode != old_config.achievements_hardcore_mode)
{
// Enables have to wait for reset, disables can go through immediately.
if (g_settings.achievements_hardcore_mode)
DisplayHardcoreDeferredMessage();
else
if (!g_settings.achievements_hardcore_mode)
DisableHardcoreMode(true, true);
}
@@ -1701,8 +1699,8 @@ void Achievements::OnHardcoreModeChanged(bool enabled, bool display_message, boo
if (System::IsValid() && display_message)
{
Host::AddIconOSDMessage(OSDMessageType::Info, "AchievementsHardcoreModeChanged", RA_LOGO_ICON_NAME,
enabled ? TRANSLATE_STR("Achievements", "Hardcore Mode Enabled") :
TRANSLATE_STR("Achievements", "Hardcore Mode Disabled"),
enabled ? TRANSLATE_STR("Achievements", "Hardcore mode enabled.") :
TRANSLATE_STR("Achievements", "Hardcore mode disabled."),
enabled ? TRANSLATE_STR("Achievements", "Restrictions are now active.") :
TRANSLATE_STR("Achievements", "Restrictions are no longer active."));
}

View File

@@ -80,45 +80,81 @@ void AchievementLoginDialog::processLoginResult(bool result, const QString& mess
return;
}
if (!Host::GetBaseBoolSettingValue("Cheevos", "Enabled", false) &&
QtUtils::MessageBoxQuestion(
this, tr("Enable Achievements"),
tr("Achievement tracking is not currently enabled. Your login will have no effect until "
"after tracking is enabled.\n\nDo you want to enable tracking now?")) == QMessageBox::Yes)
// don't ask to enable etc if we are just reauthenticating
if (m_reason == Achievements::LoginRequestReason::TokenInvalid)
{
accept();
return;
}
askToEnableAchievementsAndAccept();
}
void AchievementLoginDialog::askToEnableAchievementsAndAccept()
{
if (Host::GetBaseBoolSettingValue("Cheevos", "Enabled", false))
{
askToEnableHardcoreModeAndAccept();
return;
}
QMessageBox* const msgbox =
QtUtils::NewMessageBox(this, QMessageBox::Question, tr("Enable Achievements"),
tr("Achievement tracking is not currently enabled. Your login will have no effect until "
"after tracking is enabled.\n\nDo you want to enable tracking now?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
Host::SetBaseBoolSettingValue("Cheevos", "Enabled", true);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
askToEnableHardcoreModeAndAccept();
});
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
msgbox->open();
}
void AchievementLoginDialog::askToEnableHardcoreModeAndAccept()
{
if (Host::GetBaseBoolSettingValue("Cheevos", "ChallengeMode", false))
{
askToResetGameAndAccept();
return;
}
if (!Host::GetBaseBoolSettingValue("Cheevos", "ChallengeMode", false) &&
QtUtils::MessageBoxQuestion(
this, tr("Enable Hardcore Mode"),
tr("Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and "
"participate in game-specific leaderboards.\n\nHowever, hardcore mode also prevents the usage of save "
"states, cheats and slowdown functionality.\n\nDo you want to enable hardcore mode?")) == QMessageBox::Yes)
{
QMessageBox* const msgbox = QtUtils::NewMessageBox(
this, QMessageBox::Question, tr("Enable Hardcore Mode"),
tr("Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and "
"participate in game-specific leaderboards.\n\nHowever, hardcore mode also prevents the usage of save "
"states, cheats and slowdown functionality.\n\nDo you want to enable hardcore mode?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
Host::SetBaseBoolSettingValue("Cheevos", "ChallengeMode", true);
Host::CommitBaseSettingChanges();
g_emu_thread->applySettings();
askToResetGameAndAccept();
});
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
msgbox->open();
}
bool has_active_game;
{
auto lock = Achievements::GetLock();
has_active_game = Achievements::HasActiveGame();
}
if (has_active_game &&
QtUtils::MessageBoxCritical(
this, tr("Reset System"),
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) ==
QMessageBox::Yes)
{
g_emu_thread->resetSystem(true);
}
void AchievementLoginDialog::askToResetGameAndAccept()
{
if (!QtHost::IsSystemValid())
{
accept();
return;
}
accept();
QMessageBox* const msgbox = QtUtils::NewMessageBox(
this, QMessageBox::Question, tr("Reset System"),
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
g_emu_thread->resetSystem(true);
accept();
});
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
msgbox->open();
}
void AchievementLoginDialog::connectUi()

View File

@@ -27,6 +27,10 @@ private:
void cancelClicked();
void processLoginResult(bool result, const QString& message);
void askToEnableAchievementsAndAccept();
void askToEnableHardcoreModeAndAccept();
void askToResetGameAndAccept();
Ui::AchievementLoginDialog m_ui;
QPushButton* m_login;
Achievements::LoginRequestReason m_reason;

View File

@@ -179,15 +179,12 @@ void AchievementSettingsWidget::onHardcoreModeStateChanged()
return;
}
if (QtUtils::MessageBoxQuestion(
this, tr("Reset System"),
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) !=
QMessageBox::Yes)
{
return;
}
g_emu_thread->resetSystem(true);
QMessageBox* const msgbox = QtUtils::NewMessageBox(
this, QMessageBox::Question, tr("Reset System"),
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?"),
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
msgbox->connect(msgbox, &QMessageBox::accepted, this, []() { g_emu_thread->resetSystem(true); });
msgbox->open();
}
void AchievementSettingsWidget::onAchievementsNotificationDurationSliderChanged()