Schedule outside of `UnloadStoryboard` and fix disposal happening on update thread

This commit is contained in:
Salman Ahmed 2023-11-11 02:56:16 +03:00
parent 59998b507a
commit 080f13e34d
3 changed files with 17 additions and 11 deletions

View File

@ -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()

View File

@ -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);
} }
} }

View File

@ -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);
} }