|
22 | 22 | #include "IconsEmoji.h" |
23 | 23 | #include "IconsPromptFont.h" |
24 | 24 |
|
| 25 | +#include <bitset> |
| 26 | + |
25 | 27 | LOG_CHANNEL(FullscreenUI); |
26 | 28 |
|
27 | 29 | #ifndef __ANDROID__ |
@@ -159,14 +161,16 @@ struct AchievementsLocals |
159 | 161 | std::vector<SubsetInfo> subset_info_list; |
160 | 162 | const SubsetInfo* open_subset = nullptr; |
161 | 163 |
|
162 | | - rc_client_achievement_list_t* achievement_list = nullptr; |
163 | 164 | std::vector<std::tuple<const void*, std::string, bool>> achievement_badge_paths; |
164 | 165 |
|
165 | 166 | std::optional<PauseMenuAchievementInfoWithPoints> most_recent_unlock; |
166 | 167 | std::optional<PauseMenuMeasuredAchievementInfo> achievement_nearest_completion; |
167 | 168 | std::optional<PauseMenuTimedMeasuredAchievementInfo> most_recent_progress_update; |
168 | 169 | std::vector<PauseMenuLeaderboardInfo> active_leaderboards; |
169 | 170 |
|
| 171 | + rc_client_achievement_list_t* achievement_list = nullptr; |
| 172 | + std::bitset<NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS> achievement_buckets_collapsed = {}; |
| 173 | + |
170 | 174 | rc_client_leaderboard_list_t* leaderboard_list = nullptr; |
171 | 175 | const rc_client_leaderboard_t* open_leaderboard = nullptr; |
172 | 176 | rc_client_async_handle_t* leaderboard_fetch_handle = nullptr; |
@@ -1581,6 +1585,9 @@ void FullscreenUI::SwitchToAchievements() |
1581 | 1585 | return; |
1582 | 1586 | } |
1583 | 1587 |
|
| 1588 | + // reset collapsed buckets |
| 1589 | + s_achievements_locals.achievement_buckets_collapsed.reset(); |
| 1590 | + |
1584 | 1591 | // sort unlocked achievements by unlock time |
1585 | 1592 | for (size_t i = 0; i < s_achievements_locals.achievement_list->num_buckets; i++) |
1586 | 1593 | { |
@@ -1816,7 +1823,6 @@ void FullscreenUI::DrawAchievementsWindow() |
1816 | 1823 | "achievements", background, 0.0f, |
1817 | 1824 | ImVec2(LAYOUT_MENU_WINDOW_X_PADDING, LAYOUT_MENU_WINDOW_Y_PADDING), 0)) |
1818 | 1825 | { |
1819 | | - static bool buckets_collapsed[NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS] = {}; |
1820 | 1826 | static constexpr std::pair<const char*, const char*> bucket_names[] = { |
1821 | 1827 | {ICON_FA_CIRCLE_QUESTION, TRANSLATE_NOOP("Achievements", "Unknown")}, |
1822 | 1828 | {ICON_FA_LOCK, TRANSLATE_NOOP("Achievements", "Locked")}, |
@@ -1848,12 +1854,17 @@ void FullscreenUI::DrawAchievementsWindow() |
1848 | 1854 |
|
1849 | 1855 | DebugAssert(bucket.bucket_type < NUM_RC_CLIENT_ACHIEVEMENT_BUCKETS); |
1850 | 1856 |
|
1851 | | - bool& bucket_collapsed = buckets_collapsed[bucket.bucket_type]; |
1852 | | - bucket_collapsed ^= MenuHeadingButton( |
1853 | | - TinyString::from_format("{} {}", bucket_names[bucket.bucket_type].first, |
1854 | | - Host::TranslateToStringView("Achievements", bucket_names[bucket.bucket_type].second)), |
1855 | | - bucket_collapsed ? ICON_FA_CHEVRON_DOWN : ICON_FA_CHEVRON_UP, UIStyle.MediumLargeFontSize); |
1856 | | - if (!bucket_collapsed) |
| 1857 | + if (MenuHeadingButton(TinyString::from_format( |
| 1858 | + "{} {}", bucket_names[bucket.bucket_type].first, |
| 1859 | + Host::TranslateToStringView("Achievements", bucket_names[bucket.bucket_type].second)), |
| 1860 | + s_achievements_locals.achievement_buckets_collapsed[bucket.bucket_type] ? |
| 1861 | + ICON_FA_CHEVRON_DOWN : |
| 1862 | + ICON_FA_CHEVRON_UP, |
| 1863 | + UIStyle.MediumLargeFontSize)) |
| 1864 | + { |
| 1865 | + s_achievements_locals.achievement_buckets_collapsed.flip(bucket.bucket_type); |
| 1866 | + } |
| 1867 | + if (!s_achievements_locals.achievement_buckets_collapsed[bucket.bucket_type]) |
1857 | 1868 | { |
1858 | 1869 | for (u32 i = 0; i < bucket.num_achievements; i++) |
1859 | 1870 | DrawAchievement(bucket.achievements[i]); |
|
0 commit comments