1
0
mirror of https://github.com/ppy/osu.git synced 2025-03-17 22:17:25 +08:00

Fix carousel filter debounce causing a race condition

Clicking a ruleset button on toolbar would schedule a delayed filter of carousel, which could in turn trigger a beatmap change after pushing a Player. This resolves that by forcing any pending operations to complete.
This commit is contained in:
Dean Herbert 2017-07-21 05:58:58 +09:00
parent 31ac083408
commit fb2f1224b3
2 changed files with 12 additions and 5 deletions

View File

@ -232,6 +232,8 @@ namespace osu.Game.Screens.Select
public bool AllowSelection = true;
public bool PendingFilter => filterTask?.Completed == false;
public void Filter(FilterCriteria newCriteria = null, bool debounce = true)
{
if (newCriteria != null)
@ -263,6 +265,8 @@ namespace osu.Game.Screens.Select
};
filterTask?.Cancel();
filterTask = null;
if (debounce)
filterTask = Scheduler.AddDelayed(perform, 250);
else

View File

@ -198,13 +198,16 @@ namespace osu.Game.Screens.Select
private void carouselRaisedStart()
{
var pendingSelection = selectionChangedDebounce;
selectionChangedDebounce = null;
if (carousel.PendingFilter)
// if we have a pending filter operation, we want to run it now.
// it could change selection (ie. if the ruleset has been changed).
carousel.Filter(null, false);
if (pendingSelection?.Completed == false)
if (selectionChangedDebounce?.Completed == false)
{
pendingSelection.RunTask();
pendingSelection.Cancel(); // cancel the already scheduled task.
selectionChangedDebounce.RunTask();
selectionChangedDebounce.Cancel(); // cancel the already scheduled task.
selectionChangedDebounce = null;
}
OnSelected();