From 8646d5d1e081d850482766f60dd471734663c214 Mon Sep 17 00:00:00 2001 From: Dean Herbert Date: Wed, 13 Dec 2017 21:47:42 +0900 Subject: [PATCH] Add testing and fix filtering only some difficulties --- .../Visual/TestCaseBeatmapCarousel.cs | 12 ++++++++++- osu.Game/Screens/Select/BeatmapCarousel.cs | 21 ++++++++++++++++--- 2 files changed, 29 insertions(+), 4 deletions(-) diff --git a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs index e77337d488..f034dc7baf 100644 --- a/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs +++ b/osu.Game.Tests/Visual/TestCaseBeatmapCarousel.cs @@ -79,6 +79,8 @@ namespace osu.Game.Tests.Visual AddUntilStep(() => carousel.Beatmaps.Any(), "Wait for load"); + // test traversal + advanceSelection(direction: 1, diff: false); checkSelected(1, 1); @@ -98,6 +100,8 @@ namespace osu.Game.Tests.Visual advanceSelection(direction: -1, diff: true); checkSelected(4, 3); + // test basic filtering + AddStep("Filter", () => carousel.Filter(new FilterCriteria { SearchText = "set #3" }, false)); checkVisibleItemCount(diff: false, count: 1); checkVisibleItemCount(diff: true, count: 3); @@ -111,7 +115,13 @@ namespace osu.Game.Tests.Visual checkVisibleItemCount(diff: false, count: 4); checkVisibleItemCount(diff: true, count: 3); - setSelected(1, diff: 2); + // test filtering some difficulties (and keeping current beatmap set selected). + + setSelected(1, 2); + AddStep("Filter some difficulties", () => carousel.Filter(new FilterCriteria { SearchText = "Normal" }, false)); + checkSelected(1, 1); + AddStep("Un-filter", () => carousel.Filter(new FilterCriteria(), false)); + checkSelected(1, 1); } private BeatmapSetInfo createTestBeatmapSet(int i) diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 9f210e023b..5e3efb55c9 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -94,6 +94,7 @@ namespace osu.Game.Screens.Select private readonly Stack randomSelectedBeatmaps = new Stack(); private CarouselBeatmap selectedBeatmap; + private CarouselBeatmapSet selectedBeatmapSet => carouselSets.FirstOrDefault(s => s.State == CarouselItemState.Selected); public BeatmapCarousel() { @@ -291,14 +292,28 @@ namespace osu.Game.Screens.Select { FilterTask = null; + var lastSet = selectedBeatmapSet; + var lastBeatmap = selectedBeatmap; + carouselSets.ForEach(s => s.Filter(criteria)); yPositionsCache.Invalidate(); - if (selectedBeatmap?.Visible != true) - SelectNext(); - else + if (selectedBeatmap?.Filtered == false) select(selectedBeatmap); + else if (lastBeatmap != null && !lastSet.Filtered) + { + var searchable = lastSet.Beatmaps.AsEnumerable(); + + // search forwards first then backwards if nothing found. + var nextAvailable = + searchable.SkipWhile(b => b != lastBeatmap).FirstOrDefault(b => !b.Filtered) ?? + searchable.Reverse().SkipWhile(b => b != lastBeatmap).FirstOrDefault(b => !b.Filtered); + + select(nextAvailable); + } + else + SelectNext(); }; FilterTask?.Cancel();