Skip to content

Commit 4cbd01d

Browse files
committed
Qt: Get rid of nested event loops in achievement login
1 parent ee1defd commit 4cbd01d

File tree

4 files changed

+76
-41
lines changed

4 files changed

+76
-41
lines changed

src/core/achievements.cpp

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -688,9 +688,7 @@ void Achievements::UpdateSettings(const Settings& old_config)
688688
if (g_settings.achievements_hardcore_mode != old_config.achievements_hardcore_mode)
689689
{
690690
// Enables have to wait for reset, disables can go through immediately.
691-
if (g_settings.achievements_hardcore_mode)
692-
DisplayHardcoreDeferredMessage();
693-
else
691+
if (!g_settings.achievements_hardcore_mode)
694692
DisableHardcoreMode(true, true);
695693
}
696694

@@ -1701,8 +1699,8 @@ void Achievements::OnHardcoreModeChanged(bool enabled, bool display_message, boo
17011699
if (System::IsValid() && display_message)
17021700
{
17031701
Host::AddIconOSDMessage(OSDMessageType::Info, "AchievementsHardcoreModeChanged", RA_LOGO_ICON_NAME,
1704-
enabled ? TRANSLATE_STR("Achievements", "Hardcore Mode Enabled") :
1705-
TRANSLATE_STR("Achievements", "Hardcore Mode Disabled"),
1702+
enabled ? TRANSLATE_STR("Achievements", "Hardcore mode enabled.") :
1703+
TRANSLATE_STR("Achievements", "Hardcore mode disabled."),
17061704
enabled ? TRANSLATE_STR("Achievements", "Restrictions are now active.") :
17071705
TRANSLATE_STR("Achievements", "Restrictions are no longer active."));
17081706
}

src/duckstation-qt/achievementlogindialog.cpp

Lines changed: 63 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -80,45 +80,81 @@ void AchievementLoginDialog::processLoginResult(bool result, const QString& mess
8080
return;
8181
}
8282

83-
if (!Host::GetBaseBoolSettingValue("Cheevos", "Enabled", false) &&
84-
QtUtils::MessageBoxQuestion(
85-
this, tr("Enable Achievements"),
86-
tr("Achievement tracking is not currently enabled. Your login will have no effect until "
87-
"after tracking is enabled.\n\nDo you want to enable tracking now?")) == QMessageBox::Yes)
83+
// don't ask to enable etc if we are just reauthenticating
84+
if (m_reason == Achievements::LoginRequestReason::TokenInvalid)
8885
{
86+
accept();
87+
return;
88+
}
89+
90+
askToEnableAchievementsAndAccept();
91+
}
92+
93+
void AchievementLoginDialog::askToEnableAchievementsAndAccept()
94+
{
95+
if (Host::GetBaseBoolSettingValue("Cheevos", "Enabled", false))
96+
{
97+
askToEnableHardcoreModeAndAccept();
98+
return;
99+
}
100+
101+
QMessageBox* const msgbox =
102+
QtUtils::NewMessageBox(this, QMessageBox::Question, tr("Enable Achievements"),
103+
tr("Achievement tracking is not currently enabled. Your login will have no effect until "
104+
"after tracking is enabled.\n\nDo you want to enable tracking now?"),
105+
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
106+
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
89107
Host::SetBaseBoolSettingValue("Cheevos", "Enabled", true);
90108
Host::CommitBaseSettingChanges();
91109
g_emu_thread->applySettings();
92-
}
110+
askToEnableHardcoreModeAndAccept();
111+
});
112+
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
113+
msgbox->open();
114+
}
93115

94-
if (!Host::GetBaseBoolSettingValue("Cheevos", "ChallengeMode", false) &&
95-
QtUtils::MessageBoxQuestion(
96-
this, tr("Enable Hardcore Mode"),
97-
tr("Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and "
98-
"participate in game-specific leaderboards.\n\nHowever, hardcore mode also prevents the usage of save "
99-
"states, cheats and slowdown functionality.\n\nDo you want to enable hardcore mode?")) == QMessageBox::Yes)
116+
void AchievementLoginDialog::askToEnableHardcoreModeAndAccept()
117+
{
118+
if (Host::GetBaseBoolSettingValue("Cheevos", "ChallengeMode", false))
100119
{
120+
askToResetGameAndAccept();
121+
return;
122+
}
123+
124+
QMessageBox* const msgbox = QtUtils::NewMessageBox(
125+
this, QMessageBox::Question, tr("Enable Hardcore Mode"),
126+
tr("Hardcore mode is not currently enabled. Enabling hardcore mode allows you to set times, scores, and "
127+
"participate in game-specific leaderboards.\n\nHowever, hardcore mode also prevents the usage of save "
128+
"states, cheats and slowdown functionality.\n\nDo you want to enable hardcore mode?"),
129+
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
130+
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
101131
Host::SetBaseBoolSettingValue("Cheevos", "ChallengeMode", true);
102132
Host::CommitBaseSettingChanges();
103133
g_emu_thread->applySettings();
134+
askToResetGameAndAccept();
135+
});
136+
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
137+
msgbox->open();
138+
}
104139

105-
bool has_active_game;
106-
{
107-
auto lock = Achievements::GetLock();
108-
has_active_game = Achievements::HasActiveGame();
109-
}
110-
111-
if (has_active_game &&
112-
QtUtils::MessageBoxCritical(
113-
this, tr("Reset System"),
114-
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) ==
115-
QMessageBox::Yes)
116-
{
117-
g_emu_thread->resetSystem(true);
118-
}
140+
void AchievementLoginDialog::askToResetGameAndAccept()
141+
{
142+
if (!QtHost::IsSystemValid())
143+
{
144+
accept();
145+
return;
119146
}
120147

121-
accept();
148+
QMessageBox* const msgbox = QtUtils::NewMessageBox(
149+
this, QMessageBox::Question, tr("Reset System"),
150+
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?"),
151+
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
152+
msgbox->connect(msgbox, &QMessageBox::accepted, this, [this]() {
153+
g_emu_thread->resetSystem(true);
154+
accept();
155+
});
156+
msgbox->connect(msgbox, &QMessageBox::rejected, this, &AchievementLoginDialog::accept);
157+
msgbox->open();
122158
}
123159

124160
void AchievementLoginDialog::connectUi()

src/duckstation-qt/achievementlogindialog.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ class AchievementLoginDialog final : public QDialog
2727
void cancelClicked();
2828
void processLoginResult(bool result, const QString& message);
2929

30+
void askToEnableAchievementsAndAccept();
31+
void askToEnableHardcoreModeAndAccept();
32+
void askToResetGameAndAccept();
33+
3034
Ui::AchievementLoginDialog m_ui;
3135
QPushButton* m_login;
3236
Achievements::LoginRequestReason m_reason;

src/duckstation-qt/achievementsettingswidget.cpp

Lines changed: 6 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -179,15 +179,12 @@ void AchievementSettingsWidget::onHardcoreModeStateChanged()
179179
return;
180180
}
181181

182-
if (QtUtils::MessageBoxQuestion(
183-
this, tr("Reset System"),
184-
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?")) !=
185-
QMessageBox::Yes)
186-
{
187-
return;
188-
}
189-
190-
g_emu_thread->resetSystem(true);
182+
QMessageBox* const msgbox = QtUtils::NewMessageBox(
183+
this, QMessageBox::Question, tr("Reset System"),
184+
tr("Hardcore mode will not be enabled until the system is reset. Do you want to reset the system now?"),
185+
QMessageBox::Yes | QMessageBox::No, QMessageBox::NoButton);
186+
msgbox->connect(msgbox, &QMessageBox::accepted, this, []() { g_emu_thread->resetSystem(true); });
187+
msgbox->open();
191188
}
192189

193190
void AchievementSettingsWidget::onAchievementsNotificationDurationSliderChanged()

0 commit comments

Comments
 (0)