mirror of
https://github.com/ppy/osu.git
synced 2025-03-19 01:17:19 +08:00
Make Header and it's components updateable.
This commit is contained in:
parent
63c50f82eb
commit
d83cd3ecf9
@ -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
|
||||
|
@ -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 },
|
||||
},
|
||||
|
@ -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<BeatmapInfo> Beatmap = new Bindable<BeatmapInfo>();
|
||||
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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,
|
||||
|
@ -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,
|
||||
|
@ -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
|
||||
|
@ -1,7 +1,6 @@
|
||||
// Copyright (c) 2007-2017 ppy Pty Ltd <contact@ppy.sh>.
|
||||
// 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();
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user