diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs index 15f4d5cf96..f80b1dc9fd 100644 --- a/osu.Game/Screens/Select/BeatmapCarousel.cs +++ b/osu.Game/Screens/Select/BeatmapCarousel.cs @@ -66,7 +66,7 @@ namespace osu.Game.Screens.Select get { return beatmapSets.Select(g => g.BeatmapSet); } set { - CarouselGroup newRoot = new CarouselGroupEagerSelect(); + CarouselGroup newRoot = new CarouselGroupEagerSelect(true); Task.Run(() => { @@ -102,7 +102,7 @@ namespace osu.Game.Screens.Select private readonly Stack randomSelectedBeatmaps = new Stack(); protected List Items = new List(); - private CarouselGroup root = new CarouselGroupEagerSelect(); + private CarouselGroup root = new CarouselGroupEagerSelect(true); public BeatmapCarousel() { diff --git a/osu.Game/Screens/Select/Carousel/CarouselGroupEagerSelect.cs b/osu.Game/Screens/Select/Carousel/CarouselGroupEagerSelect.cs index 146bdf0009..eb75483e50 100644 --- a/osu.Game/Screens/Select/Carousel/CarouselGroupEagerSelect.cs +++ b/osu.Game/Screens/Select/Carousel/CarouselGroupEagerSelect.cs @@ -1,6 +1,7 @@ // Copyright (c) 2007-2018 ppy Pty Ltd . // Licensed under the MIT Licence - https://raw.githubusercontent.com/ppy/osu/master/LICENCE +using osu.Framework.MathUtils; using System; using System.Linq; @@ -11,8 +12,11 @@ namespace osu.Game.Screens.Select.Carousel /// public class CarouselGroupEagerSelect : CarouselGroup { - public CarouselGroupEagerSelect() + private readonly bool isRootSelector; + + public CarouselGroupEagerSelect(bool isRootSelector = false) { + this.isRootSelector = isRootSelector; State.ValueChanged += v => { if (v == CarouselItemState.Selected) @@ -83,9 +87,20 @@ namespace osu.Game.Screens.Select.Carousel // we only perform eager selection if none of our children are in a selected state already. if (Children.Any(i => i.State == CarouselItemState.Selected)) return; - CarouselItem nextToSelect = - Children.Skip(lastSelectedIndex).FirstOrDefault(i => !i.Filtered) ?? - Children.Reverse().Skip(InternalChildren.Count - lastSelectedIndex).FirstOrDefault(i => !i.Filtered); + CarouselItem nextToSelect = null; + if (isRootSelector && lastSelected == null) + { + var selectables = Children.Where(i => !i.Filtered).ToList(); + if (selectables.Any()) + nextToSelect = selectables[RNG.Next(selectables.Count)]; + } + else + { + nextToSelect = + Children.Skip(lastSelectedIndex).FirstOrDefault(i => !i.Filtered) ?? + Children.Reverse().Skip(InternalChildren.Count - lastSelectedIndex).FirstOrDefault(i => !i.Filtered); + } + if (nextToSelect != null) nextToSelect.State.Value = CarouselItemState.Selected;