From 2186b51676b77ab5e96427fa46a29ad641c3174b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Bart=C5=82omiej=20Dach?= Date: Sat, 23 Oct 2021 15:51:36 +0200 Subject: [PATCH] Implement detailed download button behaviour --- .../TestSceneBeatmapCardDownloadButton.cs | 31 ++++++-- .../Drawables/Cards/Buttons/DownloadButton.cs | 70 ++++++++++++++++--- 2 files changed, 87 insertions(+), 14 deletions(-) diff --git a/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapCardDownloadButton.cs b/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapCardDownloadButton.cs index 1d7acb0e7b..11eb93c5ac 100644 --- a/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapCardDownloadButton.cs +++ b/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapCardDownloadButton.cs @@ -9,9 +9,11 @@ using osu.Framework.Graphics; using osu.Framework.Testing; using osu.Game.Beatmaps; using osu.Game.Beatmaps.Drawables.Cards.Buttons; +using osu.Game.Configuration; using osu.Game.Online; using osu.Game.Online.API.Requests.Responses; using osu.Game.Overlays; +using osu.Game.Resources.Localisation.Web; using osu.Game.Rulesets.Osu; using osu.Game.Screens.Ranking.Expanded.Accuracy; using osu.Game.Tests.Resources; @@ -29,15 +31,20 @@ namespace osu.Game.Tests.Visual.Beatmaps [Resolved] private BeatmapManager beatmaps { get; set; } + [Resolved] + private OsuConfigManager config { get; set; } + [Test] public void TestDownloadableBeatmap() { + ensureSoleilyRemoved(); createButton(true); assertDownloadVisible(true); assertDownloadEnabled(true); assertProgressVisible(false); assertPlayVisible(false); + AddAssert("tooltip text correct", () => downloadButton.Download.TooltipText == BeatmapsetsStrings.PanelDownloadAll); AddStep("set downloading state", () => downloadButton.State.Value = DownloadState.Downloading); assertDownloadVisible(false); @@ -54,17 +61,30 @@ namespace osu.Game.Tests.Visual.Beatmaps assertPlayVisible(true); } + [Test] + public void TestDownloadableBeatmapWithVideo() + { + createButton(true, true); + assertDownloadEnabled(true); + + AddStep("prefer no video", () => config.SetValue(OsuSetting.PreferNoVideo, true)); + AddAssert("tooltip text correct", () => downloadButton.Download.TooltipText == BeatmapsetsStrings.PanelDownloadNoVideo); + + AddStep("prefer video", () => config.SetValue(OsuSetting.PreferNoVideo, false)); + AddAssert("tooltip text correct", () => downloadButton.Download.TooltipText == BeatmapsetsStrings.PanelDownloadVideo); + } + [Test] public void TestUndownloadableBeatmap() { createButton(false); assertDownloadEnabled(false); + AddAssert("tooltip text correct", () => downloadButton.Download.TooltipText == BeatmapsetsStrings.AvailabilityDisabled); } [Test] public void TestDownloadState() { - AddUntilStep("ensure manager loaded", () => beatmaps != null); ensureSoleilyRemoved(); createButtonWithBeatmap(createSoleily()); AddAssert("button state not downloaded", () => downloadButton.State.Value == DownloadState.NotDownloaded); @@ -81,6 +101,7 @@ namespace osu.Game.Tests.Visual.Beatmaps private void ensureSoleilyRemoved() { + AddUntilStep("ensure manager loaded", () => beatmaps != null); AddStep("remove soleily", () => { var beatmap = beatmaps.QueryBeatmapSet(b => b.OnlineBeatmapSetID == 241526); @@ -119,11 +140,11 @@ namespace osu.Game.Tests.Visual.Beatmaps }); } - private void createButton(bool downloadable) + private void createButton(bool downloadable, bool hasVideo = false) { AddStep("create button", () => { - Child = downloadButton = new TestDownloadButton(downloadable ? getDownloadableBeatmapSet() : getUndownloadableBeatmapSet()) + Child = downloadButton = new TestDownloadButton(downloadable ? getDownloadableBeatmapSet(hasVideo) : getUndownloadableBeatmapSet()) { Anchor = Anchor.Centre, Origin = Anchor.Centre, @@ -132,10 +153,10 @@ namespace osu.Game.Tests.Visual.Beatmaps }); } - private APIBeatmapSet getDownloadableBeatmapSet() + private APIBeatmapSet getDownloadableBeatmapSet(bool hasVideo) { var normal = CreateAPIBeatmapSet(new OsuRuleset().RulesetInfo); - normal.HasVideo = true; + normal.HasVideo = hasVideo; normal.HasStoryboard = true; return normal; diff --git a/osu.Game/Beatmaps/Drawables/Cards/Buttons/DownloadButton.cs b/osu.Game/Beatmaps/Drawables/Cards/Buttons/DownloadButton.cs index 43c222c949..aeb36b579e 100644 --- a/osu.Game/Beatmaps/Drawables/Cards/Buttons/DownloadButton.cs +++ b/osu.Game/Beatmaps/Drawables/Cards/Buttons/DownloadButton.cs @@ -1,14 +1,19 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. +#nullable enable + using osu.Framework.Allocation; +using osu.Framework.Bindables; using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Game.Online.API.Requests.Responses; +using osu.Game.Configuration; using osu.Game.Graphics; using osu.Game.Online; using osu.Game.Overlays; +using osu.Game.Resources.Localisation.Web; using osu.Game.Screens.Ranking.Expanded.Accuracy; using osuTK; @@ -23,10 +28,10 @@ namespace osu.Game.Beatmaps.Drawables.Cards.Buttons private readonly SmoothCircularProgress downloadProgress; [Resolved] - private OsuColour colours { get; set; } + private OsuColour colours { get; set; } = null!; [Resolved] - private OverlayColourProvider colourProvider { get; set; } + private OverlayColourProvider colourProvider { get; set; } = null!; public DownloadButton(APIBeatmapSet beatmapSet) { @@ -37,7 +42,7 @@ namespace osu.Game.Beatmaps.Drawables.Cards.Buttons InternalChildren = new Drawable[] { Tracker = new BeatmapDownloadTracker(beatmapSet), - Download = new DownloadIcon(), + Download = new DownloadIcon(beatmapSet), downloadProgress = new SmoothCircularProgress { Size = new Vector2(12), @@ -45,7 +50,7 @@ namespace osu.Game.Beatmaps.Drawables.Cards.Buttons Origin = Anchor.Centre, InnerRadius = 0.4f, }, - Play = new PlayIcon() + Play = new PlayIcon(beatmapSet) }; } @@ -65,27 +70,74 @@ namespace osu.Game.Beatmaps.Drawables.Cards.Buttons downloadProgress.FadeTo(Tracker.State.Value == DownloadState.Downloading || Tracker.State.Value == DownloadState.Importing ? 1 : 0, BeatmapCard.TRANSITION_DURATION, Easing.OutQuint); downloadProgress.FadeColour(Tracker.State.Value == DownloadState.Importing ? colours.Yellow : colourProvider.Highlight1, BeatmapCard.TRANSITION_DURATION, Easing.OutQuint); if (Tracker.State.Value == DownloadState.Downloading) - downloadProgress.FillTo(Tracker.Progress.Value, BeatmapCard.TRANSITION_DURATION, Easing.OutQuint); + downloadProgress.FillTo(Tracker.Progress.Value, Tracker.Progress.Value > 0 ? BeatmapCard.TRANSITION_DURATION : 0, Easing.OutQuint); Play.FadeTo(Tracker.State.Value == DownloadState.LocallyAvailable ? 1 : 0, BeatmapCard.TRANSITION_DURATION, Easing.OutQuint); } protected class DownloadIcon : BeatmapCardIconButton { - public DownloadIcon() + private readonly APIBeatmapSet beatmapSet; + private Bindable preferNoVideo = null!; + + [Resolved] + private BeatmapManager beatmaps { get; set; } = null!; + + public DownloadIcon(APIBeatmapSet beatmapSet) { Icon.Icon = FontAwesome.Solid.Download; + + this.beatmapSet = beatmapSet; + } + + [BackgroundDependencyLoader] + private void load(OsuConfigManager config) + { + preferNoVideo = config.GetBindable(OsuSetting.PreferNoVideo); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + preferNoVideo.BindValueChanged(_ => updateState(), true); + } + + private void updateState() + { + if (beatmapSet.Availability.DownloadDisabled) + { + Enabled.Value = false; + TooltipText = BeatmapsetsStrings.AvailabilityDisabled; + return; + } + + if (!beatmapSet.HasVideo) + TooltipText = BeatmapsetsStrings.PanelDownloadAll; + else + TooltipText = preferNoVideo.Value ? BeatmapsetsStrings.PanelDownloadNoVideo : BeatmapsetsStrings.PanelDownloadVideo; + + Action = () => beatmaps.Download(beatmapSet, preferNoVideo.Value); } } protected class PlayIcon : BeatmapCardIconButton { - public PlayIcon() + private readonly APIBeatmapSet beatmapSet; + + public PlayIcon(APIBeatmapSet beatmapSet) { + this.beatmapSet = beatmapSet; + Icon.Icon = FontAwesome.Regular.PlayCircle; + TooltipText = "Go to beatmap"; + } + + [BackgroundDependencyLoader(true)] + private void load(OsuGame? game) + { + if (game != null) + Action = () => game.PresentBeatmap(beatmapSet); } } - - // TODO: implement behaviour } }