diff --git a/osu.Game/Screens/Select/BeatmapCarousel.cs b/osu.Game/Screens/Select/BeatmapCarousel.cs
index bfd1d3d236..7b9559f5b4 100644
--- a/osu.Game/Screens/Select/BeatmapCarousel.cs
+++ b/osu.Game/Screens/Select/BeatmapCarousel.cs
@@ -55,9 +55,9 @@ namespace osu.Game.Screens.Select
public override bool HandlePositionalInput => AllowSelection;
///
- /// Used to avoid firing null selections before the initial beatmaps have been loaded via .
+ /// Whether carousel items have completed asynchronously loaded.
///
- private bool initialLoadComplete;
+ public bool BeatmapSetsLoaded { get; private set; }
private IEnumerable beatmapSets => root.Children.OfType();
@@ -90,7 +90,7 @@ namespace osu.Game.Screens.Select
Schedule(() =>
{
BeatmapSetsChanged?.Invoke();
- initialLoadComplete = true;
+ BeatmapSetsLoaded = true;
});
}));
}
@@ -593,7 +593,7 @@ namespace osu.Game.Screens.Select
currentY += DrawHeight / 2;
scrollableContent.Height = currentY;
- if (initialLoadComplete && (selectedBeatmapSet == null || selectedBeatmap == null || selectedBeatmapSet.State.Value != CarouselItemState.Selected))
+ if (BeatmapSetsLoaded && (selectedBeatmapSet == null || selectedBeatmap == null || selectedBeatmapSet.State.Value != CarouselItemState.Selected))
{
selectedBeatmapSet = null;
SelectionChanged?.Invoke(null);
diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index a86d0beb39..8758df5151 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -300,6 +300,10 @@ namespace osu.Game.Screens.Select
/// Whether to trigger .
public void FinaliseSelection(BeatmapInfo beatmap = null, bool performStartAction = true)
{
+ // This is very important as we have not yet bound to screen-level bindables before the carousel load is completed.
+ if (!Carousel.BeatmapSetsLoaded)
+ return;
+
// 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.FlushPendingFilterOperations();
@@ -373,6 +377,13 @@ namespace osu.Game.Screens.Select
var beatmap = beatmapNoDebounce;
var ruleset = rulesetNoDebounce;
+ selectionChangedDebounce?.Cancel();
+
+ if (beatmap == null)
+ run();
+ else
+ selectionChangedDebounce = Scheduler.AddDelayed(run, 200);
+
void run()
{
Logger.Log($"updating selection with beatmap:{beatmap?.ID.ToString() ?? "null"} ruleset:{ruleset?.ID.ToString() ?? "null"}");
@@ -417,13 +428,6 @@ namespace osu.Game.Screens.Select
if (this.IsCurrentScreen()) ensurePlayingSelected(preview);
UpdateBeatmap(Beatmap.Value);
}
-
- selectionChangedDebounce?.Cancel();
-
- if (beatmap == null)
- run();
- else
- selectionChangedDebounce = Scheduler.AddDelayed(run, 200);
}
private void triggerRandom()
@@ -593,18 +597,7 @@ namespace osu.Game.Screens.Select
private void carouselBeatmapsLoaded()
{
- if (rulesetNoDebounce == null)
- {
- // manual binding to parent ruleset to allow for delayed load in the incoming direction.
- rulesetNoDebounce = decoupledRuleset.Value = Ruleset.Value;
- Ruleset.ValueChanged += r => updateSelectedRuleset(r.NewValue);
-
- decoupledRuleset.ValueChanged += r => Ruleset.Value = r.NewValue;
- decoupledRuleset.DisabledChanged += r => Ruleset.Disabled = r;
-
- Beatmap.BindDisabledChanged(disabled => Carousel.AllowSelection = !disabled, true);
- Beatmap.BindValueChanged(workingBeatmapChanged);
- }
+ bindBindables();
if (!Beatmap.IsDefault && Beatmap.Value.BeatmapSetInfo?.DeletePending == false && Beatmap.Value.BeatmapSetInfo?.Protected == false
&& Carousel.SelectBeatmap(Beatmap.Value.BeatmapInfo, false))
@@ -618,6 +611,26 @@ namespace osu.Game.Screens.Select
}
}
+ private bool boundLocalBindables;
+
+ private void bindBindables()
+ {
+ if (boundLocalBindables)
+ return;
+
+ // manual binding to parent ruleset to allow for delayed load in the incoming direction.
+ rulesetNoDebounce = decoupledRuleset.Value = Ruleset.Value;
+ Ruleset.ValueChanged += r => updateSelectedRuleset(r.NewValue);
+
+ decoupledRuleset.ValueChanged += r => Ruleset.Value = r.NewValue;
+ decoupledRuleset.DisabledChanged += r => Ruleset.Disabled = r;
+
+ Beatmap.BindDisabledChanged(disabled => Carousel.AllowSelection = !disabled, true);
+ Beatmap.BindValueChanged(workingBeatmapChanged);
+
+ boundLocalBindables = true;
+ }
+
private void delete(BeatmapSetInfo beatmap)
{
if (beatmap == null || beatmap.ID <= 0) return;