diff --git a/osu.Game.Tests/Visual/Editing/TestSceneBeatmapSubmissionOverlay.cs b/osu.Game.Tests/Visual/Editing/TestSceneBeatmapSubmissionOverlay.cs index f83d424d56..a47fb50c3c 100644 --- a/osu.Game.Tests/Visual/Editing/TestSceneBeatmapSubmissionOverlay.cs +++ b/osu.Game.Tests/Visual/Editing/TestSceneBeatmapSubmissionOverlay.cs @@ -1,45 +1,64 @@ // Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. // See the LICENCE file in the repository root for full licence text. -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; +using System; +using NUnit.Framework; +using osu.Framework.Allocation; using osu.Framework.Testing; +using osu.Game.Overlays; +using osu.Game.Screens; using osu.Game.Screens.Edit.Submission; -using osu.Game.Screens.Footer; namespace osu.Game.Tests.Visual.Editing { - public partial class TestSceneBeatmapSubmissionOverlay : OsuTestScene + public partial class TestSceneBeatmapSubmissionOverlay : ScreenTestScene { - private ScreenFooter footer = null!; + private TestBeatmapSubmissionOverlayScreen screen = null!; + + [Cached] + private readonly BeatmapSubmissionSettings beatmapSubmissionSettings = new BeatmapSubmissionSettings(); [SetUpSteps] - public void SetUpSteps() + public override void SetUpSteps() { - AddStep("add overlay", () => - { - var receptor = new ScreenFooter.BackReceptor(); - footer = new ScreenFooter(receptor); + base.SetUpSteps(); - Child = new DependencyProvidingContainer - { - RelativeSizeAxes = Axes.Both, - CachedDependencies = new[] - { - (typeof(ScreenFooter), (object)footer), - (typeof(BeatmapSubmissionSettings), new BeatmapSubmissionSettings()), - }, - Children = new Drawable[] - { - receptor, - new BeatmapSubmissionOverlay - { - State = { Value = Visibility.Visible, }, - }, - footer, - } - }; - }); + AddStep("push screen", () => LoadScreen(screen = new TestBeatmapSubmissionOverlayScreen())); + AddUntilStep("wait until screen is loaded", () => screen.IsLoaded, () => Is.True); + AddStep("show overlay", () => screen.Overlay.Show()); + } + + private partial class TestBeatmapSubmissionOverlayScreen : OsuScreen + { + public override bool ShowFooter => true; + + public BeatmapSubmissionOverlay Overlay = null!; + + private IDisposable? overlayRegistration; + + [Resolved] + private IOverlayManager? overlayManager { get; set; } + + [Cached] + private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue); + + [BackgroundDependencyLoader] + private void load() + { + LoadComponent(Overlay = new BeatmapSubmissionOverlay()); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + overlayRegistration = overlayManager?.RegisterBlockingOverlay(Overlay); + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + overlayRegistration?.Dispose(); + } } } } diff --git a/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs b/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs index fd589e928a..b749c34db3 100644 --- a/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/Multiplayer/TestSceneFreeModSelectOverlay.cs @@ -7,27 +7,30 @@ using System.Linq; using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Bindables; -using osu.Framework.Graphics; -using osu.Framework.Graphics.Containers; using osu.Framework.Graphics.Sprites; using osu.Framework.Input; using osu.Framework.Testing; +using osu.Game.Graphics; +using osu.Game.Overlays; using osu.Game.Overlays.Mods; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Mods; +using osu.Game.Screens; using osu.Game.Screens.Footer; using osu.Game.Screens.OnlinePlay; +using osu.Game.Screens.SelectV2; using osu.Game.Utils; using osuTK.Input; namespace osu.Game.Tests.Visual.Multiplayer { - public partial class TestSceneFreeModSelectOverlay : MultiplayerTestScene + public partial class TestSceneFreeModSelectOverlay : ScreenTestScene { - private FreeModSelectOverlay freeModSelectOverlay = null!; - private FooterButtonFreeMods footerButtonFreeMods = null!; - private ScreenFooter footer = null!; + private TestFreeModSelectOverlayScreen screen = null!; private readonly Bindable>> availableMods = new Bindable>>(); + private readonly Bindable> freeMods = new Bindable>([]); + + private FreeModSelectOverlay freeModSelectOverlay => screen.Overlay; [BackgroundDependencyLoader] private void load(OsuGameBase osuGameBase) @@ -35,6 +38,14 @@ namespace osu.Game.Tests.Visual.Multiplayer availableMods.BindTo(osuGameBase.AvailableMods); } + [SetUpSteps] + public override void SetUpSteps() + { + base.SetUpSteps(); + + AddStep("reset selected mods", () => freeMods.Value = []); + } + [Test] public void TestFreeModSelect() { @@ -44,11 +55,6 @@ namespace osu.Game.Tests.Visual.Multiplayer () => this.ChildrenOfType() .Where(panel => panel.IsPresent) .All(panel => panel.Mod.HasImplementation && panel.Mod.UserPlayable)); - - AddToggleStep("toggle visibility", visible => - { - freeModSelectOverlay.State.Value = visible ? Visibility.Visible : Visibility.Hidden; - }); } [Test] @@ -72,18 +78,16 @@ namespace osu.Game.Tests.Visual.Multiplayer AddAssert("select all button enabled", () => this.ChildrenOfType().Single().Enabled.Value); - AddStep("click select all button", navigateAndClick); + AddStep("click select all button", () => + { + InputManager.MoveMouseTo(this.ChildrenOfType().Single()); + InputManager.Click(MouseButton.Left); + }); AddAssert("select all button disabled", () => !this.ChildrenOfType().Single().Enabled.Value); AddStep("change search term", () => freeModSelectOverlay.SearchTerm = "e"); AddAssert("select all button enabled", () => this.ChildrenOfType().Single().Enabled.Value); - - void navigateAndClick() where T : Drawable - { - InputManager.MoveMouseTo(this.ChildrenOfType().Single()); - InputManager.Click(MouseButton.Left); - } } [Test] @@ -130,16 +134,24 @@ namespace osu.Game.Tests.Visual.Multiplayer createFreeModSelect(); AddAssert("overlay select all button enabled", () => this.ChildrenOfType().Single().Enabled.Value); - AddAssert("footer button displays off", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "off")); + AddUntilStep( + "footer button displays no mods", + () => screen.Button.ChildrenOfType().Single().IsPresent, + () => Is.False + ); AddStep("click footer select all button", () => { - InputManager.MoveMouseTo(footerButtonFreeMods); + InputManager.MoveMouseTo(ScreenFooter.ChildrenOfType().Single()); InputManager.Click(MouseButton.Left); }); AddUntilStep("all mods selected", assertAllAvailableModsSelected); - AddAssert("footer button displays all", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "all")); + AddUntilStep( + "footer button displays correct mod count", + () => screen.Button.ChildrenOfType().Single().ChildrenOfType().Single().Text.ToString(), + () => Is.EqualTo($"{freeMods.Value.Count} MODS") + ); AddStep("click deselect all button", () => { @@ -147,32 +159,21 @@ namespace osu.Game.Tests.Visual.Multiplayer InputManager.Click(MouseButton.Left); }); AddUntilStep("all mods deselected", () => !freeModSelectOverlay.SelectedMods.Value.Any()); - AddAssert("footer button displays off", () => footerButtonFreeMods.ChildrenOfType().Any(t => t.Text == "off")); + AddUntilStep( + "footer button displays no mods", + () => screen.Button.ChildrenOfType().Single().IsPresent, + () => Is.False + ); } private void createFreeModSelect() { - AddStep("create free mod select screen", () => Child = new DependencyProvidingContainer + AddStep("create free mod select screen", () => LoadScreen(screen = new TestFreeModSelectOverlayScreen { - RelativeSizeAxes = Axes.Both, - Children = new Drawable[] - { - freeModSelectOverlay = new FreeModSelectOverlay - { - State = { Value = Visibility.Visible } - }, - footerButtonFreeMods = new FooterButtonFreeMods(freeModSelectOverlay) - { - Anchor = Anchor.BottomRight, - Origin = Anchor.BottomRight, - Y = -ScreenFooter.HEIGHT, - FreeMods = { BindTarget = freeModSelectOverlay.SelectedMods }, - }, - footer = new ScreenFooter(), - }, - CachedDependencies = new (Type, object)[] { (typeof(ScreenFooter), footer) }, - }); - + FreeMods = { BindTarget = freeMods }, + })); + AddUntilStep("wait until screen is loaded", () => screen.IsLoaded, () => Is.True); + AddStep("show overlay", () => freeModSelectOverlay.Show()); AddUntilStep("all column content loaded", () => freeModSelectOverlay.ChildrenOfType().Any() && freeModSelectOverlay.ChildrenOfType().All(column => column.IsLoaded && column.ItemsLoaded)); @@ -197,5 +198,52 @@ namespace osu.Game.Tests.Visual.Multiplayer return true; } + + private partial class TestFreeModSelectOverlayScreen : OsuScreen + { + public override bool ShowFooter => true; + + public FreeModSelectOverlay Overlay = null!; + private IDisposable? overlayRegistration; + + public FooterButtonFreeModsV2 Button = null!; + + public readonly Bindable> FreeMods = new Bindable>([]); + + [Resolved] + private IOverlayManager? overlayManager { get; set; } + + [Cached] + private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue); + + [BackgroundDependencyLoader] + private void load() + { + LoadComponent(Overlay = new FreeModSelectOverlay + { + SelectedMods = { BindTarget = FreeMods } + }); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + overlayRegistration = overlayManager?.RegisterBlockingOverlay(Overlay); + } + + public override IReadOnlyList CreateFooterButtons() => + [ + Button = new FooterButtonFreeModsV2(Overlay) + { + FreeMods = { BindTarget = FreeMods }, + }, + ]; + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + overlayRegistration?.Dispose(); + } + } } } diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs index dc51e5516a..c0e7a1761d 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneFirstRunSetupOverlay.cs @@ -12,7 +12,6 @@ using NUnit.Framework; using osu.Framework.Allocation; using osu.Framework.Bindables; using osu.Framework.Extensions.ObjectExtensions; -using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Screens; using osu.Framework.Testing; @@ -23,17 +22,16 @@ using osu.Game.Overlays; using osu.Game.Overlays.FirstRunSetup; using osu.Game.Overlays.Notifications; using osu.Game.Screens; -using osu.Game.Screens.Footer; using osu.Game.Tests.Beatmaps; using osuTK; using osuTK.Input; namespace osu.Game.Tests.Visual.UserInterface { - public partial class TestSceneFirstRunSetupOverlay : OsuManualInputManagerTestScene + public partial class TestSceneFirstRunSetupOverlay : ScreenTestScene { - private FirstRunSetupOverlay overlay; - private ScreenFooter footer; + private TestFirstRunSetupOverlayScreen screen = null!; + private FirstRunSetupOverlay overlay => screen.Overlay; private readonly Mock performer = new Mock(); @@ -53,8 +51,10 @@ namespace osu.Game.Tests.Visual.UserInterface } [SetUpSteps] - public void SetUpSteps() + public override void SetUpSteps() { + base.SetUpSteps(); + AddStep("setup dependencies", () => { performer.Reset(); @@ -67,16 +67,16 @@ namespace osu.Game.Tests.Visual.UserInterface .Callback((Notification n) => lastNotification = n); }); - createOverlay(); + AddStep("reset first run", () => LocalConfig.SetValue(OsuSetting.ShowFirstRunSetup, true)); - AddStep("show overlay", () => overlay.Show()); + createScreen(); } [Test] public void TestBasic() { AddAssert("overlay visible", () => overlay.State.Value == Visibility.Visible); - AddAssert("footer visible", () => footer.State.Value == Visibility.Visible); + AddAssert("footer visible", () => ScreenFooter.State.Value == Visibility.Visible); } [Test] @@ -92,7 +92,8 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("first run false", () => !LocalConfig.Get(OsuSetting.ShowFirstRunSetup)); - createOverlay(); + AddStep("exit screen", () => Stack.Exit()); + createScreen(); AddWaitStep("wait some", 5); @@ -146,7 +147,7 @@ namespace osu.Game.Tests.Visual.UserInterface if (keyboard) InputManager.Key(Key.Escape); else - footer.BackButton.TriggerClick(); + ScreenFooter.BackButton.TriggerClick(); } return overlay.CurrentScreen is ScreenWelcome; @@ -161,7 +162,7 @@ namespace osu.Game.Tests.Visual.UserInterface } else { - AddStep("press back button", () => footer.BackButton.TriggerClick()); + AddStep("press back button", () => ScreenFooter.BackButton.TriggerClick()); AddAssert("overlay dismissed", () => overlay.State.Value == Visibility.Hidden); } } @@ -204,25 +205,45 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("is resumed", () => overlay.CurrentScreen is ScreenUIScale); } - private void createOverlay() + private void createScreen() { - AddStep("add overlay", () => - { - var receptor = new ScreenFooter.BackReceptor(); - footer = new ScreenFooter(receptor); + AddStep("push screen", () => LoadScreen(screen = new TestFirstRunSetupOverlayScreen())); + AddUntilStep("wait until screen is loaded", () => screen.IsLoaded, () => Is.True); + } - Child = new DependencyProvidingContainer - { - RelativeSizeAxes = Axes.Both, - CachedDependencies = new[] { (typeof(ScreenFooter), (object)footer) }, - Children = new Drawable[] - { - receptor, - overlay = new FirstRunSetupOverlay(), - footer, - } - }; - }); + private partial class TestFirstRunSetupOverlayScreen : OsuScreen + { + public override bool ShowFooter => true; + + public FirstRunSetupOverlay Overlay = null!; + + [CanBeNull] + private IDisposable overlayRegistration; + + [CanBeNull] + [Resolved] + private IOverlayManager overlayManager { get; set; } + + [Cached] + private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue); + + [BackgroundDependencyLoader] + private void load() + { + LoadComponent(Overlay = new FirstRunSetupOverlay()); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + overlayRegistration = overlayManager?.RegisterBlockingOverlay(Overlay); + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + overlayRegistration?.Dispose(); + } } // interface mocks break hot reload, mocking this stub implementation instead works around it. diff --git a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs index 6127be481c..d0778172d9 100644 --- a/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs +++ b/osu.Game.Tests/Visual/UserInterface/TestSceneModSelectOverlay.cs @@ -12,6 +12,7 @@ using osu.Framework.Graphics; using osu.Framework.Graphics.Containers; using osu.Framework.Input; using osu.Framework.Localisation; +using osu.Framework.Screens; using osu.Framework.Testing; using osu.Framework.Utils; using osu.Game.Configuration; @@ -25,6 +26,7 @@ using osu.Game.Rulesets.Mods; using osu.Game.Rulesets.Osu; using osu.Game.Rulesets.Osu.Mods; using osu.Game.Rulesets.Taiko.Mods; +using osu.Game.Screens; using osu.Game.Screens.Footer; using osu.Game.Tests.Mods; using osuTK; @@ -33,17 +35,19 @@ using osuTK.Input; namespace osu.Game.Tests.Visual.UserInterface { [TestFixture] - public partial class TestSceneModSelectOverlay : OsuManualInputManagerTestScene + public partial class TestSceneModSelectOverlay : ScreenTestScene { protected override bool UseFreshStoragePerRun => true; private RulesetStore rulesetStore = null!; - private TestModSelectOverlay modSelectOverlay = null!; + private TestModSelectOverlayScreen screen = null!; [Resolved] private OsuConfigManager configManager { get; set; } = null!; + private ModSelectOverlay modSelectOverlay => screen.Overlay; + [BackgroundDependencyLoader] private void load() { @@ -52,9 +56,10 @@ namespace osu.Game.Tests.Visual.UserInterface } [SetUpSteps] - public void SetUpSteps() + public override void SetUpSteps() { - AddStep("clear contents", Clear); + base.SetUpSteps(); + AddStep("reset ruleset", () => Ruleset.Value = rulesetStore.GetRuleset(0)); AddStep("reset mods", () => SelectedMods.SetDefault()); AddStep("reset config", () => configManager.SetValue(OsuSetting.ModSelectTextSearchStartsActive, true)); @@ -97,29 +102,8 @@ namespace osu.Game.Tests.Visual.UserInterface private void createScreen() { - AddStep("create screen", () => - { - var receptor = new ScreenFooter.BackReceptor(); - var footer = new ScreenFooter(receptor); - - Child = new DependencyProvidingContainer - { - RelativeSizeAxes = Axes.Both, - CachedDependencies = new[] { (typeof(ScreenFooter), (object)footer) }, - Children = new Drawable[] - { - receptor, - modSelectOverlay = new TestModSelectOverlay - { - RelativeSizeAxes = Axes.Both, - State = { Value = Visibility.Visible }, - Beatmap = { Value = Beatmap.Value }, - SelectedMods = { BindTarget = SelectedMods }, - }, - footer, - } - }; - }); + AddStep("create screen", () => LoadScreen(screen = new TestModSelectOverlayScreen { SelectedMods = { BindTarget = SelectedMods } })); + AddUntilStep("wait until screen is loaded", () => screen.IsLoaded, () => Is.True); waitForColumnLoad(); } @@ -306,29 +290,30 @@ namespace osu.Game.Tests.Visual.UserInterface [Test] public void TestSettingsNotCrossPolluting() { + TestScreenWithTwoOverlays screenWithTwoOverlays = null!; Bindable> selectedMods2 = null!; - ModSelectOverlay modSelectOverlay2 = null!; - createScreen(); + AddStep("push screen", () => + { + selectedMods2 = new Bindable>(new Mod[] { new OsuModDifficultyAdjust() }); + + LoadScreen(screen = screenWithTwoOverlays = new TestScreenWithTwoOverlays + { + SelectedMods = { BindTarget = SelectedMods }, + SelectedMods2 = { BindTarget = selectedMods2 }, + }); + }); + AddStep("wait until screen is loaded", () => screenWithTwoOverlays.IsCurrentScreen()); + waitForColumnLoad(); + AddStep("select difficulty adjust via panel", () => getPanelForMod(typeof(OsuModDifficultyAdjust)).TriggerClick()); - AddStep("set setting", () => modSelectOverlay.ChildrenOfType>().First().Current.Value = 8); + AddStep("set setting", () => screenWithTwoOverlays.Overlay.ChildrenOfType>().First().Current.Value = 8); AddAssert("ensure setting is propagated", () => SelectedMods.Value.OfType().Single().CircleSize.Value == 8); - AddStep("create second bindable", () => selectedMods2 = new Bindable>(new Mod[] { new OsuModDifficultyAdjust() })); - - AddStep("create second overlay", () => - { - Add(modSelectOverlay2 = new UserModSelectOverlay().With(d => - { - d.Origin = Anchor.TopCentre; - d.Anchor = Anchor.TopCentre; - d.SelectedMods.BindTarget = selectedMods2; - })); - }); - - AddStep("show", () => modSelectOverlay2.Show()); + AddStep("hide first overlay", () => screenWithTwoOverlays.Overlay.Hide()); + AddStep("show second overlay", () => screenWithTwoOverlays.SecondOverlay.Show()); AddAssert("ensure first is unchanged", () => SelectedMods.Value.OfType().Single().CircleSize.Value == 8); AddAssert("ensure second is default", () => selectedMods2.Value.OfType().Single().CircleSize.Value == null); @@ -481,6 +466,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddStep("set customized mod externally", () => SelectedMods.Value = new[] { new OsuModDoubleTime { SpeedChange = { Value = 1.01 } } }); AddAssert("setting remains", () => (SelectedMods.Value.SingleOrDefault() as OsuModDoubleTime)?.SpeedChange.Value == 1.01); + AddStep("exit screen", () => Stack.Exit()); createScreen(); AddAssert("setting remains", () => (SelectedMods.Value.SingleOrDefault() as OsuModDoubleTime)?.SpeedChange.Value == 1.01); } @@ -797,16 +783,11 @@ namespace osu.Game.Tests.Visual.UserInterface [Test] public void TestColumnHidingOnIsValidChange() { - AddStep("create screen", () => Child = modSelectOverlay = new TestModSelectOverlay - { - RelativeSizeAxes = Axes.Both, - State = { Value = Visibility.Visible }, - SelectedMods = { BindTarget = SelectedMods }, - IsValidMod = mod => mod.Type == ModType.DifficultyIncrease || mod.Type == ModType.Conversion - }); - waitForColumnLoad(); + createScreen(); changeRuleset(0); + AddStep("set filter for 2 columns", () => modSelectOverlay.IsValidMod = mod => mod.Type is ModType.DifficultyIncrease or ModType.Conversion); + AddAssert("two columns visible", () => this.ChildrenOfType().Count(col => col.IsPresent) == 2); AddStep("unset filter", () => modSelectOverlay.IsValidMod = _ => true); @@ -816,9 +797,7 @@ namespace osu.Game.Tests.Visual.UserInterface AddAssert("no columns visible", () => this.ChildrenOfType().All(col => !col.IsPresent)); AddStep("hide", () => modSelectOverlay.Hide()); - AddStep("set filter for 3 columns", () => modSelectOverlay.IsValidMod = mod => mod.Type == ModType.DifficultyReduction - || mod.Type == ModType.Automation - || mod.Type == ModType.Conversion); + AddStep("set filter for 3 columns", () => modSelectOverlay.IsValidMod = mod => mod.Type is ModType.DifficultyReduction or ModType.Automation or ModType.Conversion); AddStep("show", () => modSelectOverlay.Show()); AddUntilStep("3 columns visible", () => this.ChildrenOfType().Count(col => col.IsPresent) == 3); @@ -830,13 +809,7 @@ namespace osu.Game.Tests.Visual.UserInterface [Test] public void TestColumnHidingOnTextFilterChange() { - AddStep("create screen", () => Child = modSelectOverlay = new TestModSelectOverlay - { - RelativeSizeAxes = Axes.Both, - State = { Value = Visibility.Visible }, - SelectedMods = { BindTarget = SelectedMods } - }); - waitForColumnLoad(); + createScreen(); changeRuleset(0); AddAssert("all columns visible", () => this.ChildrenOfType().All(col => col.IsPresent)); @@ -854,13 +827,7 @@ namespace osu.Game.Tests.Visual.UserInterface [Test] public void TestHidingOverlayClearsTextSearch() { - AddStep("create screen", () => Child = modSelectOverlay = new TestModSelectOverlay - { - RelativeSizeAxes = Axes.Both, - State = { Value = Visibility.Visible }, - SelectedMods = { BindTarget = SelectedMods } - }); - waitForColumnLoad(); + createScreen(); changeRuleset(0); AddAssert("all columns visible", () => this.ChildrenOfType().All(col => col.IsPresent)); @@ -1019,8 +986,8 @@ namespace osu.Game.Tests.Visual.UserInterface { selectedMods = new Bindable>([]); - modSelectOverlay.SelectedMods.UnbindFrom(SelectedMods); - modSelectOverlay.SelectedMods.BindTo(selectedMods); + screen.SelectedMods.UnbindFrom(SelectedMods); + screen.SelectedMods.BindTo(selectedMods); }); AddStep("activate PF", () => selectedMods.Value = [new OsuModPerfect()]); @@ -1066,11 +1033,79 @@ namespace osu.Game.Tests.Visual.UserInterface rulesetStore.Dispose(); } - private partial class TestModSelectOverlay : UserModSelectOverlay + private partial class TestModSelectOverlayScreen : OsuScreen { - public TestModSelectOverlay() + public readonly Bindable> SelectedMods = new Bindable>(); + + public override bool ShowFooter => true; + + public ModSelectOverlay Overlay = null!; + + private IDisposable? firstOverlayRegistration; + + [Cached] + private OverlayColourProvider colourProvider = new OverlayColourProvider(OverlayColourScheme.Blue); + + [Resolved] + protected IOverlayManager? OverlayManager { get; private set; } + + [BackgroundDependencyLoader] + private void load() { - ShowPresets = true; + LoadComponent(Overlay = new UserModSelectOverlay + { + RelativeSizeAxes = Axes.Both, + State = { Value = Visibility.Visible }, + Beatmap = { Value = Beatmap.Value }, + SelectedMods = { BindTarget = SelectedMods }, + ShowPresets = true, + }); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + firstOverlayRegistration = OverlayManager?.RegisterBlockingOverlay(Overlay); + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + firstOverlayRegistration?.Dispose(); + } + } + + private partial class TestScreenWithTwoOverlays : TestModSelectOverlayScreen + { + public readonly Bindable> SelectedMods2 = new Bindable>([]); + + public ModSelectOverlay SecondOverlay = null!; + + private IDisposable? secondOverlayRegistration; + + [BackgroundDependencyLoader] + private void load() + { + LoadComponent(SecondOverlay = new UserModSelectOverlay + { + Origin = Anchor.TopCentre, + Anchor = Anchor.TopCentre, + SelectedMods = { BindTarget = SelectedMods2 }, + }); + } + + protected override void LoadComplete() + { + base.LoadComplete(); + + secondOverlayRegistration = OverlayManager?.RegisterBlockingOverlay(SecondOverlay); + } + + protected override void Dispose(bool isDisposing) + { + base.Dispose(isDisposing); + secondOverlayRegistration?.Dispose(); } } diff --git a/osu.Game/Tests/Visual/ScreenTestScene.cs b/osu.Game/Tests/Visual/ScreenTestScene.cs index 7d28ee1d1d..e1775cf5a1 100644 --- a/osu.Game/Tests/Visual/ScreenTestScene.cs +++ b/osu.Game/Tests/Visual/ScreenTestScene.cs @@ -43,28 +43,29 @@ namespace osu.Game.Tests.Visual base.Content.AddRange(new Drawable[] { backReceptor = new ScreenFooter.BackReceptor(), - Stack = new OsuScreenStack - { - Name = nameof(ScreenTestScene), - RelativeSizeAxes = Axes.Both - }, new PopoverContainer { RelativeSizeAxes = Axes.Both, Children = new Drawable[] { + Stack = new OsuScreenStack + { + Name = nameof(ScreenTestScene), + RelativeSizeAxes = Axes.Both + }, + // TODO: is this ever used? it probably shouldn't be. content = new Container { RelativeSizeAxes = Axes.Both }, + overlayContent = new Container + { + RelativeSizeAxes = Axes.Both, + Child = DialogOverlay = new DialogOverlay() + }, screenStackFooter = new ScreenStackFooter(Stack, backReceptor) { BackButtonPressed = () => Stack.Exit() } } }, - overlayContent = new Container - { - RelativeSizeAxes = Axes.Both, - Child = DialogOverlay = new DialogOverlay() - }, }); ScreenFooter = screenStackFooter.Footer;