From d83cd3ecf9eeadbf6e673c74294ff2ade10be342 Mon Sep 17 00:00:00 2001 From: DrabWeb Date: Wed, 13 Sep 2017 18:25:23 -0300 Subject: [PATCH] Make Header and it's components updateable. --- .../Overlays/OnlineBeatmapSet/AuthorInfo.cs | 58 ++++++++++------ .../Overlays/OnlineBeatmapSet/BasicStats.cs | 23 +++++-- .../OnlineBeatmapSet/BeatmapPicker.cs | 59 +++++++++------- osu.Game/Overlays/OnlineBeatmapSet/Details.cs | 24 +++++-- osu.Game/Overlays/OnlineBeatmapSet/Header.cs | 68 +++++++++++++------ .../OnlineBeatmapSet/PreviewButton.cs | 27 ++++++-- osu.Game/Overlays/OnlineBeatmapSetOverlay.cs | 8 +-- 7 files changed, 176 insertions(+), 91 deletions(-) diff --git a/osu.Game/Overlays/OnlineBeatmapSet/AuthorInfo.cs b/osu.Game/Overlays/OnlineBeatmapSet/AuthorInfo.cs index 90d97f75c7..ce46e96380 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/AuthorInfo.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/AuthorInfo.cs @@ -16,20 +16,53 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { private const float height = 50; - public AuthorInfo(BeatmapSetOnlineInfo info) + private readonly UpdateableAvatar avatar; + private readonly FillFlowContainer fields; + + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + var i = BeatmapSet.OnlineInfo; + + avatar.User = i.Author; + fields.Children = new Drawable[] + { + new Field("made by", i.Author.Username, @"Exo2.0-RegularItalic"), + new Field("submitted on", i.Submitted.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold") + { + Margin = new MarginPadding { Top = 5 }, + }, + }; + + if (i.Ranked.HasValue) + { + fields.Add(new Field("ranked on ", i.Ranked.Value.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold")); + } + else if (i.LastUpdated.HasValue) + { + fields.Add(new Field("last updated on ", i.LastUpdated.Value.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold")); + } + } + } + + public AuthorInfo() { RelativeSizeAxes = Axes.X; Height = height; - FillFlowContainer fields; Children = new Drawable[] { - new UpdateableAvatar + avatar = new UpdateableAvatar { Size = new Vector2(height), CornerRadius = 3, Masking = true, - User = info.Author, EdgeEffect = new EdgeEffectParameters { Colour = Color4.Black.Opacity(0.25f), @@ -43,25 +76,8 @@ namespace osu.Game.Overlays.OnlineBeatmapSet RelativeSizeAxes = Axes.Both, Direction = FillDirection.Vertical, Padding = new MarginPadding { Left = height + 5 }, - Children = new Drawable[] - { - new Field("made by", info.Author.Username, @"Exo2.0-RegularItalic"), - new Field("submitted on", info.Submitted.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold") - { - Margin = new MarginPadding { Top = 5 }, - }, - }, }, }; - - if (info.Ranked.HasValue) - { - fields.Add(new Field("ranked on ", info.Ranked.Value.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold")); - } - else if (info.LastUpdated.HasValue) - { - fields.Add(new Field("last updated on ", info.LastUpdated.Value.ToString(@"MMM d, yyyy"), @"Exo2.0-Bold")); - } } private class Field : FillFlowContainer diff --git a/osu.Game/Overlays/OnlineBeatmapSet/BasicStats.cs b/osu.Game/Overlays/OnlineBeatmapSet/BasicStats.cs index 7772f34466..947bc111e0 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/BasicStats.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/BasicStats.cs @@ -15,7 +15,20 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { public class BasicStats : Container { - private readonly Statistic length, circleCount, sliderCount; + private readonly Statistic length, bpm, circleCount, sliderCount; + + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + bpm.Value = BeatmapSet.OnlineInfo.BPM.ToString(@"0.##"); + } + } private BeatmapInfo beatmap; public BeatmapInfo Beatmap @@ -32,7 +45,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet } } - public BasicStats(BeatmapSetInfo set) + public BasicStats() { Child = new FillFlowContainer { @@ -42,11 +55,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet Children = new[] { length = new Statistic(FontAwesome.fa_clock_o, "Length") { Width = 0.25f }, - new Statistic(FontAwesome.fa_circle, "BPM") - { - Width = 0.25f, - Value = set.OnlineInfo.BPM.ToString(@"0.##"), - }, + bpm = new Statistic(FontAwesome.fa_circle, "BPM") { Width = 0.25f }, circleCount = new Statistic(FontAwesome.fa_circle_o, "Circle Count") { Width = 0.25f }, sliderCount = new Statistic(FontAwesome.fa_circle, "Slider Count") { Width = 0.25f }, }, diff --git a/osu.Game/Overlays/OnlineBeatmapSet/BeatmapPicker.cs b/osu.Game/Overlays/OnlineBeatmapSet/BeatmapPicker.cs index bea6f98382..d7b9fa49bd 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/BeatmapPicker.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/BeatmapPicker.cs @@ -28,10 +28,42 @@ namespace osu.Game.Overlays.OnlineBeatmapSet private readonly DifficultiesContainer difficulties; private readonly OsuSpriteText version, starRating; + private readonly Statistic plays, favourites; public readonly Bindable Beatmap = new Bindable(); - public BeatmapPicker(BeatmapSetInfo set) + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + Beatmap.Value = BeatmapSet.Beatmaps.First(); + plays.Value = BeatmapSet.OnlineInfo.PlayCount; + favourites.Value = BeatmapSet.OnlineInfo.FavouriteCount; + difficulties.ChildrenEnumerable = BeatmapSet.Beatmaps.Select(b => new DifficultySelectorButton(b) + { + State = DifficultySelectorState.NotSelected, + OnHovered = beatmap => + { + showBeatmap(beatmap); + starRating.Text = beatmap.StarDifficulty.ToString("Star Difficulty 0.##"); + starRating.FadeIn(100); + }, + OnClicked = beatmap => + { + Beatmap.Value = beatmap; + }, + }); + + updateDifficultyButtons(); + } + } + + public BeatmapPicker() { RelativeSizeAxes = Axes.X; AutoSizeAxes = Axes.Y; @@ -89,36 +121,19 @@ namespace osu.Game.Overlays.OnlineBeatmapSet Margin = new MarginPadding { Top = 5 }, Children = new[] { - new Statistic(FontAwesome.fa_play_circle, set.OnlineInfo.PlayCount), - new Statistic(FontAwesome.fa_heart, set.OnlineInfo.FavouriteCount), + plays = new Statistic(FontAwesome.fa_play_circle), + favourites = new Statistic(FontAwesome.fa_heart), }, }, }, }, }; - Beatmap.Value = set.Beatmaps.First(); - Beatmap.ValueChanged += b => { showBeatmap(b); updateDifficultyButtons(); }; - - difficulties.ChildrenEnumerable = set.Beatmaps.Select(b => new DifficultySelectorButton(b) - { - State = DifficultySelectorState.NotSelected, - OnHovered = beatmap => - { - showBeatmap(beatmap); - starRating.Text = beatmap.StarDifficulty.ToString("Star Difficulty 0.##"); - starRating.FadeIn(100); - }, - OnClicked = beatmap => - { - Beatmap.Value = beatmap; - }, - }); } [BackgroundDependencyLoader] @@ -261,7 +276,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet } } - public Statistic(FontAwesome icon, int value = 0) + public Statistic(FontAwesome icon) { AutoSizeAxes = Axes.Both; Direction = FillDirection.Horizontal; @@ -285,8 +300,6 @@ namespace osu.Game.Overlays.OnlineBeatmapSet TextSize = 14, }, }; - - Value = value; } } diff --git a/osu.Game/Overlays/OnlineBeatmapSet/Details.cs b/osu.Game/Overlays/OnlineBeatmapSet/Details.cs index 05ae8f64a8..e507ba8e5c 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/Details.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/Details.cs @@ -14,10 +14,24 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { public class Details : FillFlowContainer { + private readonly PreviewButton preview; private readonly BasicStats basic; private readonly AdvancedStats advanced; private readonly UserRatings ratings; + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + basic.BeatmapSet = preview.BeatmapSet = BeatmapSet; + } + } + private BeatmapInfo beatmap; public BeatmapInfo Beatmap { @@ -32,7 +46,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet } } - public Details(BeatmapSetInfo set) + public Details() { Width = OnlineBeatmapSetOverlay.RIGHT_WIDTH; AutoSizeAxes = Axes.Y; @@ -40,17 +54,13 @@ namespace osu.Game.Overlays.OnlineBeatmapSet Children = new Drawable[] { - new AsyncLoadWrapper(new PreviewButton(set) + preview = new PreviewButton { RelativeSizeAxes = Axes.X, - }) - { - RelativeSizeAxes = Axes.X, - AutoSizeAxes = Axes.Y, }, new DetailBox { - Child = basic = new BasicStats(set) + Child = basic = new BasicStats() { RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, diff --git a/osu.Game/Overlays/OnlineBeatmapSet/Header.cs b/osu.Game/Overlays/OnlineBeatmapSet/Header.cs index 0525b32b36..0561bac702 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/Header.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/Header.cs @@ -24,10 +24,50 @@ namespace osu.Game.Overlays.OnlineBeatmapSet private const float buttons_spacing = 5; private readonly Box tabsBg; + private readonly Container coverContainer; + private readonly OsuSpriteText title, artist; + private readonly AuthorInfo author; + private readonly Details details; + + private DelayedLoadWrapper cover; public readonly BeatmapPicker Picker; - public Header(BeatmapSetInfo set) + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + Picker.BeatmapSet = author.BeatmapSet = details.BeatmapSet = BeatmapSet; + title.Text = BeatmapSet.Metadata.Title; + artist.Text = BeatmapSet.Metadata.Artist; + + if (cover != null) + cover.FadeOut(400, Easing.Out); + + coverContainer.Add(cover = new DelayedLoadWrapper(new BeatmapSetCover(BeatmapSet) + { + Anchor = Anchor.Centre, + Origin = Anchor.Centre, + RelativeSizeAxes = Axes.Both, + FillMode = FillMode.Fill, + OnLoadComplete = d => + { + d.FadeInFromZero(400, Easing.Out); + }, + }) + { + RelativeSizeAxes = Axes.Both, + TimeBeforeLoad = 300 + }); + } + } + + public Header() { RelativeSizeAxes = Axes.X; Height = 400; @@ -42,7 +82,6 @@ namespace osu.Game.Overlays.OnlineBeatmapSet Container noVideoButtons; FillFlowContainer videoButtons; - Details details; Children = new Drawable[] { new Container @@ -73,20 +112,9 @@ namespace osu.Game.Overlays.OnlineBeatmapSet RelativeSizeAxes = Axes.Both, Colour = Color4.Black, }, - new DelayedLoadWrapper(new BeatmapSetCover(set) - { - Anchor = Anchor.Centre, - Origin = Anchor.Centre, - RelativeSizeAxes = Axes.Both, - FillMode = FillMode.Fill, - OnLoadComplete = d => - { - d.FadeInFromZero(400, Easing.Out); - }, - }) + coverContainer = new Container { RelativeSizeAxes = Axes.Both, - TimeBeforeLoad = 300 }, new Box { @@ -109,17 +137,15 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { RelativeSizeAxes = Axes.X, Height = 113, - Child = Picker = new BeatmapPicker(set), + Child = Picker = new BeatmapPicker(), }, - new OsuSpriteText + title = new OsuSpriteText { - Text = set.Metadata.Title, Font = @"Exo2.0-BoldItalic", TextSize = 37, }, - new OsuSpriteText + artist = new OsuSpriteText { - Text = set.Metadata.Artist, Font = @"Exo2.0-SemiBoldItalic", TextSize = 25, }, @@ -128,7 +154,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet RelativeSizeAxes = Axes.X, AutoSizeAxes = Axes.Y, Margin = new MarginPadding { Top = 20 }, - Child = new AuthorInfo(set.OnlineInfo), + Child = author = new AuthorInfo(), }, new Container { @@ -168,7 +194,7 @@ namespace osu.Game.Overlays.OnlineBeatmapSet }, }, }, - details = new Details(set) + details = new Details { Anchor = Anchor.BottomRight, Origin = Anchor.BottomRight, diff --git a/osu.Game/Overlays/OnlineBeatmapSet/PreviewButton.cs b/osu.Game/Overlays/OnlineBeatmapSet/PreviewButton.cs index 6fd131c720..e3fa7ccb17 100644 --- a/osu.Game/Overlays/OnlineBeatmapSet/PreviewButton.cs +++ b/osu.Game/Overlays/OnlineBeatmapSet/PreviewButton.cs @@ -19,13 +19,27 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { public class PreviewButton : OsuClickableContainer { - private readonly BeatmapSetInfo set; private readonly Box bg, progress; private readonly SpriteIcon icon; private AudioManager audio; private Track preview; + private BeatmapSetInfo beatmapSet; + public BeatmapSetInfo BeatmapSet + { + get { return beatmapSet; } + set + { + if (value == beatmapSet) return; + beatmapSet = value; + + Playing = false; + preview = null; + loadPreview(); + } + } + private bool playing; public bool Playing { @@ -35,6 +49,8 @@ namespace osu.Game.Overlays.OnlineBeatmapSet if (value == playing) return; playing = value; + if (progress == null) return; + if (Playing) { icon.Icon = FontAwesome.fa_stop; @@ -52,9 +68,8 @@ namespace osu.Game.Overlays.OnlineBeatmapSet } } - public PreviewButton(BeatmapSetInfo set) + public PreviewButton() { - this.set = set; Height = 42; Children = new Drawable[] @@ -95,8 +110,6 @@ namespace osu.Game.Overlays.OnlineBeatmapSet { this.audio = audio; progress.Colour = colours.Yellow; - - loadPreview(); } protected override void Update() @@ -130,9 +143,9 @@ namespace osu.Game.Overlays.OnlineBeatmapSet private void loadPreview() { - if (preview?.HasCompleted ?? true) + if (preview == null || (preview?.HasCompleted ?? true) && BeatmapSet != null) { - preview = audio.Track.Get(set.OnlineInfo.Preview); + preview = audio.Track.Get(BeatmapSet.OnlineInfo.Preview); preview.Volume.Value = 0.5; } else diff --git a/osu.Game/Overlays/OnlineBeatmapSetOverlay.cs b/osu.Game/Overlays/OnlineBeatmapSetOverlay.cs index 9dea34e06b..8db211e352 100644 --- a/osu.Game/Overlays/OnlineBeatmapSetOverlay.cs +++ b/osu.Game/Overlays/OnlineBeatmapSetOverlay.cs @@ -1,7 +1,6 @@ // Copyright (c) 2007-2017 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE -using System.Linq; using OpenTK; using OpenTK.Graphics; using osu.Framework.Extensions.Color4Extensions; @@ -62,14 +61,14 @@ namespace osu.Game.Overlays Direction = FillDirection.Vertical, Children = new Drawable[] { - // header = new Header(), + header = new Header(), info = new Info(), }, }, }, }; - // header.Picker.Beatmap.ValueChanged += b => info.Beatmap = b; + header.Picker.Beatmap.ValueChanged += b => info.Beatmap = b; } protected override void PopIn() @@ -86,8 +85,7 @@ namespace osu.Game.Overlays public void ShowBeatmapSet(BeatmapSetInfo set) { - /*header.BeatmapSet = */info.BeatmapSet = set; - info.Beatmap = set.Beatmaps.Last(); + header.BeatmapSet = info.BeatmapSet = set; Show(); }