1
0
mirror of https://github.com/ppy/osu.git synced 2024-11-11 17:47:29 +08:00

Fix loading (but not showing) a sheared overlay hiding displayed footer content

Identified by tests. See https://github.com/ppy/osu/actions/runs/9869382635/job/27253010485 & https://github.com/ppy/osu/actions/runs/9869382635/job/27253009622.

This change also prevents the initial `PopOut` call in overlays from calling `clearActiveOverlayContainer`, since it's not in the update thread and it's never meant to be called at that point anyway (it's supposed to be accompanied by a previous `PopIn` call adding the footer content).
This commit is contained in:
Salman Ahmed 2024-07-10 11:54:04 +03:00
parent f0a7a3f856
commit 337f05f9a4
2 changed files with 19 additions and 14 deletions

View File

@ -1,6 +1,7 @@
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
// See the LICENCE file in the repository root for full licence text.
using System;
using osu.Framework.Allocation;
using osu.Framework.Extensions.Color4Extensions;
using osu.Framework.Graphics;
@ -123,6 +124,7 @@ namespace osu.Game.Overlays.Mods
return base.OnClick(e);
}
private IDisposable? activeOverlayRegistration;
private bool hideFooterOnPopOut;
protected override void PopIn()
@ -135,7 +137,7 @@ namespace osu.Game.Overlays.Mods
if (footer != null)
{
footer.SetActiveOverlayContainer(this);
activeOverlayRegistration = footer.RegisterActiveOverlayContainer(this);
if (footer.State.Value == Visibility.Hidden)
{
@ -156,7 +158,8 @@ namespace osu.Game.Overlays.Mods
if (footer != null)
{
footer.ClearActiveOverlayContainer();
activeOverlayRegistration?.Dispose();
activeOverlayRegistration = null;
if (hideFooterOnPopOut)
{

View File

@ -142,7 +142,7 @@ namespace osu.Game.Screens.Footer
temporarilyHiddenButtons.Clear();
overlays.Clear();
ClearActiveOverlayContainer();
clearActiveOverlayContainer();
var oldButtons = buttonsFlow.ToArray();
@ -187,14 +187,15 @@ namespace osu.Game.Screens.Footer
private ShearedOverlayContainer? activeOverlay;
private Container? contentContainer;
private readonly List<ScreenFooterButton> temporarilyHiddenButtons = new List<ScreenFooterButton>();
public void SetActiveOverlayContainer(ShearedOverlayContainer overlay)
public IDisposable RegisterActiveOverlayContainer(ShearedOverlayContainer overlay)
{
if (contentContainer != null)
if (activeOverlay != null)
{
throw new InvalidOperationException(@"Cannot set overlay content while one is already present. " +
$@"The previous overlay whose content is {contentContainer.Child.GetType().Name} should be hidden first.");
$@"The previous overlay ({activeOverlay.GetType().Name}) should be hidden first.");
}
activeOverlay = overlay;
@ -232,29 +233,30 @@ namespace osu.Game.Screens.Footer
this.Delay(60).Schedule(() => content.Show());
else
content.Show();
return new InvokeOnDisposal(clearActiveOverlayContainer);
}
public void ClearActiveOverlayContainer()
private void clearActiveOverlayContainer()
{
if (contentContainer == null)
if (activeOverlay == null)
return;
Debug.Assert(contentContainer != null);
contentContainer.Child.Hide();
double timeUntilRun = contentContainer.Child.LatestTransformEndTime - Time.Current;
Container expireTarget = contentContainer;
contentContainer = null;
activeOverlay = null;
for (int i = 0; i < temporarilyHiddenButtons.Count; i++)
makeButtonAppearFromBottom(temporarilyHiddenButtons[i], 0);
temporarilyHiddenButtons.Clear();
expireTarget.Delay(timeUntilRun).Expire();
updateColourScheme(OverlayColourScheme.Aquamarine);
contentContainer.Delay(timeUntilRun).Expire();
contentContainer = null;
activeOverlay = null;
}
private void updateColourScheme(OverlayColourScheme colourScheme)