1
0
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:
Dean Herbert
2025-05-30 14:37:54 +09:00
committed by GitHub
Unverified
4 changed files with 137 additions and 28 deletions
+1 -1
View File
@@ -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,