mirror of https://github.com/ppy/osu
Implement DrawableErrorHandler component
This commit is contained in:
parent
0c78c8cb4f
commit
237be50e37
|
@ -2,12 +2,15 @@
|
|||
// See the LICENCE file in the repository root for full licence text.
|
||||
|
||||
using System.Linq;
|
||||
using System.Threading;
|
||||
using osu.Framework.Allocation;
|
||||
using osu.Framework.Extensions.Color4Extensions;
|
||||
using osu.Framework.Graphics;
|
||||
using osu.Framework.Graphics.Containers;
|
||||
using osu.Framework.Graphics.Effects;
|
||||
using osu.Framework.Graphics.Shapes;
|
||||
using osu.Framework.Graphics.Sprites;
|
||||
using osu.Framework.Graphics.Textures;
|
||||
using osu.Framework.Threading;
|
||||
using osu.Game.Audio;
|
||||
using osu.Game.Beatmaps;
|
||||
|
@ -31,6 +34,8 @@ public class BeatmapListingOverlay : FullscreenOverlay
|
|||
private RulesetStore rulesets { get; set; }
|
||||
|
||||
private SearchBeatmapSetsRequest getSetsRequest;
|
||||
private CancellationTokenSource cancellationToken;
|
||||
|
||||
private Container panelsPlaceholder;
|
||||
private BeatmapListingSearchSection searchSection;
|
||||
private BeatmapListingSortTabControl sortControl;
|
||||
|
@ -121,7 +126,7 @@ private void load()
|
|||
{
|
||||
AutoSizeAxes = Axes.Y,
|
||||
RelativeSizeAxes = Axes.X,
|
||||
Padding = new MarginPadding { Vertical = 15, Horizontal = 20 },
|
||||
Padding = new MarginPadding { Horizontal = 20 },
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -167,6 +172,7 @@ private void updateSearch()
|
|||
return;
|
||||
|
||||
getSetsRequest?.Cancel();
|
||||
cancellationToken?.Cancel();
|
||||
previewTrackManager.StopAnyPlaying(this);
|
||||
|
||||
panelsPlaceholder.FadeColour(Color4.DimGray, 400, Easing.OutQuint);
|
||||
|
@ -185,30 +191,28 @@ private void updateSearch()
|
|||
|
||||
private void recreatePanels(SearchBeatmapSetsResponse response)
|
||||
{
|
||||
var beatmaps = response.BeatmapSets.Select(r => r.ToBeatmapSet(rulesets)).ToList();
|
||||
|
||||
var hasError = !string.IsNullOrEmpty(response.Error);
|
||||
|
||||
if (response.Total == 0 || hasError)
|
||||
{
|
||||
searchSection.BeatmapSet = null;
|
||||
panelsPlaceholder.Clear();
|
||||
panelsPlaceholder.FadeColour(Color4.White);
|
||||
panelsPlaceholder.Add(new OsuSpriteText
|
||||
|
||||
LoadComponentAsync(new DrawableErrorHandler(hasError ? response.Error : @"... nope, nothing found."), loaded =>
|
||||
{
|
||||
Anchor = Anchor.Centre,
|
||||
Origin = Anchor.Centre,
|
||||
Text = hasError ? response.Error : @"... nope, nothing found."
|
||||
});
|
||||
addContentToPlaceholder(loaded);
|
||||
}, (cancellationToken = new CancellationTokenSource()).Token);
|
||||
return;
|
||||
}
|
||||
|
||||
var beatmaps = response.BeatmapSets.Select(r => r.ToBeatmapSet(rulesets)).ToList();
|
||||
|
||||
var newPanels = new FillFlowContainer<DirectPanel>
|
||||
{
|
||||
RelativeSizeAxes = Axes.X,
|
||||
AutoSizeAxes = Axes.Y,
|
||||
Spacing = new Vector2(10),
|
||||
Alpha = 0,
|
||||
Margin = new MarginPadding { Vertical = 15 },
|
||||
ChildrenEnumerable = beatmaps.Select<BeatmapSetInfo, DirectPanel>(b => new DirectGridPanel(b)
|
||||
{
|
||||
Anchor = Anchor.TopCentre,
|
||||
|
@ -218,12 +222,70 @@ private void recreatePanels(SearchBeatmapSetsResponse response)
|
|||
|
||||
LoadComponentAsync(newPanels, loaded =>
|
||||
{
|
||||
panelsPlaceholder.Clear();
|
||||
panelsPlaceholder.FadeColour(Color4.White);
|
||||
panelsPlaceholder.Add(loaded);
|
||||
addContentToPlaceholder(loaded);
|
||||
loaded.FadeIn(600, Easing.OutQuint);
|
||||
searchSection.BeatmapSet = beatmaps.First();
|
||||
});
|
||||
}, (cancellationToken = new CancellationTokenSource()).Token);
|
||||
}
|
||||
|
||||
private void addContentToPlaceholder(Drawable content)
|
||||
{
|
||||
panelsPlaceholder.Clear();
|
||||
panelsPlaceholder.FadeColour(Color4.White);
|
||||
panelsPlaceholder.Add(content);
|
||||
}
|
||||
|
||||
protected override void Dispose(bool isDisposing)
|
||||
{
|
||||
getSetsRequest?.Cancel();
|
||||
cancellationToken?.Cancel();
|
||||
|
||||
base.Dispose(isDisposing);
|
||||
}
|
||||
|
||||
private class DrawableErrorHandler : CompositeDrawable
|
||||
{
|
||||
private readonly string error;
|
||||
|
||||
public DrawableErrorHandler(string error)
|
||||
{
|
||||
this.error = error;
|
||||
|
||||
RelativeSizeAxes = Axes.X;
|
||||
Height = 250;
|
||||
Margin = new MarginPadding { Top = 15 };
|
||||
}
|
||||
|
||||
[BackgroundDependencyLoader]
|
||||
private void load(TextureStore textures)
|
||||
{
|
||||
AddInternal(new FillFlowContainer
|
||||
{
|
||||
Anchor = Anchor.Centre,
|
||||
Origin = Anchor.Centre,
|
||||
RelativeSizeAxes = Axes.Y,
|
||||
AutoSizeAxes = Axes.X,
|
||||
Direction = FillDirection.Horizontal,
|
||||
Spacing = new Vector2(10, 0),
|
||||
Children = new Drawable[]
|
||||
{
|
||||
new Sprite
|
||||
{
|
||||
Anchor = Anchor.Centre,
|
||||
Origin = Anchor.Centre,
|
||||
RelativeSizeAxes = Axes.Both,
|
||||
FillMode = FillMode.Fit,
|
||||
Texture = textures.Get(@"Online/not-found")
|
||||
},
|
||||
new OsuSpriteText
|
||||
{
|
||||
Anchor = Anchor.Centre,
|
||||
Origin = Anchor.Centre,
|
||||
Text = error,
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue