1
0
mirror of https://github.com/ppy/osu.git synced 2024-12-05 03:03:21 +08:00
This commit is contained in:
Dean Herbert 2024-12-03 23:25:09 +09:00 committed by GitHub
commit feade4a2b8
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 53 additions and 33 deletions

View File

@ -245,18 +245,19 @@ namespace osu.Game.Overlays
this.FadeOut(200);
}
public void Dismiss()
public bool Dismiss()
{
if (drawableMedal != null && drawableMedal.State != DisplayState.Full)
{
// if we haven't yet, play out the animation fully
drawableMedal.State = DisplayState.Full;
FinishTransforms(true);
return;
return false;
}
Hide();
Expire();
return true;
}
private partial class BackgroundStrip : Container

View File

@ -2,7 +2,6 @@
// See the LICENCE file in the repository root for full licence text.
using System.Collections.Generic;
using System.Linq;
using osu.Framework.Allocation;
using osu.Framework.Extensions.ObjectExtensions;
using osu.Framework.Graphics;
@ -35,7 +34,7 @@ namespace osu.Game.Overlays
private IAPIProvider api { get; set; } = null!;
private Container<Drawable> medalContainer = null!;
private MedalAnimation? lastAnimation;
private MedalAnimation? currentMedalDisplay;
[BackgroundDependencyLoader]
private void load()
@ -54,11 +53,12 @@ namespace osu.Game.Overlays
{
base.LoadComplete();
OverlayActivationMode.BindValueChanged(val =>
OverlayActivationMode.BindValueChanged(_ => showNextMedal(), true);
}
public override void Hide()
{
if (val.NewValue == OverlayActivation.All && (queuedMedals.Any() || medalContainer.Any() || lastAnimation?.IsLoaded == false))
Show();
}, true);
// don't allow hiding the overlay via any method other than our own.
}
private void handleMedalMessages(SocketMessage obj)
@ -83,34 +83,18 @@ namespace osu.Game.Overlays
var medalAnimation = new MedalAnimation(medal);
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()
Schedule(() => LoadComponentAsync(medalAnimation, m =>
{
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);
queuedMedals.Enqueue(m);
showNextMedal();
}));
}
protected override bool OnClick(ClickEvent e)
{
lastAnimation?.Dismiss();
progressDisplayByUser();
return true;
}
@ -118,19 +102,54 @@ namespace osu.Game.Overlays
{
if (e.Action == GlobalAction.Back)
{
lastAnimation?.Dismiss();
progressDisplayByUser();
return true;
}
return base.OnPressed(e);
}
private void progressDisplayByUser()
{
// Dismissing may sometimes play out the medal animation rather than immediately dismissing.
if (currentMedalDisplay?.Dismiss() == false)
return;
currentMedalDisplay = null;
showNextMedal();
}
private void showNextMedal()
{
// If already displayed, keep displaying medals regardless of activation mode changes.
if (OverlayActivationMode.Value != OverlayActivation.All && State.Value == Visibility.Hidden)
return;
// A medal is already displaying.
if (currentMedalDisplay != null)
return;
if (queuedMedals.TryDequeue(out currentMedalDisplay))
{
Logger.Log($"Displaying \"{currentMedalDisplay.Medal.Name}\"");
medalContainer.Add(currentMedalDisplay);
Show();
}
else if (State.Value == Visibility.Visible)
{
Logger.Log("All queued medals have been displayed, hiding overlay!");
base.Hide();
}
}
protected override void Dispose(bool isDisposing)
{
base.Dispose(isDisposing);
// this event subscription fires async loads, which hard-fail if `CompositeDrawable.disposalCancellationSource` is canceled, which happens in the base call.
// therefore, unsubscribe from this event early to reduce the chances of a stray event firing at an inconvenient spot.
if (api.IsNotNull())
api.NotificationsClient.MessageReceived -= handleMedalMessages;
base.Dispose(isDisposing);
}
}
}