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:
parent
31ac083408
commit
fb2f1224b3
@ -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
|
||||
|
@ -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();
|
||||
|
Loading…
x
Reference in New Issue
Block a user