// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Shapes; using osu.Game.Graphics; using osu.Game.Graphics.Sprites; using osu.Game.Graphics.UserInterface; using osu.Game.Online.API.Requests.Responses; using osuTK; using System; using System.Collections.Generic; using osu.Framework.Graphics.UserInterface; using osu.Game.Online.API.Requests; using osu.Framework.Extensions.Color4Extensions; namespace osu.Game.Overlays.Rankings { public class SpotlightSelector : VisibilityContainer, IHasCurrentValue { private const int duration = 300; private readonly Box background; private readonly SpotlightsDropdown dropdown; private readonly BindableWithCurrent current = new BindableWithCurrent(); public Bindable Current { get => current.Current; set => current.Current = value; } public IEnumerable Spotlights { get => dropdown.Items; set => dropdown.Items = value; } protected override bool StartHidden => true; private readonly InfoColumn startDateColumn; private readonly InfoColumn endDateColumn; private readonly InfoColumn mapCountColumn; private readonly InfoColumn participantsColumn; private readonly Container content; public SpotlightSelector() { RelativeSizeAxes = Axes.X; Height = 155; Add(content = new Container { RelativeSizeAxes = Axes.Both, Children = new Drawable[] { background = new Box { RelativeSizeAxes = Axes.Both, }, new Container { RelativeSizeAxes = Axes.Both, Padding = new MarginPadding { Horizontal = UserProfileOverlay.CONTENT_X_MARGIN }, Children = new Drawable[] { dropdown = new SpotlightsDropdown { Anchor = Anchor.TopCentre, Origin = Anchor.TopCentre, RelativeSizeAxes = Axes.X, Current = Current, Depth = -float.MaxValue }, new FillFlowContainer { Anchor = Anchor.BottomRight, Origin = Anchor.BottomRight, AutoSizeAxes = Axes.Both, Direction = FillDirection.Horizontal, Spacing = new Vector2(15, 0), Children = new Drawable[] { startDateColumn = new InfoColumn(@"Start Date"), endDateColumn = new InfoColumn(@"End Date"), mapCountColumn = new InfoColumn(@"Map Count"), participantsColumn = new InfoColumn(@"Participants") } } } } } }); } [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { background.Colour = colourProvider.Dark3; } public void ShowInfo(GetSpotlightRankingsResponse response) { startDateColumn.Value = dateToString(response.Spotlight.StartDate); endDateColumn.Value = dateToString(response.Spotlight.EndDate); mapCountColumn.Value = response.BeatmapSets.Count.ToString(); participantsColumn.Value = response.Spotlight.Participants?.ToString("N0"); } protected override void PopIn() => content.FadeIn(duration, Easing.OutQuint); protected override void PopOut() => content.FadeOut(duration, Easing.OutQuint); private string dateToString(DateTimeOffset date) => date.ToString("yyyy-MM-dd"); private class InfoColumn : FillFlowContainer { public string Value { set => valueText.Text = value; } private readonly OsuSpriteText valueText; public InfoColumn(string name) { AutoSizeAxes = Axes.Both; Direction = FillDirection.Vertical; Padding = new MarginPadding { Vertical = 15 }; Children = new Drawable[] { new OsuSpriteText { Text = name, Font = OsuFont.GetFont(size: 10), }, new Container { AutoSizeAxes = Axes.X, Height = 25, Child = valueText = new OsuSpriteText { Anchor = Anchor.CentreLeft, Origin = Anchor.CentreLeft, Font = OsuFont.GetFont(size: 20, weight: FontWeight.Light), } } }; } [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { valueText.Colour = colourProvider.Content2; } } private class SpotlightsDropdown : OsuDropdown { private DropdownMenu menu; protected override DropdownMenu CreateMenu() => menu = base.CreateMenu().With(m => m.MaxHeight = 400); protected override DropdownHeader CreateHeader() => new SpotlightsDropdownHeader(); [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { // osu-web adds a 0.6 opacity container on top of the 0.5 base one when hovering, 0.8 on a single container here matches the resulting colour AccentColour = colourProvider.Background6.Opacity(0.8f); menu.BackgroundColour = colourProvider.Background5; Padding = new MarginPadding { Vertical = 20 }; } private class SpotlightsDropdownHeader : OsuDropdownHeader { public SpotlightsDropdownHeader() { AutoSizeAxes = Axes.Y; Text.Font = OsuFont.GetFont(size: 15); Text.Padding = new MarginPadding { Vertical = 1.5f }; // osu-web line-height difference compensation Foreground.Padding = new MarginPadding { Horizontal = 10, Vertical = 15 }; Margin = Icon.Margin = new MarginPadding(0); } [BackgroundDependencyLoader] private void load(OverlayColourProvider colourProvider) { BackgroundColour = colourProvider.Background6.Opacity(0.5f); BackgroundColourHover = colourProvider.Background5; } } } } }