mirror of
https://github.com/ppy/osu.git
synced 2024-12-16 15:42:54 +08:00
Merge pull request #29916 from peppy/fix-song-select-crash-selection-after-loading
Fix occasional song select crash when entering gameplay
This commit is contained in:
commit
cf9f8c7f66
@ -144,6 +144,28 @@ namespace osu.Game.Tests.Visual.Navigation
|
|||||||
exitViaEscapeAndConfirm();
|
exitViaEscapeAndConfirm();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
[Test]
|
||||||
|
public void TestEnterGameplayWhileFilteringToNoSelection()
|
||||||
|
{
|
||||||
|
TestPlaySongSelect songSelect = null;
|
||||||
|
|
||||||
|
PushAndConfirm(() => songSelect = new TestPlaySongSelect());
|
||||||
|
AddUntilStep("wait for song select", () => songSelect.BeatmapSetsLoaded);
|
||||||
|
AddStep("import beatmap", () => BeatmapImportHelper.LoadQuickOszIntoOsu(Game).WaitSafely());
|
||||||
|
AddUntilStep("wait for selected", () => !Game.Beatmap.IsDefault);
|
||||||
|
|
||||||
|
AddStep("force selection", () =>
|
||||||
|
{
|
||||||
|
songSelect.FinaliseSelection();
|
||||||
|
songSelect.FilterControl.CurrentTextSearch.Value = "test";
|
||||||
|
});
|
||||||
|
|
||||||
|
AddUntilStep("wait for player", () => !songSelect.IsCurrentScreen());
|
||||||
|
AddStep("return to song select", () => songSelect.MakeCurrent());
|
||||||
|
|
||||||
|
AddUntilStep("wait for selection lost", () => songSelect.Beatmap.IsDefault);
|
||||||
|
}
|
||||||
|
|
||||||
[Test]
|
[Test]
|
||||||
public void TestSongSelectBackActionHandling()
|
public void TestSongSelectBackActionHandling()
|
||||||
{
|
{
|
||||||
|
@ -706,7 +706,7 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
private bool beatmapsSplitOut;
|
private bool beatmapsSplitOut;
|
||||||
|
|
||||||
private void applyActiveCriteria(bool debounce, bool alwaysResetScrollPosition = true)
|
private void applyActiveCriteria(bool debounce)
|
||||||
{
|
{
|
||||||
PendingFilter?.Cancel();
|
PendingFilter?.Cancel();
|
||||||
PendingFilter = null;
|
PendingFilter = null;
|
||||||
@ -735,7 +735,6 @@ namespace osu.Game.Screens.Select
|
|||||||
root.Filter(activeCriteria);
|
root.Filter(activeCriteria);
|
||||||
itemsCache.Invalidate();
|
itemsCache.Invalidate();
|
||||||
|
|
||||||
if (alwaysResetScrollPosition || !Scroll.UserScrolling)
|
|
||||||
ScrollToSelected(true);
|
ScrollToSelected(true);
|
||||||
|
|
||||||
FilterApplied?.Invoke();
|
FilterApplied?.Invoke();
|
||||||
@ -1036,7 +1035,7 @@ namespace osu.Game.Screens.Select
|
|||||||
itemsCache.Validate();
|
itemsCache.Validate();
|
||||||
|
|
||||||
// update and let external consumers know about selection loss.
|
// update and let external consumers know about selection loss.
|
||||||
if (BeatmapSetsLoaded)
|
if (BeatmapSetsLoaded && AllowSelection)
|
||||||
{
|
{
|
||||||
bool selectionLost = selectedBeatmapSet != null && selectedBeatmapSet.State.Value != CarouselItemState.Selected;
|
bool selectionLost = selectedBeatmapSet != null && selectedBeatmapSet.State.Value != CarouselItemState.Selected;
|
||||||
|
|
||||||
|
@ -127,6 +127,8 @@ namespace osu.Game.Screens.Select
|
|||||||
private Sample sampleChangeDifficulty = null!;
|
private Sample sampleChangeDifficulty = null!;
|
||||||
private Sample sampleChangeBeatmap = null!;
|
private Sample sampleChangeBeatmap = null!;
|
||||||
|
|
||||||
|
private bool pendingFilterApplication;
|
||||||
|
|
||||||
private Container carouselContainer = null!;
|
private Container carouselContainer = null!;
|
||||||
|
|
||||||
protected BeatmapDetailArea BeatmapDetails { get; private set; } = null!;
|
protected BeatmapDetailArea BeatmapDetails { get; private set; } = null!;
|
||||||
@ -328,7 +330,20 @@ namespace osu.Game.Screens.Select
|
|||||||
GetRecommendedBeatmap = s => recommender?.GetRecommendedBeatmap(s),
|
GetRecommendedBeatmap = s => recommender?.GetRecommendedBeatmap(s),
|
||||||
}, c => carouselContainer.Child = c);
|
}, c => carouselContainer.Child = c);
|
||||||
|
|
||||||
FilterControl.FilterChanged = Carousel.Filter;
|
FilterControl.FilterChanged = criteria =>
|
||||||
|
{
|
||||||
|
// If a filter operation is applied when we're in a state that doesn't allow selection,
|
||||||
|
// we might end up in an unexpected state. This is because currently carousel panels are in charge
|
||||||
|
// of updating the global selection (which is very hard to deal with).
|
||||||
|
//
|
||||||
|
// For now let's just avoid filtering when selection isn't allowed locally.
|
||||||
|
// This should be nuked from existence when we get around to fixing the complexity of song select <-> beatmap carousel.
|
||||||
|
// The debounce part of BeatmapCarousel's filtering should probably also be removed and handled locally.
|
||||||
|
if (Carousel.AllowSelection)
|
||||||
|
Carousel.Filter(criteria);
|
||||||
|
else
|
||||||
|
pendingFilterApplication = true;
|
||||||
|
};
|
||||||
|
|
||||||
if (ShowSongSelectFooter)
|
if (ShowSongSelectFooter)
|
||||||
{
|
{
|
||||||
@ -701,6 +716,12 @@ namespace osu.Game.Screens.Select
|
|||||||
|
|
||||||
Carousel.AllowSelection = true;
|
Carousel.AllowSelection = true;
|
||||||
|
|
||||||
|
if (pendingFilterApplication)
|
||||||
|
{
|
||||||
|
Carousel.Filter(FilterControl.CreateCriteria());
|
||||||
|
pendingFilterApplication = false;
|
||||||
|
}
|
||||||
|
|
||||||
BeatmapDetails.Refresh();
|
BeatmapDetails.Refresh();
|
||||||
|
|
||||||
beginLooping();
|
beginLooping();
|
||||||
|
Loading…
Reference in New Issue
Block a user