diff --git a/osu.Game/Overlays/Mods/ModSection.cs b/osu.Game/Overlays/Mods/ModSection.cs
index 0107f94dcf..86da179064 100644
--- a/osu.Game/Overlays/Mods/ModSection.cs
+++ b/osu.Game/Overlays/Mods/ModSection.cs
@@ -127,18 +127,28 @@ namespace osu.Game.Overlays.Mods
}
///
- /// Select one or more mods in this section and deselects all other ones.
+ /// Updates all buttons with the given list of selected mods.
///
- /// The types of s which should be selected.
- public void SelectTypes(IEnumerable modTypes)
+ /// The types of s to select.
+ public void UpdateSelectedMods(IReadOnlyList newSelectedMods)
{
foreach (var button in buttons)
{
- int i = Array.FindIndex(button.Mods, m => modTypes.Any(t => t == m.GetType()));
+ int index = -1;
- if (i >= 0)
- button.SelectAt(i);
- else
+ foreach (var mod in newSelectedMods)
+ {
+ index = Array.FindIndex(button.Mods, m1 => mod.GetType() == m1.GetType());
+ if (index < 0)
+ continue;
+
+ var buttonMod = button.Mods[index];
+ buttonMod.CopyFrom(mod);
+ button.SelectAt(index);
+ break;
+ }
+
+ if (index < 0)
button.Deselect();
}
}
diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
index 34f5c70adb..c1622548f5 100644
--- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs
+++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs
@@ -409,7 +409,7 @@ namespace osu.Game.Overlays.Mods
private void selectedModsChanged(ValueChangedEvent> mods)
{
foreach (var section in ModSectionsContainer.Children)
- section.SelectTypes(mods.NewValue.Select(m => m.GetType()).ToList());
+ section.UpdateSelectedMods(mods.NewValue);
updateMods();
}