mirror of
https://github.com/ppy/osu.git
synced 2026-05-27 11:29:56 +08:00
Merge pull request #33322 from bdach/song-select-v2-detail-tab-state
SongSelectV2: Read/write last active tab in details area from/to local configuration
This commit is contained in:
@@ -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);
|
||||
|
||||
@@ -0,0 +1,38 @@
|
||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. 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
|
||||
{
|
||||
/// <summary>
|
||||
/// Beatmap details.
|
||||
/// </summary>
|
||||
Details,
|
||||
|
||||
/// <summary>
|
||||
/// Local leaderboards.
|
||||
/// </summary>
|
||||
Local,
|
||||
|
||||
/// <summary>
|
||||
/// Country leaderboards.
|
||||
/// </summary>
|
||||
Country,
|
||||
|
||||
/// <summary>
|
||||
/// Global leaderboards.
|
||||
/// </summary>
|
||||
Global,
|
||||
|
||||
/// <summary>
|
||||
/// Friend leaderboards.
|
||||
/// </summary>
|
||||
Friends,
|
||||
|
||||
/// <summary>
|
||||
/// Team leaderboards.
|
||||
/// </summary>
|
||||
Team
|
||||
}
|
||||
}
|
||||
@@ -29,7 +29,7 @@ namespace osu.Game.Screens.Select
|
||||
}
|
||||
}
|
||||
|
||||
private Bindable<TabType> selectedTab;
|
||||
private Bindable<BeatmapDetailTab> selectedTab;
|
||||
|
||||
private Bindable<bool> selectedModsFilter;
|
||||
|
||||
@@ -41,7 +41,7 @@ namespace osu.Game.Screens.Select
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(OsuConfigManager config)
|
||||
{
|
||||
selectedTab = config.GetBindable<TabType>(OsuSetting.BeatmapDetailTab);
|
||||
selectedTab = config.GetBindable<BeatmapDetailTab>(OsuSetting.BeatmapDetailTab);
|
||||
selectedModsFilter = config.GetBindable<bool>(OsuSetting.BeatmapDetailModsFilter);
|
||||
|
||||
selectedTab.BindValueChanged(tab => CurrentTab.Value = getTabItemFromTabType(tab.NewValue), true);
|
||||
@@ -86,26 +86,26 @@ namespace osu.Game.Screens.Select
|
||||
new BeatmapDetailAreaLeaderboardTabItem<BeatmapLeaderboardScope>(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>(BeatmapLeaderboardScope.Local);
|
||||
|
||||
case TabType.Global:
|
||||
case BeatmapDetailTab.Global:
|
||||
return new BeatmapDetailAreaLeaderboardTabItem<BeatmapLeaderboardScope>(BeatmapLeaderboardScope.Global);
|
||||
|
||||
case TabType.Country:
|
||||
case BeatmapDetailTab.Country:
|
||||
return new BeatmapDetailAreaLeaderboardTabItem<BeatmapLeaderboardScope>(BeatmapLeaderboardScope.Country);
|
||||
|
||||
case TabType.Friends:
|
||||
case BeatmapDetailTab.Friends:
|
||||
return new BeatmapDetailAreaLeaderboardTabItem<BeatmapLeaderboardScope>(BeatmapLeaderboardScope.Friend);
|
||||
|
||||
case TabType.Team:
|
||||
case BeatmapDetailTab.Team:
|
||||
return new BeatmapDetailAreaLeaderboardTabItem<BeatmapLeaderboardScope>(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<BeatmapLeaderboardScope> 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
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<BeatmapLeaderboardScope> Scope => scopeDropdown.Current;
|
||||
|
||||
private readonly Bindable<BeatmapDetailTab> configDetailTab = new Bindable<BeatmapDetailTab>();
|
||||
|
||||
public IBindable<bool> 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,
|
||||
|
||||
Reference in New Issue
Block a user