// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. #nullable disable using System; using System.Linq; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Game.Beatmaps; using osu.Game.Configuration; using osu.Game.Screens.Select.Leaderboards; namespace osu.Game.Screens.Select { public partial class PlayBeatmapDetailArea : BeatmapDetailArea { public readonly BeatmapLeaderboard Leaderboard; public override WorkingBeatmap Beatmap { get => base.Beatmap; set { base.Beatmap = value; Leaderboard.BeatmapInfo = value is DummyWorkingBeatmap ? null : value?.BeatmapInfo; } } private Bindable selectedTab; private Bindable selectedModsFilter; public PlayBeatmapDetailArea() { Add(Leaderboard = new BeatmapLeaderboard { RelativeSizeAxes = Axes.Both }); } [BackgroundDependencyLoader] private void load(OsuConfigManager config) { selectedTab = config.GetBindable(OsuSetting.BeatmapDetailTab); selectedModsFilter = config.GetBindable(OsuSetting.BeatmapDetailModsFilter); selectedTab.BindValueChanged(tab => CurrentTab.Value = getTabItemFromTabType(tab.NewValue), true); CurrentTab.BindValueChanged(tab => selectedTab.Value = getTabTypeFromTabItem(tab.NewValue)); selectedModsFilter.BindValueChanged(checkbox => CurrentModsFilter.Value = checkbox.NewValue, true); CurrentModsFilter.BindValueChanged(checkbox => selectedModsFilter.Value = checkbox.NewValue); } public override void Refresh() { base.Refresh(); Leaderboard.RefetchScores(); } protected override void OnTabChanged(BeatmapDetailAreaTabItem tab, bool selectedMods) { base.OnTabChanged(tab, selectedMods); Leaderboard.FilterMods = selectedMods; switch (tab) { case BeatmapDetailAreaLeaderboardTabItem leaderboard: Leaderboard.Scope = leaderboard.Scope; Leaderboard.Show(); break; default: Leaderboard.Hide(); break; } } protected override BeatmapDetailAreaTabItem[] CreateTabItems() => base.CreateTabItems().Concat(new BeatmapDetailAreaTabItem[] { new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Local), new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Global), new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Country), new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Friend), }).ToArray(); private BeatmapDetailAreaTabItem getTabItemFromTabType(TabType type) { switch (type) { case TabType.Details: return new BeatmapDetailAreaDetailTabItem(); case TabType.Local: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Local); case TabType.Global: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Global); case TabType.Country: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Country); case TabType.Friends: return new BeatmapDetailAreaLeaderboardTabItem(BeatmapLeaderboardScope.Friend); default: throw new ArgumentOutOfRangeException(nameof(type)); } } private TabType getTabTypeFromTabItem(BeatmapDetailAreaTabItem item) { switch (item) { case BeatmapDetailAreaDetailTabItem: return TabType.Details; case BeatmapDetailAreaLeaderboardTabItem leaderboardTab: switch (leaderboardTab.Scope) { case BeatmapLeaderboardScope.Local: return TabType.Local; case BeatmapLeaderboardScope.Country: return TabType.Country; case BeatmapLeaderboardScope.Global: return TabType.Global; case BeatmapLeaderboardScope.Friend: return TabType.Friends; default: throw new ArgumentOutOfRangeException(nameof(item)); } default: throw new ArgumentOutOfRangeException(nameof(item)); } } public enum TabType { Details, Local, Country, Global, Friends } } }