From 364c7bd485c877af0a6ba70fdc5bd1efe2b6846d Mon Sep 17 00:00:00 2001 From: Stenzek Date: Sun, 4 Oct 2026 13:13:44 +1000 Subject: [PATCH] Achievements: Extract bucket names out of FullscreenUI --- src/core/achievements.cpp | 22 +++++++++++++++ src/core/achievements_private.h | 3 +++ src/core/fullscreenui_achievements.cpp | 37 +++++++++++++------------- 3 files changed, 43 insertions(+), 19 deletions(-) diff --git a/src/core/achievements.cpp b/src/core/achievements.cpp index ba14a3eb5..58028626a 100644 --- a/src/core/achievements.cpp +++ b/src/core/achievements.cpp @@ -2079,6 +2079,28 @@ std::string Achievements::GetSubsetBadgeURL(const rc_client_subset_t* subset) return subset->badge_url; } +std::string_view Achievements::GetAchievementBucketDisplayName(u32 bucket_id) +{ + static constexpr const char* bucket_names[] = { + // clang-format off + TRANSLATE_NOOP("Achievements", "Unknown"), + TRANSLATE_NOOP("Achievements", "Locked"), + TRANSLATE_NOOP("Achievements", "Unlocked"), + TRANSLATE_NOOP("Achievements", "Unsupported"), + TRANSLATE_NOOP("Achievements", "Unofficial"), + TRANSLATE_NOOP("Achievements", "Recently Unlocked"), + TRANSLATE_NOOP("Achievements", "Active Challenges"), + TRANSLATE_NOOP("Achievements", "Almost There"), + TRANSLATE_NOOP("Achievements", "Not Confirmed"), + TRANSLATE_NOOP("Achievements", "Unlocked in Casual"), + // clang-format on + }; + static_assert(std::size(bucket_names) == NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); + return (bucket_id < NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS) ? + Host::TranslateToStringView("Achievements", bucket_names[bucket_id]) : + "Unknown"; +} + bool Achievements::IsLoggedIn() { return (rc_client_get_user_info(s_state.client) != nullptr); diff --git a/src/core/achievements_private.h b/src/core/achievements_private.h index 9f56150d8..a35e4fd1c 100644 --- a/src/core/achievements_private.h +++ b/src/core/achievements_private.h @@ -105,6 +105,9 @@ std::string GetUserBadgeURL(const char* username); /// Returns the URL for the badge of the specified subset, using the subset ID. std::string GetSubsetBadgeURL(const rc_client_subset_t* subset); +/// Returns a list of achievement bucket names. +std::string_view GetAchievementBucketDisplayName(u32 bucket_id); + } // namespace Achievements namespace FullscreenUI { diff --git a/src/core/fullscreenui_achievements.cpp b/src/core/fullscreenui_achievements.cpp index 6700c7315..59ad88d46 100644 --- a/src/core/fullscreenui_achievements.cpp +++ b/src/core/fullscreenui_achievements.cpp @@ -2305,19 +2305,19 @@ void FullscreenUI::DrawAchievementsWindow() "achievements", background, 0.0f, ImVec2(LAYOUT_MENU_WINDOW_X_PADDING, LAYOUT_MENU_WINDOW_Y_PADDING), 0, true)) { - static constexpr std::pair bucket_names[] = { - {ICON_FA_CIRCLE_QUESTION, TRANSLATE_NOOP("Achievements", "Unknown")}, - {ICON_FA_LOCK, TRANSLATE_NOOP("Achievements", "Locked")}, - {ICON_FA_UNLOCK, TRANSLATE_NOOP("Achievements", "Unlocked")}, - {ICON_FA_TRIANGLE_EXCLAMATION, TRANSLATE_NOOP("Achievements", "Unsupported")}, - {ICON_FA_FLASK_VIAL, TRANSLATE_NOOP("Achievements", "Unofficial")}, - {ICON_FA_LOCK_OPEN, TRANSLATE_NOOP("Achievements", "Recently Unlocked")}, - {ICON_FA_HAND_FIST, TRANSLATE_NOOP("Achievements", "Active Challenges")}, - {ICON_FA_FLAG_CHECKERED, TRANSLATE_NOOP("Achievements", "Almost There")}, - {ICON_EMOJI_WARNING, TRANSLATE_NOOP("Achievements", "Not Confirmed")}, - {ICON_FA_UNLOCK, TRANSLATE_NOOP("Achievements", "Unlocked in Casual")}, + static constexpr const char* bucket_icons[] = { + ICON_FA_CIRCLE_QUESTION, // Unknown + ICON_FA_LOCK, // Locked + ICON_FA_UNLOCK, // Unlocked + ICON_FA_TRIANGLE_EXCLAMATION, // Unsupported + ICON_FA_FLASK_VIAL, // Unofficial + ICON_FA_LOCK_OPEN, // Recently Unlocked + ICON_FA_HAND_FIST, // Active Challenges + ICON_FA_FLAG_CHECKERED, // Almost There + ICON_EMOJI_WARNING, // Not Confirmed + ICON_FA_UNLOCK, // Unlocked in Casual }; - static_assert(std::size(bucket_names) == NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); + static_assert(std::size(bucket_icons) == NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); ResetFocusHere(); BeginMenuButtons(); @@ -2344,13 +2344,12 @@ void FullscreenUI::DrawAchievementsWindow() DebugAssert(bucket.bucket_type < NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); - if (MenuHeadingButton(TinyString::from_format( - "{} {}", bucket_names[bucket.bucket_type].first, - Host::TranslateToStringView("Achievements", bucket_names[bucket.bucket_type].second)), - s_achievements_locals.achievement_buckets_collapsed[bucket.bucket_type] ? - ICON_FA_CHEVRON_DOWN : - ICON_FA_CHEVRON_UP, - UIStyle.MediumLargeFontSize)) + if (MenuHeadingButton( + TinyString::from_format("{} {}", bucket_icons[bucket.bucket_type], + Achievements::GetAchievementBucketDisplayName(bucket.bucket_type)), + s_achievements_locals.achievement_buckets_collapsed[bucket.bucket_type] ? ICON_FA_CHEVRON_DOWN : + ICON_FA_CHEVRON_UP, + UIStyle.MediumLargeFontSize)) { s_achievements_locals.achievement_buckets_collapsed.flip(bucket.bucket_type); }