diff --git a/src/duckstation-qt/setupwizarddialog.cpp b/src/duckstation-qt/setupwizarddialog.cpp index 53d732bb0..ff6c3e6f1 100644 --- a/src/duckstation-qt/setupwizarddialog.cpp +++ b/src/duckstation-qt/setupwizarddialog.cpp @@ -547,8 +547,13 @@ void SetupWizardDialog::setupAchievementsPage(bool initial) SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.enable, "Cheevos", "Enabled", false); SettingWidgetBinder::BindWidgetToBoolSetting(nullptr, m_ui.hardcoreMode, "Cheevos", "ChallengeMode", false); connect(m_ui.enable, &QCheckBox::checkStateChanged, this, &SetupWizardDialog::updateAchievementsEnableState); - connect(m_ui.loginButton, &QPushButton::clicked, this, &SetupWizardDialog::onAchievementsLoginLogoutClicked); - connect(m_ui.viewProfile, &QPushButton::clicked, this, &SetupWizardDialog::onAchievementsViewProfileClicked); + connect(m_ui.achievementsLoginButton, &QPushButton::clicked, this, &SetupWizardDialog::onAchievementsLoginPressed); + connect(m_ui.achievementsLogoutButton, &QPushButton::clicked, this, + &SetupWizardDialog::onAchievementsLogoutPressed); + connect(m_ui.achievementsRegisterUserButton, &QPushButton::clicked, this, + &SetupWizardDialog::onAchievementsRegisterUserPressed); + connect(m_ui.achievementsViewProfileButton, &QPushButton::clicked, this, + &SetupWizardDialog::onAchievementsViewProfilePressed); } updateAchievementsEnableState(); @@ -563,8 +568,25 @@ void SetupWizardDialog::updateAchievementsEnableState() void SetupWizardDialog::updateAchievementsLoginState() { - const std::string username(Core::GetBaseStringSettingValue("Cheevos", "Username")); - const bool logged_in = !username.empty(); + m_ui.achievementsUserBadge->setPixmap(QPixmap(QtHost::GetResourceQPath("images/ra-generic-user.png", true))); + + QString qusername; + QString qbadge_path; + + { + const auto lock = Achievements::GetLock(); + if (Achievements::IsLoggedIn()) + { + qusername = QString::fromStdString(Achievements::GetLoggedInUserName()); + QtUtils::SetLabelPixmapPathOrURL(m_ui.achievementsUserBadge, Achievements::GetLoggedInUserIconURL(), true); + } + else + { + qusername = QString::fromStdString(Core::GetBaseStringSettingValue("Cheevos", "Username")); + } + } + + const bool logged_in = !qusername.isEmpty(); if (logged_in) { @@ -572,57 +594,67 @@ void SetupWizardDialog::updateAchievementsLoginState() StringUtil::FromChars(Core::GetBaseStringSettingValue("Cheevos", "LoginTimestamp", "0")).value_or(0); const QString login_timestamp = QtHost::FormatNumber(Host::NumberFormatType::ShortDateTime, static_cast(login_unix_timestamp)); - m_ui.loginStatus->setText( - tr("Username: %1\nLogin token generated on %2.").arg(QString::fromStdString(username)).arg(login_timestamp)); - m_ui.loginButton->setText(tr("Logout")); + m_ui.achievementsLoginStatus->setText( + tr("Logged in as %1\nToken generated at %2").arg(qusername).arg(login_timestamp)); } else { - m_ui.loginStatus->setText(tr("Not Logged In.")); - m_ui.loginButton->setText(tr("Login...")); + m_ui.achievementsLoginStatus->setText(tr("Not Logged In.")); } - m_ui.viewProfile->setEnabled(logged_in); + m_ui.achievementsViewProfileButton->setVisible(logged_in); + m_ui.achievementsViewProfileButton->setEnabled(logged_in); + m_ui.achievementsLogoutButton->setVisible(logged_in); + m_ui.achievementsLogoutButton->setEnabled(logged_in); + m_ui.achievementsRegisterUserButton->setVisible(!logged_in); + m_ui.achievementsRegisterUserButton->setEnabled(!logged_in); + m_ui.achievementsLoginButton->setVisible(!logged_in); + m_ui.achievementsLoginButton->setEnabled(!logged_in); } -void SetupWizardDialog::onAchievementsLoginLogoutClicked() +void SetupWizardDialog::onAchievementsLoginPressed() { - if (!Core::GetBaseStringSettingValue("Cheevos", "Username").empty()) - { - Host::RunOnCoreThread([]() { Achievements::Logout(); }, true); - updateAchievementsLoginState(); - return; - } - AchievementLoginDialog* login = new AchievementLoginDialog(this, Achievements::LoginRequestReason::UserInitiated); connect(login, &AchievementLoginDialog::accepted, this, &SetupWizardDialog::onAchievementsLoginCompleted); login->open(); } +void SetupWizardDialog::onAchievementsLogoutPressed() +{ + if (Core::GetBaseStringSettingValue("Cheevos", "Username").empty()) + return; + + // Really should do this on the core thread, but it's luckily not doing anything at this point. + Achievements::Logout(); + updateAchievementsLoginState(); +} + void SetupWizardDialog::onAchievementsLoginCompleted() { - updateAchievementsEnableState(); updateAchievementsLoginState(); // Login can enable achievements/hardcore. if (!m_ui.enable->isChecked() && Core::GetBaseBoolSettingValue("Cheevos", "Enabled", false)) { m_ui.enable->setChecked(true); - updateAchievementsLoginState(); + updateAchievementsEnableState(); } if (!m_ui.hardcoreMode->isChecked() && Core::GetBaseBoolSettingValue("Cheevos", "ChallengeMode", false)) m_ui.hardcoreMode->setChecked(true); } -void SetupWizardDialog::onAchievementsViewProfileClicked() +void SetupWizardDialog::onAchievementsRegisterUserPressed() +{ + QtUtils::OpenURL(this, QUrl(QString::fromLatin1(Achievements::RA_REGISTER_URL))); +} + +void SetupWizardDialog::onAchievementsViewProfilePressed() { const std::string username(Core::GetBaseStringSettingValue("Cheevos", "Username")); if (username.empty()) return; - const QByteArray encoded_username(QUrl::toPercentEncoding(QString::fromStdString(username))); - QtUtils::OpenURL( - this, QUrl(QStringLiteral("https://retroachievements.org/user/%1").arg(QString::fromUtf8(encoded_username)))); + QtUtils::OpenURL(this, QUrl(QString::fromStdString(Achievements::GetProfileURL(username)))); } void SetupWizardDialog::setupGameListViewPage() diff --git a/src/duckstation-qt/setupwizarddialog.h b/src/duckstation-qt/setupwizarddialog.h index 6c4e7bf6c..5248b6408 100644 --- a/src/duckstation-qt/setupwizarddialog.h +++ b/src/duckstation-qt/setupwizarddialog.h @@ -73,9 +73,11 @@ private: void openAutomaticMappingMenu(u32 port, QLabel* update_label); void doDeviceAutomaticBinding(u32 port, QLabel* update_label, const QString& device); - void onAchievementsLoginLogoutClicked(); + void onAchievementsLoginPressed(); + void onAchievementsLogoutPressed(); void onAchievementsLoginCompleted(); - void onAchievementsViewProfileClicked(); + void onAchievementsRegisterUserPressed(); + void onAchievementsViewProfilePressed(); void updateAchievementsEnableState(); void updateAchievementsLoginState(); diff --git a/src/duckstation-qt/setupwizarddialog.ui b/src/duckstation-qt/setupwizarddialog.ui index 06c1c2f59..e84a50329 100644 --- a/src/duckstation-qt/setupwizarddialog.ui +++ b/src/duckstation-qt/setupwizarddialog.ui @@ -1130,13 +1130,98 @@ - <html><head/><body><p>DuckStation supports earning achievements and leaderboard tracking with RetroAchievements.</p><p>If you have a RetroAchievements account, you can use the form below to log in. If not, you can register at <a href="https://retroachievements.org/createaccount.php"><span style=" text-decoration: underline; color:#99ebff;">https://retroachievements.org/createaccount.php</span></a>.</p><p>A RetroAchievements account is <span style=" font-weight:700;">not</span> required to use DuckStation.</p></body></html> + <html><head/><body><p>DuckStation supports earning achievements and leaderboard tracking with RetroAchievements.</p><p>If you have a RetroAchievements account, you can use the form below to log in. If not, you can register by clicking the Register button below.</p><p>A RetroAchievements account is <span style=" font-weight:700;">not</span> required to use DuckStation.</p></body></html> true + + + + + 10 + + + + + + 0 + 0 + + + + + 32 + 32 + + + + + 32 + 32 + + + + true + + + + + + + Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop + + + + + + + Register + + + + :/icons/monochrome/svg/user-add-line.svg:/icons/monochrome/svg/user-add-line.svg + + + + + + + View Profile... + + + + :/icons/monochrome/svg/id-card-line.svg:/icons/monochrome/svg/id-card-line.svg + + + + + + + Login... + + + + :/icons/monochrome/svg/login-box-line.svg:/icons/monochrome/svg/login-box-line.svg + + + + + + + Logout + + + + :/icons/monochrome/svg/logout-box-line.svg:/icons/monochrome/svg/logout-box-line.svg + + + + + + @@ -1160,52 +1245,6 @@ - - - - Account - - - - - - Username: -Login token generated at: - - - Qt::AlignmentFlag::AlignLeading|Qt::AlignmentFlag::AlignLeft|Qt::AlignmentFlag::AlignTop - - - - - - - - - View Profile... - - - - :/icons/monochrome/svg/id-card-line.svg:/icons/monochrome/svg/id-card-line.svg - - - - - - - Login... - - - - :/icons/monochrome/svg/login-box-line.svg:/icons/monochrome/svg/login-box-line.svg - - - - - - - -