mirror of
https://github.com/ppy/osu.git
synced 2024-12-14 17:32:54 +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:
parent
f0a7a3f856
commit
337f05f9a4
@ -1,6 +1,7 @@
|
|||||||
// Copyright (c) ppy Pty Ltd <contact@ppy.sh>. Licensed under the MIT Licence.
|
// 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.
|
// See the LICENCE file in the repository root for full licence text.
|
||||||
|
|
||||||
|
using System;
|
||||||
using osu.Framework.Allocation;
|
using osu.Framework.Allocation;
|
||||||
using osu.Framework.Extensions.Color4Extensions;
|
using osu.Framework.Extensions.Color4Extensions;
|
||||||
using osu.Framework.Graphics;
|
using osu.Framework.Graphics;
|
||||||
@ -123,6 +124,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
return base.OnClick(e);
|
return base.OnClick(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private IDisposable? activeOverlayRegistration;
|
||||||
private bool hideFooterOnPopOut;
|
private bool hideFooterOnPopOut;
|
||||||
|
|
||||||
protected override void PopIn()
|
protected override void PopIn()
|
||||||
@ -135,7 +137,7 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
if (footer != null)
|
if (footer != null)
|
||||||
{
|
{
|
||||||
footer.SetActiveOverlayContainer(this);
|
activeOverlayRegistration = footer.RegisterActiveOverlayContainer(this);
|
||||||
|
|
||||||
if (footer.State.Value == Visibility.Hidden)
|
if (footer.State.Value == Visibility.Hidden)
|
||||||
{
|
{
|
||||||
@ -156,7 +158,8 @@ namespace osu.Game.Overlays.Mods
|
|||||||
|
|
||||||
if (footer != null)
|
if (footer != null)
|
||||||
{
|
{
|
||||||
footer.ClearActiveOverlayContainer();
|
activeOverlayRegistration?.Dispose();
|
||||||
|
activeOverlayRegistration = null;
|
||||||
|
|
||||||
if (hideFooterOnPopOut)
|
if (hideFooterOnPopOut)
|
||||||
{
|
{
|
||||||
|
@ -142,7 +142,7 @@ namespace osu.Game.Screens.Footer
|
|||||||
temporarilyHiddenButtons.Clear();
|
temporarilyHiddenButtons.Clear();
|
||||||
overlays.Clear();
|
overlays.Clear();
|
||||||
|
|
||||||
ClearActiveOverlayContainer();
|
clearActiveOverlayContainer();
|
||||||
|
|
||||||
var oldButtons = buttonsFlow.ToArray();
|
var oldButtons = buttonsFlow.ToArray();
|
||||||
|
|
||||||
@ -187,14 +187,15 @@ namespace osu.Game.Screens.Footer
|
|||||||
|
|
||||||
private ShearedOverlayContainer? activeOverlay;
|
private ShearedOverlayContainer? activeOverlay;
|
||||||
private Container? contentContainer;
|
private Container? contentContainer;
|
||||||
|
|
||||||
private readonly List<ScreenFooterButton> temporarilyHiddenButtons = new List<ScreenFooterButton>();
|
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. " +
|
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;
|
activeOverlay = overlay;
|
||||||
@ -232,29 +233,30 @@ namespace osu.Game.Screens.Footer
|
|||||||
this.Delay(60).Schedule(() => content.Show());
|
this.Delay(60).Schedule(() => content.Show());
|
||||||
else
|
else
|
||||||
content.Show();
|
content.Show();
|
||||||
|
|
||||||
|
return new InvokeOnDisposal(clearActiveOverlayContainer);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ClearActiveOverlayContainer()
|
private void clearActiveOverlayContainer()
|
||||||
{
|
{
|
||||||
if (contentContainer == null)
|
if (activeOverlay == null)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
Debug.Assert(contentContainer != null);
|
||||||
contentContainer.Child.Hide();
|
contentContainer.Child.Hide();
|
||||||
|
|
||||||
double timeUntilRun = contentContainer.Child.LatestTransformEndTime - Time.Current;
|
double timeUntilRun = contentContainer.Child.LatestTransformEndTime - Time.Current;
|
||||||
|
|
||||||
Container expireTarget = contentContainer;
|
|
||||||
contentContainer = null;
|
|
||||||
activeOverlay = null;
|
|
||||||
|
|
||||||
for (int i = 0; i < temporarilyHiddenButtons.Count; i++)
|
for (int i = 0; i < temporarilyHiddenButtons.Count; i++)
|
||||||
makeButtonAppearFromBottom(temporarilyHiddenButtons[i], 0);
|
makeButtonAppearFromBottom(temporarilyHiddenButtons[i], 0);
|
||||||
|
|
||||||
temporarilyHiddenButtons.Clear();
|
temporarilyHiddenButtons.Clear();
|
||||||
|
|
||||||
expireTarget.Delay(timeUntilRun).Expire();
|
|
||||||
|
|
||||||
updateColourScheme(OverlayColourScheme.Aquamarine);
|
updateColourScheme(OverlayColourScheme.Aquamarine);
|
||||||
|
|
||||||
|
contentContainer.Delay(timeUntilRun).Expire();
|
||||||
|
contentContainer = null;
|
||||||
|
activeOverlay = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
private void updateColourScheme(OverlayColourScheme colourScheme)
|
private void updateColourScheme(OverlayColourScheme colourScheme)
|
||||||
|
Loading…
Reference in New Issue
Block a user