diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 499b28fb49..017d246461 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -1003,6 +1003,35 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("search still not focused", () => !this.ChildrenOfType().Single().HasFocus); } + /// + /// Tests that recreating the mod panels (by setting the global available mods) also refreshes the active states. + /// + [Test] + public void TestActiveStatesRefreshedOnPanelsCreated() + { + createScreen(); + changeRuleset(0); + + Bindable> selectedMods = null!; + + AddStep("bind mods to local bindable", () => + { + selectedMods = new Bindable>([]); + + modSelectOverlay.SelectedMods.UnbindFrom(SelectedMods); + modSelectOverlay.SelectedMods.BindTo(selectedMods); + }); + + AddStep("activate PF", () => selectedMods.Value = [new OsuModPerfect()]); + AddAssert("OsuModPerfect panel active", () => getPanelForMod(typeof(OsuModPerfect)).Active.Value); + + changeRuleset(1); + AddAssert("TaikoModPerfect panel not active", () => !getPanelForMod(typeof(TaikoModPerfect)).Active.Value); + + changeRuleset(0); + AddAssert("OsuModPerfect panel active", () => getPanelForMod(typeof(OsuModPerfect)).Active.Value); + } + private void waitForColumnLoad() => AddUntilStep("all column content loaded", () => modSelectOverlay.ChildrenOfType().Any() && modSelectOverlay.ChildrenOfType().All(column => column.IsLoaded && column.ItemsLoaded) diff --git a/osu.Game/Overlays/Mods/ModSelectOverlay.cs b/osu.Game/Overlays/Mods/ModSelectOverlay.cs index ac589fbebf..d36092ebed 100644 --- a/osu.Game/Overlays/Mods/ModSelectOverlay.cs +++ b/osu.Game/Overlays/Mods/ModSelectOverlay.cs @@ -353,7 +353,10 @@ namespace osu.Game.Overlays.Mods .ToArray(); foreach (var modState in modStates) + { + modState.Active.Value = SelectedMods.Value.Any(selected => selected.GetType() == modState.Mod.GetType()); modState.Active.BindValueChanged(_ => updateFromInternalSelection()); + } newLocalAvailableMods[modType] = modStates; }