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);
}
public void UnloadStoryboard(Action<Action> scheduleStoryboardRemoval)
public void UnloadStoryboard()
{
if (drawableStoryboard == null)
return;
@ -79,15 +79,12 @@ public void UnloadStoryboard(Action<Action> scheduleStoryboardRemoval)
loadCancellationSource.AsNonNull().Cancel();
loadCancellationSource = null;
DrawableStoryboard s = drawableStoryboard;
scheduleStoryboardRemoval(() =>
{
s.RemoveAndDisposeImmediately();
Sprite.Alpha = 1f;
});
// clear is intentionally used here for the storyboard to be disposed asynchronously.
storyboardContainer.Clear();
drawableStoryboard = null;
Sprite.Alpha = 1f;
}
protected override void LoadComplete()

View File

@ -35,6 +35,6 @@ public bool Push(BackgroundScreen? screen)
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();
}
private ScheduledDelegate storyboardUnloadDelegate;
public override void OnSuspending(ScreenTransitionEvent e)
{
var backgroundScreenStack = Parent as BackgroundScreenStack;
Debug.Assert(backgroundScreenStack != null);
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
storyboardBackground.UnloadStoryboard(backgroundScreenStack.ScheduleToTransitionEnd);
storyboardUnloadDelegate = backgroundScreenStack.ScheduleUntilTransitionEnd(storyboardBackground.UnloadStoryboard);
base.OnSuspending(e);
}
@ -87,7 +89,14 @@ public override void OnSuspending(ScreenTransitionEvent e)
public override void OnResuming(ScreenTransitionEvent e)
{
if (background is BeatmapBackgroundWithStoryboard storyboardBackground)
storyboardBackground.LoadStoryboard();
{
if (storyboardUnloadDelegate?.Completed == false)
storyboardUnloadDelegate.Cancel();
else
storyboardBackground.LoadStoryboard();
storyboardUnloadDelegate = null;
}
base.OnResuming(e);
}