From 7ed61c50a1eba9e59d1b28cf801750877b3c0bce Mon Sep 17 00:00:00 2001 From: fizzlepicklepop <203144840+fizzlepicklepop@users.noreply.github.com> Date: Tue, 7 Oct 2025 22:45:04 -0400 Subject: [PATCH] Add toggles for Speedrun timer + Achievement badges visibility Added some new visibility toggles so players can choose what to show (or hide) during their RetroAchievements runs: Toggle for the Speedrun Leaderboards timer Toggle for Achievement Challenge badges --- Source/Core/Core/AchievementManager.cpp | 3 ++ .../Core/Core/Config/AchievementSettings.cpp | 4 ++ Source/Core/Core/Config/AchievementSettings.h | 2 + .../AchievementSettingsWidget.cpp | 38 +++++++++++++++++++ .../Achievements/AchievementSettingsWidget.h | 4 ++ Source/Core/VideoCommon/OnScreenUI.cpp | 22 ++++++++--- 6 files changed, 68 insertions(+), 5 deletions(-) diff --git a/Source/Core/Core/AchievementManager.cpp b/Source/Core/Core/AchievementManager.cpp index 789c9ffb120..eba842b5627 100644 --- a/Source/Core/Core/AchievementManager.cpp +++ b/Source/Core/Core/AchievementManager.cpp @@ -679,6 +679,9 @@ AchievementManager::GetActiveChallenges() const std::vector AchievementManager::GetActiveLeaderboards() const { + if (!Config::Get(Config::RA_LEADERBOARD_TRACKER_ENABLED)) + return {}; + std::vector display_values; for (u32 ix = 0; ix < MAX_DISPLAYED_LBOARDS && ix < m_active_leaderboards.size(); ix++) { diff --git a/Source/Core/Core/Config/AchievementSettings.cpp b/Source/Core/Core/Config/AchievementSettings.cpp index 63945777cbe..f3b3e43ebcf 100644 --- a/Source/Core/Core/Config/AchievementSettings.cpp +++ b/Source/Core/Core/Config/AchievementSettings.cpp @@ -22,6 +22,10 @@ const Info RA_UNOFFICIAL_ENABLED{{System::Achievements, "Achievements", "U const Info RA_ENCORE_ENABLED{{System::Achievements, "Achievements", "EncoreEnabled"}, false}; const Info RA_SPECTATOR_ENABLED{{System::Achievements, "Achievements", "SpectatorEnabled"}, false}; +const Info RA_LEADERBOARD_TRACKER_ENABLED{ + {System::Achievements, "Achievements", "LeaderboardTrackerEnabled"}, true}; +const Info RA_CHALLENGE_INDICATORS_ENABLED{ + {System::Achievements, "Achievements", "ChallengeIndicatorsEnabled"}, true}; const Info RA_DISCORD_PRESENCE_ENABLED{ {System::Achievements, "Achievements", "DiscordPresenceEnabled"}, false}; const Info RA_PROGRESS_ENABLED{{System::Achievements, "Achievements", "ProgressEnabled"}, diff --git a/Source/Core/Core/Config/AchievementSettings.h b/Source/Core/Core/Config/AchievementSettings.h index f1552ec59c5..c567c5565c2 100644 --- a/Source/Core/Core/Config/AchievementSettings.h +++ b/Source/Core/Core/Config/AchievementSettings.h @@ -18,6 +18,8 @@ extern const Info RA_HARDCORE_ENABLED; extern const Info RA_UNOFFICIAL_ENABLED; extern const Info RA_ENCORE_ENABLED; extern const Info RA_SPECTATOR_ENABLED; +extern const Info RA_LEADERBOARD_TRACKER_ENABLED; +extern const Info RA_CHALLENGE_INDICATORS_ENABLED; extern const Info RA_DISCORD_PRESENCE_ENABLED; extern const Info RA_PROGRESS_ENABLED; } // namespace Config diff --git a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp index 6d3ed55ebd5..422cafcd153 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp +++ b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.cpp @@ -109,6 +109,16 @@ void AchievementSettingsWidget::CreateLayout() "submitted to the server.

If this is on at game launch, it will not be turned off " "until game close, because a RetroAchievements session will not be created.

If " "this is off at game launch, it can be toggled freely while the game is running.")); + m_common_leaderboard_tracker_enabled_input = new ToolTipCheckBox(tr("Show Leaderboard Tracker")); + m_common_leaderboard_tracker_enabled_input->SetDescription( + tr("Show the on-screen RetroAchievements leaderboard tracker.

This appears in the " + "bottom-right corner while competing in a leaderboard.")); + m_common_challenge_indicators_enabled_input = + new ToolTipCheckBox(tr("Show Challenge Indicators")); + m_common_challenge_indicators_enabled_input->SetDescription( + tr("Show the on-screen RetroAchievements challenge indicators.

These appear as " + "achievement badges in the bottom-right corner while tracking progress within a " + "challenge.")); m_common_discord_presence_enabled_input = new ToolTipCheckBox(tr("Enable Discord Presence")); m_common_discord_presence_enabled_input->SetDescription( tr("Use RetroAchievements rich presence in your Discord status.

Show Current Game on " @@ -138,6 +148,8 @@ void AchievementSettingsWidget::CreateLayout() #ifdef USE_DISCORD_PRESENCE m_common_layout->addWidget(m_common_discord_presence_enabled_input); #endif // USE_DISCORD_PRESENCE + m_common_layout->addWidget(m_common_leaderboard_tracker_enabled_input); + m_common_layout->addWidget(m_common_challenge_indicators_enabled_input); m_common_layout->addWidget(m_common_progress_enabled_input); m_common_layout->setAlignment(Qt::AlignTop); @@ -158,6 +170,10 @@ void AchievementSettingsWidget::ConnectWidgets() &AchievementSettingsWidget::ToggleEncore); connect(m_common_spectator_enabled_input, &QCheckBox::toggled, this, &AchievementSettingsWidget::ToggleSpectator); + connect(m_common_leaderboard_tracker_enabled_input, &QCheckBox::toggled, this, + &AchievementSettingsWidget::ToggleLeaderboardTracker); + connect(m_common_challenge_indicators_enabled_input, &QCheckBox::toggled, this, + &AchievementSettingsWidget::ToggleChallengeIndicators); connect(m_common_discord_presence_enabled_input, &QCheckBox::toggled, this, &AchievementSettingsWidget::ToggleDiscordPresence); connect(m_common_progress_enabled_input, &QCheckBox::toggled, this, @@ -217,6 +233,14 @@ void AchievementSettingsWidget::LoadSettings() ->setChecked(Config::Get(Config::RA_SPECTATOR_ENABLED)); SignalBlocking(m_common_spectator_enabled_input)->setEnabled(enabled); + SignalBlocking(m_common_leaderboard_tracker_enabled_input) + ->setChecked(Config::Get(Config::RA_LEADERBOARD_TRACKER_ENABLED)); + SignalBlocking(m_common_leaderboard_tracker_enabled_input)->setEnabled(enabled); + + SignalBlocking(m_common_challenge_indicators_enabled_input) + ->setChecked(Config::Get(Config::RA_CHALLENGE_INDICATORS_ENABLED)); + SignalBlocking(m_common_challenge_indicators_enabled_input)->setEnabled(enabled); + SignalBlocking(m_common_discord_presence_enabled_input) ->setChecked(Config::Get(Config::RA_DISCORD_PRESENCE_ENABLED)); SignalBlocking(m_common_discord_presence_enabled_input) @@ -239,6 +263,10 @@ void AchievementSettingsWidget::SaveSettings() Config::SetBaseOrCurrent(Config::RA_ENCORE_ENABLED, m_common_encore_enabled_input->isChecked()); Config::SetBaseOrCurrent(Config::RA_SPECTATOR_ENABLED, m_common_spectator_enabled_input->isChecked()); + Config::SetBaseOrCurrent(Config::RA_LEADERBOARD_TRACKER_ENABLED, + m_common_leaderboard_tracker_enabled_input->isChecked()); + Config::SetBaseOrCurrent(Config::RA_CHALLENGE_INDICATORS_ENABLED, + m_common_challenge_indicators_enabled_input->isChecked()); Config::SetBaseOrCurrent(Config::RA_DISCORD_PRESENCE_ENABLED, m_common_discord_presence_enabled_input->isChecked()); Config::SetBaseOrCurrent(Config::RA_PROGRESS_ENABLED, @@ -310,6 +338,16 @@ void AchievementSettingsWidget::ToggleSpectator() AchievementManager::GetInstance().SetSpectatorMode(); } +void AchievementSettingsWidget::ToggleLeaderboardTracker() +{ + SaveSettings(); +} + +void AchievementSettingsWidget::ToggleChallengeIndicators() +{ + SaveSettings(); +} + void AchievementSettingsWidget::ToggleDiscordPresence() { SaveSettings(); diff --git a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h index 20a6d03c6d6..2a7586ac245 100644 --- a/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h +++ b/Source/Core/DolphinQt/Achievements/AchievementSettingsWidget.h @@ -36,6 +36,8 @@ private: void ToggleUnofficial(); void ToggleEncore(); void ToggleSpectator(); + void ToggleLeaderboardTracker(); + void ToggleChallengeIndicators(); void ToggleDiscordPresence(); void ToggleProgress(); @@ -53,6 +55,8 @@ private: ToolTipCheckBox* m_common_unofficial_enabled_input; ToolTipCheckBox* m_common_encore_enabled_input; ToolTipCheckBox* m_common_spectator_enabled_input; + ToolTipCheckBox* m_common_leaderboard_tracker_enabled_input; + ToolTipCheckBox* m_common_challenge_indicators_enabled_input; ToolTipCheckBox* m_common_discord_presence_enabled_input; ToolTipCheckBox* m_common_progress_enabled_input; }; diff --git a/Source/Core/VideoCommon/OnScreenUI.cpp b/Source/Core/VideoCommon/OnScreenUI.cpp index 4689bb63216..883d810f703 100644 --- a/Source/Core/VideoCommon/OnScreenUI.cpp +++ b/Source/Core/VideoCommon/OnScreenUI.cpp @@ -9,6 +9,7 @@ #include "Core/AchievementManager.h" #include "Core/Config/GraphicsSettings.h" +#include "Core/Config/AchievementSettings.h" #include "Core/Config/MainSettings.h" #include "Core/Config/NetplaySettings.h" #include "Core/Movie.h" @@ -324,10 +325,21 @@ void OnScreenUI::DrawChallengesAndLeaderboards() #ifdef USE_RETRO_ACHIEVEMENTS auto& instance = AchievementManager::GetInstance(); std::lock_guard lg{instance.GetLock()}; - if (instance.AreChallengesUpdated()) + const bool challenge_indicators_enabled = Config::Get(Config::RA_CHALLENGE_INDICATORS_ENABLED); + const bool challenges_updated = instance.AreChallengesUpdated(); + const auto& challenges = instance.GetActiveChallenges(); + + if (!challenge_indicators_enabled) { - instance.ResetChallengesUpdated(); - const auto& challenges = instance.GetActiveChallenges(); + if (challenges_updated) + instance.ResetChallengesUpdated(); + if (!m_challenge_texture_map.empty()) + m_challenge_texture_map.clear(); + } + else if (challenges_updated || m_challenge_texture_map.size() != challenges.size()) + { + if (challenges_updated) + instance.ResetChallengesUpdated(); m_challenge_texture_map.clear(); for (const auto& name : challenges) { @@ -343,7 +355,7 @@ void OnScreenUI::DrawChallengesAndLeaderboards() } float leaderboard_y = ImGui::GetIO().DisplaySize.y; - if (!m_challenge_texture_map.empty()) + if (challenge_indicators_enabled && !m_challenge_texture_map.empty()) { float scale = ImGui::GetIO().DisplaySize.y / 1024.0; ImGui::SetNextWindowSize(ImVec2(0, 0)); @@ -367,7 +379,7 @@ void OnScreenUI::DrawChallengesAndLeaderboards() } const auto& leaderboard_progress = instance.GetActiveLeaderboards(); - if (!leaderboard_progress.empty()) + if (Config::Get(Config::RA_LEADERBOARD_TRACKER_ENABLED) && !leaderboard_progress.empty()) { ImGui::SetNextWindowPos(ImVec2(ImGui::GetIO().DisplaySize.x, leaderboard_y), 0, ImVec2(1.0, 1.0));