diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index 592e26adc2..5be4d24b2b 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -17,6 +17,7 @@ using osu.Framework.Caching;
using osu.Framework.Threading;
using osu.Framework.Extensions.IEnumerableExtensions;
using osu.Framework.Input.Events;
+using osu.Framework.Logging;
using osu.Game.Beatmaps;
using osu.Game.Graphics.Containers;
using osu.Game.Graphics.Cursor;
@@ -229,6 +230,17 @@ namespace osu.Game.Screens.Select
if (item != null)
{
select(item);
+
+ // if we got here and the set is filtered, it means we were bypassing filters.
+ // in this case, reapplying the filter is necessary to ensure the panel is in the correct place
+ // (since it is forcefully being included in the carousel).
+ if (set.Filtered.Value)
+ {
+ Debug.Assert(bypassFilters);
+
+ applyActiveCriteria(false, true);
+ }
+
return true;
}
}
diff --git a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
index 301d0d4dae..8e323c66e2 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselBeatmapSet.cs
@@ -62,7 +62,7 @@ namespace osu.Game.Screens.Select.Carousel
///
/// All beatmaps which are not filtered and valid for display.
///
- protected IEnumerable ValidBeatmaps => Beatmaps.Where(b => !b.Filtered.Value).Select(b => b.Beatmap);
+ protected IEnumerable ValidBeatmaps => Beatmaps.Where(b => !b.Filtered.Value || b.State.Value == CarouselItemState.Selected).Select(b => b.Beatmap);
private int compareUsingAggregateMax(CarouselBeatmapSet other, Func func)
{
diff --git a/osu.Game/Screens/Select/Carousel/CarouselItem.cs b/osu.Game/Screens/Select/Carousel/CarouselItem.cs
index 79c1a4cb6b..1108b72bd2 100644
--- a/osu.Game/Screens/Select/Carousel/CarouselItem.cs
+++ b/osu.Game/Screens/Select/Carousel/CarouselItem.cs
@@ -16,7 +16,7 @@ namespace osu.Game.Screens.Select.Carousel
///
/// This item is not in a hidden state.
///
- public bool Visible => State.Value != CarouselItemState.Collapsed && !Filtered.Value;
+ public bool Visible => State.Value == CarouselItemState.Selected || (State.Value != CarouselItemState.Collapsed && !Filtered.Value);
public virtual List Drawables
{
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index 5037081b5e..0da260d752 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -376,16 +376,22 @@ namespace osu.Game.Screens.Select
private void workingBeatmapChanged(ValueChangedEvent e)
{
- if (e.NewValue is DummyWorkingBeatmap) return;
+ if (e.NewValue is DummyWorkingBeatmap || !this.IsCurrentScreen()) return;
- if (this.IsCurrentScreen() && !Carousel.SelectBeatmap(e.NewValue?.BeatmapInfo, false))
+ if (!Carousel.SelectBeatmap(e.NewValue.BeatmapInfo, false))
{
- // If selecting new beatmap without bypassing filters failed, there's possibly a ruleset mismatch
- if (e.NewValue?.BeatmapInfo?.Ruleset != null && !e.NewValue.BeatmapInfo.Ruleset.Equals(decoupledRuleset.Value))
+ // A selection may not have been possible with filters applied.
+
+ // There was possibly a ruleset mismatch. This is a case we can help things along by updating the game-wide ruleset to match.
+ if (e.NewValue.BeatmapInfo.Ruleset != null && !e.NewValue.BeatmapInfo.Ruleset.Equals(decoupledRuleset.Value))
{
Ruleset.Value = e.NewValue.BeatmapInfo.Ruleset;
- Carousel.SelectBeatmap(e.NewValue.BeatmapInfo);
+ transferRulesetValue();
}
+
+ // Even if a ruleset mismatch was not the cause (ie. a text filter is applied),
+ // we still want to forcefully show the new beatmap, bypassing filters.
+ Carousel.SelectBeatmap(e.NewValue.BeatmapInfo);
}
}