diff --git a/osu.Game/Configuration/OsuConfigManager.cs b/osu.Game/Configuration/OsuConfigManager.cs index 8f6fc214e1..c815b2f9a9 100644 --- a/osu.Game/Configuration/OsuConfigManager.cs +++ b/osu.Game/Configuration/OsuConfigManager.cs @@ -40,7 +40,7 @@ namespace osu.Game.Configuration SetDefault(OsuSetting.Ruleset, string.Empty); SetDefault(OsuSetting.Skin, SkinInfo.ARGON_SKIN.ToString()); - SetDefault(OsuSetting.BeatmapDetailTab, PlayBeatmapDetailArea.TabType.Local); + SetDefault(OsuSetting.BeatmapDetailTab, BeatmapDetailTab.Local); SetDefault(OsuSetting.BeatmapDetailModsFilter, false); SetDefault(OsuSetting.ShowConvertedBeatmaps, true); diff --git a/osu.Game/Screens/Select/BeatmapDetailTab.cs b/osu.Game/Screens/Select/BeatmapDetailTab.cs new file mode 100644 index 0000000000..cd219a4830 --- /dev/null +++ b/osu.Game/Screens/Select/BeatmapDetailTab.cs @@ -0,0 +1,38 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +namespace osu.Game.Screens.Select +{ + public enum BeatmapDetailTab + { + /// + /// Beatmap details. + /// + Details, + + /// + /// Local leaderboards. + /// + Local, + + /// + /// Country leaderboards. + /// + Country, + + /// + /// Global leaderboards. + /// + Global, + + /// + /// Friend leaderboards. + /// + Friends, + + /// + /// Team leaderboards. + /// + Team + } +} diff --git a/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs b/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs index 5b62d5e8d7..ae318de754 100644 --- a/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs +++ b/osu.Game/Screens/Select/PlayBeatmapDetailArea.cs @@ -29,7 +29,7 @@ namespace osu.Game.Screens.Select } } - private Bindable selectedTab; + private Bindable selectedTab; private Bindable selectedModsFilter; @@ -41,7 +41,7 @@ namespace osu.Game.Screens.Select [BackgroundDependencyLoader] private void load(OsuConfigManager config) { - selectedTab = config.GetBindable(OsuSetting.BeatmapDetailTab); + selectedTab = config.GetBindable(OsuSetting.BeatmapDetailTab); selectedModsFilter = config.GetBindable(OsuSetting.BeatmapDetailModsFilter); selectedTab.BindValueChanged(tab => CurrentTab.Value = getTabItemFromTabType(tab.NewValue), true); @@ -86,26 +86,26 @@ namespace osu.Game.Screens.Select new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Team), }).ToArray(); - private BeatmapDetailAreaTabItem getTabItemFromTabType(TabType type) + private BeatmapDetailAreaTabItem getTabItemFromTabType(BeatmapDetailTab type) { switch (type) { - case TabType.Details: + case BeatmapDetailTab.Details: return new BeatmapDetailAreaDetailTabItem(); - case TabType.Local: + case BeatmapDetailTab.Local: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Local); - case TabType.Global: + case BeatmapDetailTab.Global: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Global); - case TabType.Country: + case BeatmapDetailTab.Country: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Country); - case TabType.Friends: + case BeatmapDetailTab.Friends: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Friend); - case TabType.Team: + case BeatmapDetailTab.Team: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Team); default: @@ -113,30 +113,30 @@ namespace osu.Game.Screens.Select } } - private TabType getTabTypeFromTabItem(BeatmapDetailAreaTabItem item) + private BeatmapDetailTab getTabTypeFromTabItem(BeatmapDetailAreaTabItem item) { switch (item) { case BeatmapDetailAreaDetailTabItem: - return TabType.Details; + return BeatmapDetailTab.Details; case BeatmapDetailAreaLeaderboardTabItem leaderboardTab: switch (leaderboardTab.Scope) { case BeatmapLeaderboardScope.Local: - return TabType.Local; + return BeatmapDetailTab.Local; case BeatmapLeaderboardScope.Country: - return TabType.Country; + return BeatmapDetailTab.Country; case BeatmapLeaderboardScope.Global: - return TabType.Global; + return BeatmapDetailTab.Global; case BeatmapLeaderboardScope.Friend: - return TabType.Friends; + return BeatmapDetailTab.Friends; case BeatmapLeaderboardScope.Team: - return TabType.Team; + return BeatmapDetailTab.Team; default: throw new ArgumentOutOfRangeException(nameof(item)); @@ -146,15 +146,5 @@ namespace osu.Game.Screens.Select throw new ArgumentOutOfRangeException(nameof(item)); } } - - public enum TabType - { - Details, - Local, - Country, - Global, - Friends, - Team - } } } diff --git a/osu.Game/Screens/SelectV2/BeatmapDetailsArea_Header.cs b/osu.Game/Screens/SelectV2/BeatmapDetailsArea_Header.cs index ee93001b86..76734e110f 100644 --- a/osu.Game/Screens/SelectV2/BeatmapDetailsArea_Header.cs +++ b/osu.Game/Screens/SelectV2/BeatmapDetailsArea_Header.cs @@ -7,8 +7,10 @@ using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Localisation; +using osu.Game.Configuration; using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterfaceV2; +using osu.Game.Screens.Select; using osu.Game.Screens.Select.Leaderboards; using osuTK; @@ -28,10 +30,12 @@ namespace osu.Game.Screens.SelectV2 public IBindable Scope => scopeDropdown.Current; + private readonly Bindable configDetailTab = new Bindable(); + public IBindable FilterBySelectedMods => selectedModsToggle.Active; [BackgroundDependencyLoader] - private void load() + private void load(OsuConfigManager config) { InternalChildren = new Drawable[] { @@ -98,18 +102,95 @@ namespace osu.Game.Screens.SelectV2 }, }, }; + + config.BindWith(OsuSetting.BeatmapDetailTab, configDetailTab); + config.BindWith(OsuSetting.BeatmapDetailModsFilter, selectedModsToggle.Active); } protected override void LoadComplete() { base.LoadComplete(); + scopeDropdown.Current.Value = tryMapDetailTabToLeaderboardScope(configDetailTab.Value) ?? scopeDropdown.Current.Value; + scopeDropdown.Current.BindValueChanged(_ => updateConfigDetailTab()); + + tabControl.Current.Value = configDetailTab.Value == BeatmapDetailTab.Details ? Selection.Details : Selection.Ranking; tabControl.Current.BindValueChanged(v => { leaderboardControls.FadeTo(v.NewValue == Selection.Ranking ? 1 : 0, 300, Easing.OutQuint); + updateConfigDetailTab(); }, true); } + #region Reading / writing state from / to configuration + + private void updateConfigDetailTab() + { + switch (tabControl.Current.Value) + { + case Selection.Details: + configDetailTab.Value = BeatmapDetailTab.Details; + return; + + case Selection.Ranking: + configDetailTab.Value = mapLeaderboardScopeToDetailTab(scopeDropdown.Current.Value); + return; + + default: + throw new ArgumentOutOfRangeException(nameof(tabControl.Current.Value), tabControl.Current.Value, null); + } + } + + private static BeatmapLeaderboardScope? tryMapDetailTabToLeaderboardScope(BeatmapDetailTab tab) + { + switch (tab) + { + case BeatmapDetailTab.Local: + return BeatmapLeaderboardScope.Local; + + case BeatmapDetailTab.Country: + return BeatmapLeaderboardScope.Country; + + case BeatmapDetailTab.Global: + return BeatmapLeaderboardScope.Global; + + case BeatmapDetailTab.Friends: + return BeatmapLeaderboardScope.Friend; + + case BeatmapDetailTab.Team: + return BeatmapLeaderboardScope.Team; + + default: + return null; + } + } + + private static BeatmapDetailTab mapLeaderboardScopeToDetailTab(BeatmapLeaderboardScope scope) + { + switch (scope) + { + case BeatmapLeaderboardScope.Local: + return BeatmapDetailTab.Local; + + case BeatmapLeaderboardScope.Country: + return BeatmapDetailTab.Country; + + case BeatmapLeaderboardScope.Global: + return BeatmapDetailTab.Global; + + case BeatmapLeaderboardScope.Friend: + return BeatmapDetailTab.Friends; + + case BeatmapLeaderboardScope.Team: + return BeatmapDetailTab.Team; + + default: + throw new ArgumentOutOfRangeException(nameof(scope), scope, null); + } + } + + #endregion + public enum Selection { Details,