Improve state and feel of leaderboard placeholders

Closes #1721.
This commit is contained in:
Dean Herbert 2017-12-22 22:41:18 +09:00
parent 166d6b555b
commit 26bb3715fe

View File

@ -29,7 +29,7 @@ namespace osu.Game.Screens.Select.Leaderboards
{ {
public class Leaderboard : Container public class Leaderboard : Container
{ {
private const double fade_duration = 200; private const double fade_duration = 300;
private readonly ScrollContainer scrollContainer; private readonly ScrollContainer scrollContainer;
private readonly Container placeholderContainer; private readonly Container placeholderContainer;
@ -51,7 +51,7 @@ namespace osu.Game.Screens.Select.Leaderboards
{ {
scores = value; scores = value;
scrollFlow?.FadeOut(fade_duration).Expire(); scrollFlow?.FadeOut(fade_duration, Easing.OutQuint).Expire();
scrollFlow = null; scrollFlow = null;
loading.Hide(); loading.Hide();
@ -90,6 +90,7 @@ namespace osu.Game.Screens.Select.Leaderboards
} }
private LeaderboardScope scope; private LeaderboardScope scope;
public LeaderboardScope Scope public LeaderboardScope Scope
{ {
get { return scope; } get { return scope; }
@ -103,6 +104,7 @@ namespace osu.Game.Screens.Select.Leaderboards
} }
private PlaceholderState placeholderState; private PlaceholderState placeholderState;
protected PlaceholderState PlaceholderState protected PlaceholderState PlaceholderState
{ {
get { return placeholderState; } get { return placeholderState; }
@ -118,19 +120,18 @@ namespace osu.Game.Screens.Select.Leaderboards
OnRetry = updateScores, OnRetry = updateScores,
}); });
break; break;
case PlaceholderState.Unavailable:
replacePlaceholder(new MessagePlaceholder(@"Leaderboards are not available for this beatmap!"));
break;
case PlaceholderState.NoScores: case PlaceholderState.NoScores:
replacePlaceholder(new MessagePlaceholder(@"No records yet!")); replacePlaceholder(new MessagePlaceholder(@"No records yet!"));
break; break;
case PlaceholderState.NotLoggedIn: case PlaceholderState.NotLoggedIn:
replacePlaceholder(new MessagePlaceholder(@"Please login to view online leaderboards!")); replacePlaceholder(new MessagePlaceholder(@"Please login to view online leaderboards!"));
break; break;
case PlaceholderState.NotSupporter: case PlaceholderState.NotSupporter:
replacePlaceholder(new MessagePlaceholder(@"Please invest in a supporter tag to view this leaderboard!")); replacePlaceholder(new MessagePlaceholder(@"Please invest in a supporter tag to view this leaderboard!"));
break; break;
default: default:
replacePlaceholder(null); replacePlaceholder(null);
break; break;
@ -150,10 +151,7 @@ namespace osu.Game.Screens.Select.Leaderboards
loading = new LoadingAnimation(), loading = new LoadingAnimation(),
placeholderContainer = new Container placeholderContainer = new Container
{ {
Alpha = 0, RelativeSizeAxes = Axes.Both
AutoSizeAxes = Axes.Both,
Anchor = Anchor.Centre,
Origin = Anchor.Centre,
}, },
}; };
} }
@ -229,15 +227,15 @@ namespace osu.Game.Screens.Select.Leaderboards
return; return;
} }
if (api?.IsLoggedIn != true) if (Beatmap?.OnlineBeatmapID == null)
{ {
PlaceholderState = PlaceholderState.NotLoggedIn; PlaceholderState = PlaceholderState.Unavailable;
return; return;
} }
if (Beatmap?.OnlineBeatmapID == null) if (api?.IsLoggedIn != true)
{ {
PlaceholderState = PlaceholderState.NetworkFailure; PlaceholderState = PlaceholderState.NotLoggedIn;
return; return;
} }
@ -272,23 +270,22 @@ namespace osu.Game.Screens.Select.Leaderboards
private void replacePlaceholder(Placeholder placeholder) private void replacePlaceholder(Placeholder placeholder)
{ {
if (placeholder == null) var existingPlaceholder = placeholderContainer.Children.LastOrDefault() as Placeholder;
{
placeholderContainer.FadeOutFromOne(fade_duration, Easing.OutQuint); if (placeholder != null && placeholder.Equals(existingPlaceholder))
placeholderContainer.Clear(true);
return; return;
}
var existingPlaceholder = placeholderContainer.Children.FirstOrDefault() as Placeholder; existingPlaceholder?.FadeOut(150, Easing.OutQuint).Expire();
if (placeholder.Equals(existingPlaceholder)) if (placeholder == null)
return; return;
Scores = null; Scores = null;
placeholderContainer.Clear(true); placeholderContainer.Add(placeholder);
placeholderContainer.Child = placeholder;
placeholderContainer.FadeInFromZero(fade_duration, Easing.OutQuint); placeholder.ScaleTo(0.8f).Then().ScaleTo(1, fade_duration * 3, Easing.OutQuint);
placeholder.FadeInFromZero(fade_duration, Easing.OutQuint);
} }
protected override void Update() protected override void Update()
@ -322,6 +319,12 @@ namespace osu.Game.Screens.Select.Leaderboards
private abstract class Placeholder : FillFlowContainer, IEquatable<Placeholder> private abstract class Placeholder : FillFlowContainer, IEquatable<Placeholder>
{ {
protected Placeholder()
{
Anchor = Anchor.Centre;
Origin = Anchor.Centre;
}
public virtual bool Equals(Placeholder other) => GetType() == other?.GetType(); public virtual bool Equals(Placeholder other) => GetType() == other?.GetType();
} }
@ -429,6 +432,7 @@ namespace osu.Game.Screens.Select.Leaderboards
Successful, Successful,
Retrieving, Retrieving,
NetworkFailure, NetworkFailure,
Unavailable,
NoScores, NoScores,
NotLoggedIn, NotLoggedIn,
NotSupporter, NotSupporter,