From d057dc9a95cf76f6888e6e0d8f8a60dca3705343 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Tue, 26 Nov 2024 14:13:07 +0900 Subject: [PATCH] Refactor `MedalOverlay` to be more readable Shouldn't really have any functionality changes, just fixing some old code that I can't easily parse these days. --- osu.Game/Overlays/MedalOverlay.cs | 78 ++++++++++++++++++++----------- 1 file changed, 50 insertions(+), 28 deletions(-) diff --git a/osu.Game/Overlays/MedalOverlay.cs b/osu.Game/Overlays/MedalOverlay.cs index 19f61cb910..7303a57cd0 100644 --- a/osu.Game/Overlays/MedalOverlay.cs +++ b/osu.Game/Overlays/MedalOverlay.cs @@ -35,7 +35,7 @@ namespace osu.Game.Overlays private IAPIProvider api { get; set; } = null!; private Container medalContainer = null!; - private MedalAnimation? lastAnimation; + private MedalAnimation? currentMedalDisplay; [BackgroundDependencyLoader] private void load() @@ -54,11 +54,7 @@ namespace osu.Game.Overlays { base.LoadComplete(); - OverlayActivationMode.BindValueChanged(val => - { - if (val.NewValue == OverlayActivation.All && (queuedMedals.Any() || medalContainer.Any() || lastAnimation?.IsLoaded == false)) - Show(); - }, true); + OverlayActivationMode.BindValueChanged(_ => displayIfReady(), true); } private void handleMedalMessages(SocketMessage obj) @@ -86,31 +82,13 @@ namespace osu.Game.Overlays queuedMedals.Enqueue(medalAnimation); Logger.Log($"Queueing medal unlock for \"{medal.Name}\" ({queuedMedals.Count} to display)"); - if (OverlayActivationMode.Value == OverlayActivation.All) - Scheduler.AddOnce(Show); - } - - protected override void Update() - { - base.Update(); - - if (medalContainer.Any() || lastAnimation?.IsLoaded == false) - return; - - if (!queuedMedals.TryDequeue(out lastAnimation)) - { - Logger.Log("All queued medals have been displayed!"); - Hide(); - return; - } - - Logger.Log($"Preparing to display \"{lastAnimation.Medal.Name}\""); - LoadComponentAsync(lastAnimation, medalContainer.Add); + Schedule(displayIfReady); } protected override bool OnClick(ClickEvent e) { - lastAnimation?.Dismiss(); + dismissDisplayedMedal(); + loadNextMedal(); return true; } @@ -118,13 +96,57 @@ namespace osu.Game.Overlays { if (e.Action == GlobalAction.Back) { - lastAnimation?.Dismiss(); + dismissDisplayedMedal(); + loadNextMedal(); return true; } return base.OnPressed(e); } + private void dismissDisplayedMedal() + { + if (currentMedalDisplay?.IsLoaded == false) + return; + + currentMedalDisplay?.Dismiss(); + currentMedalDisplay = null; + } + + private void displayIfReady() + { + if (OverlayActivationMode.Value != OverlayActivation.All) + return; + + if (currentMedalDisplay != null) + { + Show(); + return; + } + + if (queuedMedals.Any()) + { + Show(); + loadNextMedal(); + } + } + + private void loadNextMedal() + { + if (currentMedalDisplay != null) + return; + + if (!queuedMedals.TryDequeue(out currentMedalDisplay)) + { + Logger.Log("All queued medals have been displayed!"); + Hide(); + return; + } + + Logger.Log($"Preparing to display \"{currentMedalDisplay.Medal.Name}\""); + LoadComponentAsync(currentMedalDisplay, m => medalContainer.Add(m)); + } + protected override void Dispose(bool isDisposing) { base.Dispose(isDisposing);