Update remaining usages of download tracking

This commit is contained in:
Dean Herbert
2021-10-27 20:49:15 +09:00
parent dd06c617b1
commit f014ceaead
7 changed files with 100 additions and 46 deletions

View File

@ -5,6 +5,7 @@ using System.Linq;
using NUnit.Framework; using NUnit.Framework;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Testing;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Online; using osu.Game.Online;
using osu.Game.Online.API.Requests.Responses; using osu.Game.Online.API.Requests.Responses;
@ -144,7 +145,7 @@ namespace osu.Game.Tests.Visual.Online
{ {
public new bool DownloadEnabled => base.DownloadEnabled; public new bool DownloadEnabled => base.DownloadEnabled;
public DownloadState DownloadState => State.Value; public DownloadState DownloadState => this.ChildrenOfType<BeatmapDownloadTracker>().First().State.Value;
public TestDownloadButton(BeatmapSetInfo beatmapSet) public TestDownloadButton(BeatmapSetInfo beatmapSet)
: base(beatmapSet) : base(beatmapSet)

View File

@ -5,6 +5,7 @@ using System;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Configuration; using osu.Game.Configuration;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
@ -13,7 +14,7 @@ using osu.Game.Online;
namespace osu.Game.Overlays.BeatmapListing.Panels namespace osu.Game.Overlays.BeatmapListing.Panels
{ {
public class BeatmapPanelDownloadButton : BeatmapDownloadTrackingComposite public class BeatmapPanelDownloadButton : CompositeDrawable
{ {
protected bool DownloadEnabled => button.Enabled.Value; protected bool DownloadEnabled => button.Enabled.Value;
@ -26,16 +27,29 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
private readonly DownloadButton button; private readonly DownloadButton button;
private Bindable<bool> noVideoSetting; private Bindable<bool> noVideoSetting;
protected readonly BeatmapDownloadTracker DownloadTracker;
protected readonly Bindable<DownloadState> State = new Bindable<DownloadState>();
private readonly BeatmapSetInfo beatmapSet;
public BeatmapPanelDownloadButton(BeatmapSetInfo beatmapSet) public BeatmapPanelDownloadButton(BeatmapSetInfo beatmapSet)
: base(beatmapSet)
{ {
InternalChild = shakeContainer = new ShakeContainer this.beatmapSet = beatmapSet;
InternalChildren = new Drawable[]
{ {
RelativeSizeAxes = Axes.Both, shakeContainer = new ShakeContainer
Child = button = new DownloadButton
{ {
RelativeSizeAxes = Axes.Both, RelativeSizeAxes = Axes.Both,
Child = button = new DownloadButton
{
RelativeSizeAxes = Axes.Both,
},
}, },
DownloadTracker = new BeatmapDownloadTracker(beatmapSet)
{
State = { BindTarget = State }
}
}; };
button.Add(new DownloadProgressBar(beatmapSet) button.Add(new DownloadProgressBar(beatmapSet)
@ -50,7 +64,7 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
{ {
base.LoadComplete(); base.LoadComplete();
button.State.BindTo(State); ((IBindable<DownloadState>)button.State).BindTo(DownloadTracker.State);
FinishTransforms(true); FinishTransforms(true);
} }
@ -61,7 +75,7 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
button.Action = () => button.Action = () =>
{ {
switch (State.Value) switch (DownloadTracker.State.Value)
{ {
case DownloadState.Downloading: case DownloadState.Downloading:
case DownloadState.Importing: case DownloadState.Importing:
@ -73,16 +87,16 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
if (SelectedBeatmap.Value != null) if (SelectedBeatmap.Value != null)
findPredicate = b => b.OnlineBeatmapID == SelectedBeatmap.Value.OnlineBeatmapID; findPredicate = b => b.OnlineBeatmapID == SelectedBeatmap.Value.OnlineBeatmapID;
game?.PresentBeatmap(BeatmapSet.Value, findPredicate); game?.PresentBeatmap(beatmapSet, findPredicate);
break; break;
default: default:
beatmaps.Download(BeatmapSet.Value, noVideoSetting.Value); beatmaps.Download(beatmapSet, noVideoSetting.Value);
break; break;
} }
}; };
State.BindValueChanged(state => DownloadTracker.State.BindValueChanged(state =>
{ {
switch (state.NewValue) switch (state.NewValue)
{ {
@ -92,7 +106,7 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
break; break;
default: default:
if (BeatmapSet.Value?.OnlineInfo?.Availability.DownloadDisabled ?? false) if (beatmapSet.OnlineInfo?.Availability.DownloadDisabled ?? false)
{ {
button.Enabled.Value = false; button.Enabled.Value = false;
button.TooltipText = "this beatmap is currently not available for download."; button.TooltipText = "this beatmap is currently not available for download.";

View File

@ -4,6 +4,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Beatmaps; using osu.Game.Beatmaps;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
@ -12,13 +13,22 @@ using osuTK.Graphics;
namespace osu.Game.Overlays.BeatmapListing.Panels namespace osu.Game.Overlays.BeatmapListing.Panels
{ {
public class DownloadProgressBar : BeatmapDownloadTrackingComposite public class DownloadProgressBar : CompositeDrawable
{ {
private readonly ProgressBar progressBar; private readonly ProgressBar progressBar;
private readonly BeatmapDownloadTracker downloadTracker;
public DownloadProgressBar(BeatmapSetInfo beatmapSet) public DownloadProgressBar(BeatmapSetInfo beatmapSet)
: base(beatmapSet)
{ {
InternalChildren = new Drawable[]
{
progressBar = new ProgressBar(false)
{
Height = 0,
Alpha = 0,
},
downloadTracker = new BeatmapDownloadTracker(beatmapSet),
};
AddInternal(progressBar = new ProgressBar(false) AddInternal(progressBar = new ProgressBar(false)
{ {
Height = 0, Height = 0,
@ -34,9 +44,9 @@ namespace osu.Game.Overlays.BeatmapListing.Panels
{ {
progressBar.FillColour = colours.Blue; progressBar.FillColour = colours.Blue;
progressBar.BackgroundColour = Color4.Black.Opacity(0.7f); progressBar.BackgroundColour = Color4.Black.Opacity(0.7f);
progressBar.Current = Progress; progressBar.Current.BindTarget = downloadTracker.Progress;
State.BindValueChanged(state => downloadTracker.State.BindValueChanged(state =>
{ {
switch (state.NewValue) switch (state.NewValue)
{ {

View File

@ -3,12 +3,14 @@
using System.Linq; using System.Linq;
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables;
using osu.Framework.Extensions.Color4Extensions; using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Colour; using osu.Framework.Graphics.Colour;
using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Shapes; using osu.Framework.Graphics.Shapes;
using osu.Framework.Localisation; using osu.Framework.Localisation;
using osu.Game.Beatmaps;
using osu.Game.Beatmaps.Drawables; using osu.Game.Beatmaps.Drawables;
using osu.Game.Graphics; using osu.Game.Graphics;
using osu.Game.Graphics.Sprites; using osu.Game.Graphics.Sprites;
@ -21,8 +23,10 @@ using osuTK;
namespace osu.Game.Overlays.BeatmapSet namespace osu.Game.Overlays.BeatmapSet
{ {
public class BeatmapSetHeaderContent : BeatmapDownloadTrackingComposite public class BeatmapSetHeaderContent : CompositeDrawable
{ {
public readonly Bindable<BeatmapSetInfo> BeatmapSet = new Bindable<BeatmapSetInfo>();
private const float transition_duration = 200; private const float transition_duration = 200;
private const float buttons_height = 45; private const float buttons_height = 45;
private const float buttons_spacing = 5; private const float buttons_spacing = 5;
@ -45,6 +49,8 @@ namespace osu.Game.Overlays.BeatmapSet
private readonly FillFlowContainer fadeContent; private readonly FillFlowContainer fadeContent;
private readonly LoadingSpinner loading; private readonly LoadingSpinner loading;
private BeatmapDownloadTracker downloadTracker;
[Resolved] [Resolved]
private IAPIProvider api { get; set; } private IAPIProvider api { get; set; }
@ -222,13 +228,13 @@ namespace osu.Game.Overlays.BeatmapSet
{ {
coverGradient.Colour = ColourInfo.GradientVertical(colourProvider.Background6.Opacity(0.3f), colourProvider.Background6.Opacity(0.8f)); coverGradient.Colour = ColourInfo.GradientVertical(colourProvider.Background6.Opacity(0.3f), colourProvider.Background6.Opacity(0.8f));
State.BindValueChanged(_ => updateDownloadButtons());
BeatmapSet.BindValueChanged(setInfo => BeatmapSet.BindValueChanged(setInfo =>
{ {
Picker.BeatmapSet = rulesetSelector.BeatmapSet = author.BeatmapSet = beatmapAvailability.BeatmapSet = Details.BeatmapSet = setInfo.NewValue; Picker.BeatmapSet = rulesetSelector.BeatmapSet = author.BeatmapSet = beatmapAvailability.BeatmapSet = Details.BeatmapSet = setInfo.NewValue;
cover.BeatmapSet = setInfo.NewValue; cover.BeatmapSet = setInfo.NewValue;
downloadTracker?.Expire();
if (setInfo.NewValue == null) if (setInfo.NewValue == null)
{ {
onlineStatusPill.FadeTo(0.5f, 500, Easing.OutQuint); onlineStatusPill.FadeTo(0.5f, 500, Easing.OutQuint);
@ -241,6 +247,9 @@ namespace osu.Game.Overlays.BeatmapSet
} }
else else
{ {
downloadTracker = new BeatmapDownloadTracker(setInfo.NewValue);
downloadTracker.State.BindValueChanged(_ => updateDownloadButtons());
fadeContent.FadeIn(500, Easing.OutQuint); fadeContent.FadeIn(500, Easing.OutQuint);
loading.Hide(); loading.Hide();
@ -266,13 +275,13 @@ namespace osu.Game.Overlays.BeatmapSet
{ {
if (BeatmapSet.Value == null) return; if (BeatmapSet.Value == null) return;
if (BeatmapSet.Value.OnlineInfo.Availability.DownloadDisabled && State.Value != DownloadState.LocallyAvailable) if (BeatmapSet.Value.OnlineInfo.Availability.DownloadDisabled && downloadTracker.State.Value != DownloadState.LocallyAvailable)
{ {
downloadButtonsContainer.Clear(); downloadButtonsContainer.Clear();
return; return;
} }
switch (State.Value) switch (downloadTracker.State.Value)
{ {
case DownloadState.LocallyAvailable: case DownloadState.LocallyAvailable:
// temporary for UX until new design is implemented. // temporary for UX until new design is implemented.

View File

@ -22,7 +22,7 @@ using osuTK.Graphics;
namespace osu.Game.Overlays.BeatmapSet.Buttons namespace osu.Game.Overlays.BeatmapSet.Buttons
{ {
public class HeaderDownloadButton : BeatmapDownloadTrackingComposite, IHasTooltip public class HeaderDownloadButton : CompositeDrawable, IHasTooltip
{ {
private const int text_size = 12; private const int text_size = 12;
@ -35,9 +35,12 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
private ShakeContainer shakeContainer; private ShakeContainer shakeContainer;
private HeaderButton button; private HeaderButton button;
private BeatmapDownloadTracker downloadTracker;
private readonly BeatmapSetInfo beatmapSet;
public HeaderDownloadButton(BeatmapSetInfo beatmapSet, bool noVideo = false) public HeaderDownloadButton(BeatmapSetInfo beatmapSet, bool noVideo = false)
: base(beatmapSet)
{ {
this.beatmapSet = beatmapSet;
this.noVideo = noVideo; this.noVideo = noVideo;
Width = 120; Width = 120;
@ -49,13 +52,17 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
{ {
FillFlowContainer textSprites; FillFlowContainer textSprites;
AddInternal(shakeContainer = new ShakeContainer InternalChildren = new Drawable[]
{ {
RelativeSizeAxes = Axes.Both, shakeContainer = new ShakeContainer
Masking = true, {
CornerRadius = 5, RelativeSizeAxes = Axes.Both,
Child = button = new HeaderButton { RelativeSizeAxes = Axes.Both }, Masking = true,
}); CornerRadius = 5,
Child = button = new HeaderButton { RelativeSizeAxes = Axes.Both },
},
downloadTracker = new BeatmapDownloadTracker(beatmapSet),
};
button.AddRange(new Drawable[] button.AddRange(new Drawable[]
{ {
@ -83,7 +90,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
}, },
} }
}, },
new DownloadProgressBar(BeatmapSet.Value) new DownloadProgressBar(beatmapSet)
{ {
Anchor = Anchor.BottomLeft, Anchor = Anchor.BottomLeft,
Origin = Anchor.BottomLeft, Origin = Anchor.BottomLeft,
@ -92,20 +99,20 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
button.Action = () => button.Action = () =>
{ {
if (State.Value != DownloadState.NotDownloaded) if (downloadTracker.State.Value != DownloadState.NotDownloaded)
{ {
shakeContainer.Shake(); shakeContainer.Shake();
return; return;
} }
beatmaps.Download(BeatmapSet.Value, noVideo); beatmaps.Download(beatmapSet, noVideo);
}; };
localUser.BindTo(api.LocalUser); localUser.BindTo(api.LocalUser);
localUser.BindValueChanged(userChanged, true); localUser.BindValueChanged(userChanged, true);
button.Enabled.BindValueChanged(enabledChanged, true); button.Enabled.BindValueChanged(enabledChanged, true);
State.BindValueChanged(state => downloadTracker.State.BindValueChanged(state =>
{ {
switch (state.NewValue) switch (state.NewValue)
{ {
@ -161,7 +168,7 @@ namespace osu.Game.Overlays.BeatmapSet.Buttons
private LocalisableString getVideoSuffixText() private LocalisableString getVideoSuffixText()
{ {
if (!BeatmapSet.Value.OnlineInfo.HasVideo) if (!beatmapSet.OnlineInfo.HasVideo)
return string.Empty; return string.Empty;
return noVideo ? BeatmapsetsStrings.ShowDetailsDownloadNoVideo : BeatmapsetsStrings.ShowDetailsDownloadVideo; return noVideo ? BeatmapsetsStrings.ShowDetailsDownloadNoVideo : BeatmapsetsStrings.ShowDetailsDownloadVideo;

View File

@ -302,7 +302,7 @@ namespace osu.Game.Screens.OnlinePlay
{ {
base.LoadComplete(); base.LoadComplete();
State.BindValueChanged(stateChanged, true); DownloadTracker.State.BindValueChanged(stateChanged, true);
FinishTransforms(true); FinishTransforms(true);
} }

View File

@ -4,6 +4,7 @@
using osu.Framework.Allocation; using osu.Framework.Allocation;
using osu.Framework.Bindables; using osu.Framework.Bindables;
using osu.Framework.Graphics; using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Game.Graphics.Containers; using osu.Game.Graphics.Containers;
using osu.Game.Graphics.UserInterface; using osu.Game.Graphics.UserInterface;
using osu.Game.Online; using osu.Game.Online;
@ -12,13 +13,17 @@ using osuTK;
namespace osu.Game.Screens.Ranking namespace osu.Game.Screens.Ranking
{ {
public class ReplayDownloadButton : DownloadTrackingComposite<ScoreInfo, ScoreManager> public class ReplayDownloadButton : CompositeDrawable
{ {
public Bindable<ScoreInfo> Score => Model; public readonly Bindable<ScoreInfo> Score = new Bindable<ScoreInfo>();
protected readonly Bindable<DownloadState> State = new Bindable<DownloadState>();
private DownloadButton button; private DownloadButton button;
private ShakeContainer shakeContainer; private ShakeContainer shakeContainer;
private ScoreDownloadTracker downloadTracker;
private ReplayAvailability replayAvailability private ReplayAvailability replayAvailability
{ {
get get
@ -26,7 +31,7 @@ namespace osu.Game.Screens.Ranking
if (State.Value == DownloadState.LocallyAvailable) if (State.Value == DownloadState.LocallyAvailable)
return ReplayAvailability.Local; return ReplayAvailability.Local;
if (!string.IsNullOrEmpty(Model.Value?.Hash)) if (!string.IsNullOrEmpty(Score.Value?.Hash))
return ReplayAvailability.Online; return ReplayAvailability.Online;
return ReplayAvailability.NotAvailable; return ReplayAvailability.NotAvailable;
@ -34,8 +39,8 @@ namespace osu.Game.Screens.Ranking
} }
public ReplayDownloadButton(ScoreInfo score) public ReplayDownloadButton(ScoreInfo score)
: base(score)
{ {
Score.Value = score;
Size = new Vector2(50, 30); Size = new Vector2(50, 30);
} }
@ -56,11 +61,11 @@ namespace osu.Game.Screens.Ranking
switch (State.Value) switch (State.Value)
{ {
case DownloadState.LocallyAvailable: case DownloadState.LocallyAvailable:
game?.PresentScore(Model.Value, ScorePresentType.Gameplay); game?.PresentScore(Score.Value, ScorePresentType.Gameplay);
break; break;
case DownloadState.NotDownloaded: case DownloadState.NotDownloaded:
scores.Download(Model.Value, false); scores.Download(Score.Value, false);
break; break;
case DownloadState.Importing: case DownloadState.Importing:
@ -70,17 +75,25 @@ namespace osu.Game.Screens.Ranking
} }
}; };
State.BindValueChanged(state => Score.BindValueChanged(score =>
{ {
button.State.Value = state.NewValue; downloadTracker?.Expire();
if (score.NewValue != null)
{
AddInternal(downloadTracker = new ScoreDownloadTracker(score.NewValue)
{
State = { BindTarget = State }
});
}
button.Enabled.Value = replayAvailability != ReplayAvailability.NotAvailable;
updateTooltip(); updateTooltip();
}, true); }, true);
Model.BindValueChanged(_ => State.BindValueChanged(state =>
{ {
button.Enabled.Value = replayAvailability != ReplayAvailability.NotAvailable; button.State.Value = state.NewValue;
updateTooltip(); updateTooltip();
}, true); }, true);
} }