diff --git a/osu.Game/Screens/Select/SongSelect.cs b/osu.Game/Screens/Select/SongSelect.cs
index f8ceea2bf3..e2e6520ef1 100644
--- a/osu.Game/Screens/Select/SongSelect.cs
+++ b/osu.Game/Screens/Select/SongSelect.cs
@@ -138,7 +138,7 @@ protected SongSelect()
Size = new Vector2(carousel_width, 1),
Anchor = Anchor.CentreRight,
Origin = Anchor.CentreRight,
- SelectionChanged = b => updateSelectedBeatmap(b, null),
+ SelectionChanged = updateSelectedBeatmap,
BeatmapSetsChanged = carouselBeatmapsLoaded,
},
FilterControl = new FilterControl
@@ -282,13 +282,31 @@ private void workingBeatmapChanged(WorkingBeatmap beatmap)
private BeatmapInfo beatmapNoDebounce;
private RulesetInfo rulesetNoDebounce;
+ private void updateSelectedBeatmap(BeatmapInfo beatmap)
+ {
+ if (beatmap?.Equals(beatmapNoDebounce) == true)
+ return;
+
+ beatmapNoDebounce = beatmap;
+ performUpdateSelected();
+ }
+
+ private void updateSelectedRuleset(RulesetInfo ruleset)
+ {
+ if (ruleset?.Equals(rulesetNoDebounce) == true)
+ return;
+
+ rulesetNoDebounce = ruleset;
+ performUpdateSelected();
+ }
+
///
/// selection has been changed as the result of a user interaction.
///
- private void updateSelectedBeatmap(BeatmapInfo beatmap, RulesetInfo ruleset)
+ private void performUpdateSelected()
{
- if (ruleset == null) ruleset = rulesetNoDebounce;
- if (beatmap == null) beatmap = beatmapNoDebounce;
+ var beatmap = beatmapNoDebounce;
+ var ruleset = rulesetNoDebounce;
void performLoad()
{
@@ -296,7 +314,7 @@ void performLoad()
bool preview = false;
- if (ruleset?.Equals(Ruleset.Value) != true)
+ if (ruleset?.Equals(Ruleset.Value) == false)
{
Ruleset.Value = ruleset;
@@ -307,40 +325,33 @@ void performLoad()
// We may be arriving here due to another component changing the bindable Beatmap.
// In these cases, the other component has already loaded the beatmap, so we don't need to do so again.
- if (beatmap?.Equals(Beatmap.Value.BeatmapInfo) != true)
+ if (!Equals(beatmap, Beatmap.Value.BeatmapInfo))
{
preview = beatmap?.BeatmapSetInfoID != Beatmap.Value?.BeatmapInfo.BeatmapSetInfoID;
working = beatmaps.GetWorkingBeatmap(beatmap, Beatmap.Value);
+
+ if (beatmap != null)
+ {
+ if (beatmap.BeatmapSetInfoID == beatmapNoDebounce?.BeatmapSetInfoID)
+ sampleChangeDifficulty.Play();
+ else
+ sampleChangeBeatmap.Play();
+ }
}
working.Mods.Value = Enumerable.Empty();
-
Beatmap.Value = working;
ensurePlayingSelected(preview);
-
UpdateBeatmap(Beatmap.Value);
}
- if (beatmap?.Equals(beatmapNoDebounce) == true && ruleset?.Equals(rulesetNoDebounce) == true)
- return;
-
selectionChangedDebounce?.Cancel();
- beatmapNoDebounce = beatmap;
- rulesetNoDebounce = ruleset;
-
if (beatmap == null)
performLoad();
else
- {
- if (beatmap.BeatmapSetInfoID == beatmapNoDebounce?.BeatmapSetInfoID)
- sampleChangeDifficulty.Play();
- else
- sampleChangeBeatmap.Play();
-
selectionChangedDebounce = Scheduler.AddDelayed(performLoad, 200);
- }
}
private void triggerRandom()
@@ -487,13 +498,16 @@ private void ensurePlayingSelected(bool preview = false)
private void carouselBeatmapsLoaded()
{
- // manual binding to parent ruleset to allow for delayed load in the incoming direction.
- rulesetNoDebounce = Ruleset.Value = base.Ruleset.Value;
- base.Ruleset.ValueChanged += r => updateSelectedBeatmap(null, r);
- Ruleset.ValueChanged += r => base.Ruleset.Value = r;
+ if (rulesetNoDebounce == null)
+ {
+ // manual binding to parent ruleset to allow for delayed load in the incoming direction.
+ rulesetNoDebounce = Ruleset.Value = base.Ruleset.Value;
+ base.Ruleset.ValueChanged += updateSelectedRuleset;
+ Ruleset.ValueChanged += r => base.Ruleset.Value = r;
- Beatmap.BindDisabledChanged(disabled => Carousel.AllowSelection = !disabled, true);
- Beatmap.BindValueChanged(workingBeatmapChanged);
+ Beatmap.BindDisabledChanged(disabled => Carousel.AllowSelection = !disabled, true);
+ Beatmap.BindValueChanged(workingBeatmapChanged);
+ }
if (!Beatmap.IsDefault && Beatmap.Value.BeatmapSetInfo?.DeletePending == false && Beatmap.Value.BeatmapSetInfo?.Protected == false
&& Carousel.SelectBeatmap(Beatmap.Value.BeatmapInfo, false))
@@ -503,7 +517,7 @@ private void carouselBeatmapsLoaded()
{
// in the case random selection failed, we want to trigger selectionChanged
// to show the dummy beatmap (we have nothing else to display).
- updateSelectedBeatmap(null, null);
+ performUpdateSelected();
}
}