From 8c244134d536339a19556c30abe2f6fe307f8846 Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 27 Mar 2025 19:05:11 +0900 Subject: [PATCH 1/2] Add failing test --- .../TestSceneModSelectOverlay.cs | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) 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) From dcb5389ab750956e773727ffdd76caf463cbaecd Mon Sep 17 00:00:00 2001 From: Dan Balasescu Date: Thu, 27 Mar 2025 19:05:26 +0900 Subject: [PATCH 2/2] Refresh mod panel active states when recreated --- osu.Game/Overlays/Mods/ModSelectOverlay.cs | 3 +++ 1 file changed, 3 insertions(+) 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; }