From 034c887dcb3c71a2be8dd92911c86ac128ada2dc Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 6 Sep 2023 15:04:25 +0900 Subject: [PATCH] Add animation support for beatmap status pills To be used in conjunction with https://github.com/ppy/osu/pull/22116 --- .../TestSceneBeatmapSetOnlineStatusPill.cs | 28 +++++++++++++++++ .../Drawables/BeatmapSetOnlineStatusPill.cs | 30 +++++++++++++++---- 2 files changed, 53 insertions(+), 5 deletions(-) diff --git a/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapSetOnlineStatusPill.cs b/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapSetOnlineStatusPill.cs index 88e47ea560..dcc4654437 100644 --- a/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapSetOnlineStatusPill.cs +++ b/osu.Game.Tests/Visual/Beatmaps/TestSceneBeatmapSetOnlineStatusPill.cs @@ -47,7 +47,35 @@ public void TestFixedWidth() pill.AutoSizeAxes = Axes.Y; pill.Width = 90; })); + AddStep("unset fixed width", () => statusPills.ForEach(pill => pill.AutoSizeAxes = Axes.Both)); } + + [Test] + public void TestChangeLabels() + { + AddStep("Change labels", () => + { + foreach (var pill in this.ChildrenOfType()) + { + switch (pill.Status) + { + // cycle at end + case BeatmapOnlineStatus.Loved: + pill.Status = BeatmapOnlineStatus.LocallyModified; + break; + + // skip none + case BeatmapOnlineStatus.LocallyModified: + pill.Status = BeatmapOnlineStatus.Graveyard; + break; + + default: + pill.Status = (pill.Status + 1); + break; + } + } + }); + } } } diff --git a/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs b/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs index c353b9e904..f18355505a 100644 --- a/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs +++ b/osu.Game/Beatmaps/Drawables/BeatmapSetOnlineStatusPill.cs @@ -19,6 +19,8 @@ namespace osu.Game.Beatmaps.Drawables { public partial class BeatmapSetOnlineStatusPill : CircularContainer, IHasTooltip { + private const double animation_duration = 400; + private BeatmapOnlineStatus status; public BeatmapOnlineStatus Status @@ -32,7 +34,12 @@ public BeatmapOnlineStatus Status status = value; if (IsLoaded) + { + AutoSizeDuration = (float)animation_duration; + AutoSizeEasing = Easing.OutQuint; + updateState(); + } } } @@ -61,6 +68,8 @@ public BeatmapSetOnlineStatusPill() { Masking = true; + Alpha = 0; + Children = new Drawable[] { background = new Box @@ -83,21 +92,32 @@ public BeatmapSetOnlineStatusPill() protected override void LoadComplete() { base.LoadComplete(); + updateState(); + FinishTransforms(true); } private void updateState() { - Alpha = Status == BeatmapOnlineStatus.None ? 0 : 1; + if (Status == BeatmapOnlineStatus.None) + { + this.FadeOut(animation_duration, Easing.OutQuint); + return; + } - statusText.Text = Status.GetLocalisableDescription().ToUpper(); + this.FadeIn(animation_duration, Easing.OutQuint); + + Color4 statusTextColour; if (colourProvider != null) - statusText.Colour = status == BeatmapOnlineStatus.Graveyard ? colourProvider.Background1 : colourProvider.Background3; + statusTextColour = status == BeatmapOnlineStatus.Graveyard ? colourProvider.Background1 : colourProvider.Background3; else - statusText.Colour = status == BeatmapOnlineStatus.Graveyard ? colours.GreySeaFoamLight : Color4.Black; + statusTextColour = status == BeatmapOnlineStatus.Graveyard ? colours.GreySeaFoamLight : Color4.Black; - background.Colour = OsuColour.ForBeatmapSetOnlineStatus(Status) ?? colourProvider?.Light1 ?? colours.GreySeaFoamLighter; + statusText.FadeColour(statusTextColour, animation_duration, Easing.OutQuint); + background.FadeColour(OsuColour.ForBeatmapSetOnlineStatus(Status) ?? colourProvider?.Light1 ?? colours.GreySeaFoamLighter, animation_duration, Easing.OutQuint); + + statusText.Text = Status.GetLocalisableDescription().ToUpper(); } public LocalisableString TooltipText