mirror of https://github.com/ppy/osu
Schedule outside of `UnloadStoryboard` and fix disposal happening on update thread
This commit is contained in:
parent
59998b507a
commit
080f13e34d
|
@ -71,7 +71,7 @@ public void LoadStoryboard()
|
||||||
}, (loadCancellationSource = new CancellationTokenSource()).Token);
|
}, (loadCancellationSource = new CancellationTokenSource()).Token);
|
||||||
}
|
}
|
||||||
|
|
||||||
public void UnloadStoryboard(Action<Action> scheduleStoryboardRemoval)
|
public void UnloadStoryboard()
|
||||||
{
|
{
|
||||||
if (drawableStoryboard == null)
|
if (drawableStoryboard == null)
|
||||||
return;
|
return;
|
||||||
|
@ -79,15 +79,12 @@ public void UnloadStoryboard(Action<Action> scheduleStoryboardRemoval)
|
||||||
loadCancellationSource.AsNonNull().Cancel();
|
loadCancellationSource.AsNonNull().Cancel();
|
||||||
loadCancellationSource = null;
|
loadCancellationSource = null;
|
||||||
|
|
||||||
DrawableStoryboard s = drawableStoryboard;
|
// clear is intentionally used here for the storyboard to be disposed asynchronously.
|
||||||
|
storyboardContainer.Clear();
|
||||||
scheduleStoryboardRemoval(() =>
|
|
||||||
{
|
|
||||||
s.RemoveAndDisposeImmediately();
|
|
||||||
Sprite.Alpha = 1f;
|
|
||||||
});
|
|
||||||
|
|
||||||
drawableStoryboard = null;
|
drawableStoryboard = null;
|
||||||
|
|
||||||
|
Sprite.Alpha = 1f;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected override void LoadComplete()
|
protected override void LoadComplete()
|
||||||
|
|
|
@ -35,6 +35,6 @@ public bool Push(BackgroundScreen? screen)
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal void ScheduleToTransitionEnd(Action action) => Scheduler.AddDelayed(action, BackgroundScreen.TRANSITION_LENGTH);
|
internal ScheduledDelegate ScheduleUntilTransitionEnd(Action action) => Scheduler.AddDelayed(action, BackgroundScreen.TRANSITION_LENGTH);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -73,13 +73,15 @@ protected override void LoadComplete()
|
||||||
void next() => Next();
|
void next() => Next();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private ScheduledDelegate storyboardUnloadDelegate;
|
||||||
|
|
||||||
public override void OnSuspending(ScreenTransitionEvent e)
|
public override void OnSuspending(ScreenTransitionEvent e)
|
||||||
{
|
{
|
||||||
var backgroundScreenStack = Parent as BackgroundScreenStack;
|
var backgroundScreenStack = Parent as BackgroundScreenStack;
|
||||||
Debug.Assert(backgroundScreenStack != null);
|
Debug.Assert(backgroundScreenStack != null);
|
||||||
|
|
||||||
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
|
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
|
||||||
storyboardBackground.UnloadStoryboard(backgroundScreenStack.ScheduleToTransitionEnd);
|
storyboardUnloadDelegate = backgroundScreenStack.ScheduleUntilTransitionEnd(storyboardBackground.UnloadStoryboard);
|
||||||
|
|
||||||
base.OnSuspending(e);
|
base.OnSuspending(e);
|
||||||
}
|
}
|
||||||
|
@ -87,8 +89,15 @@ public override void OnSuspending(ScreenTransitionEvent e)
|
||||||
public override void OnResuming(ScreenTransitionEvent e)
|
public override void OnResuming(ScreenTransitionEvent e)
|
||||||
{
|
{
|
||||||
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
|
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
|
||||||
|
{
|
||||||
|
if (storyboardUnloadDelegate?.Completed == false)
|
||||||
|
storyboardUnloadDelegate.Cancel();
|
||||||
|
else
|
||||||
storyboardBackground.LoadStoryboard();
|
storyboardBackground.LoadStoryboard();
|
||||||
|
|
||||||
|
storyboardUnloadDelegate = null;
|
||||||
|
}
|
||||||
|
|
||||||
base.OnResuming(e);
|
base.OnResuming(e);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue