// 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. #nullable disable using System; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Game.Beatmaps; namespace osu.Game.Screens.Select { public abstract partial class BeatmapDetailArea : Container { private const float details_padding = 10; private WorkingBeatmap beatmap; public virtual WorkingBeatmap Beatmap { get => beatmap; set { beatmap = value; Details.BeatmapInfo = value?.BeatmapInfo; } } public readonly BeatmapDetails Details; protected Bindable<BeatmapDetailAreaTabItem> CurrentTab => tabControl.Current; protected Bindable<bool> CurrentModsFilter => tabControl.CurrentModsFilter; private readonly Container content; protected override Container<Drawable> Content => content; private readonly BeatmapDetailAreaTabControl tabControl; protected BeatmapDetailArea() { AddRangeInternal(new Drawable[] { content = new Container { RelativeSizeAxes = Axes.Both, Padding = new MarginPadding { Top = BeatmapDetailAreaTabControl.HEIGHT }, Child = Details = new BeatmapDetails { RelativeSizeAxes = Axes.X, Alpha = 0, Margin = new MarginPadding { Top = details_padding }, } }, tabControl = new BeatmapDetailAreaTabControl { RelativeSizeAxes = Axes.X, TabItems = CreateTabItems(), OnFilter = OnTabChanged, }, }); } /// <summary> /// Refreshes the currently-displayed details. /// </summary> public virtual void Refresh() { } protected override void UpdateAfterChildren() { base.UpdateAfterChildren(); Details.Height = Math.Min(DrawHeight - details_padding * 3 - BeatmapDetailAreaTabControl.HEIGHT, 450); } /// <summary> /// Invoked when a new tab is selected. /// </summary> /// <param name="tab">The tab that was selected.</param> /// <param name="selectedMods">Whether the currently-selected mods should be considered.</param> protected virtual void OnTabChanged(BeatmapDetailAreaTabItem tab, bool selectedMods) { switch (tab) { case BeatmapDetailAreaDetailTabItem: Details.Show(); break; default: Details.Hide(); break; } } /// <summary> /// Creates the tabs to be displayed. /// </summary> /// <returns>The tabs.</returns> protected virtual BeatmapDetailAreaTabItem[] CreateTabItems() => new BeatmapDetailAreaTabItem[] { new BeatmapDetailAreaDetailTabItem(), }; } }