diff --git a/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneContextMenuClose.cs b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneContextMenuClose.cs new file mode 100644 index 000000000000..c04297490193 --- /dev/null +++ b/osu.Game.Rulesets.Osu.Tests/Editor/TestSceneContextMenuClose.cs @@ -0,0 +1,39 @@ +// Copyright (c) ppy Pty Ltd . Licensed under the MIT Licence. +// See the LICENCE file in the repository root for full licence text. + +using System.Linq; +using NUnit.Framework; +using osu.Framework.Graphics.Cursor; +using osu.Framework.Graphics.UserInterface; +using osu.Framework.Testing; +using osu.Game.Graphics.UserInterface; +using osu.Game.Rulesets.UI; +using osuTK.Input; + +namespace osu.Game.Rulesets.Osu.Tests.Editor +{ + public partial class TestSceneContextMenuClose : TestSceneOsuEditor + { + private ContextMenuContainer contextMenuContainer + => Editor.ChildrenOfType().First(); + + [Test] + public void TestToolChangeClosesMenu() + { + Playfield playfield = null!; + + AddStep("select circle placement tool", () => InputManager.Key(Key.Number2)); + AddStep("move mouse to top left of playfield", () => + { + playfield = this.ChildrenOfType().Single(); + var location = (3 * playfield.ScreenSpaceDrawQuad.TopLeft + playfield.ScreenSpaceDrawQuad.BottomRight) / 4; + InputManager.MoveMouseTo(location); + }); + AddStep("place circle", () => InputManager.Click(MouseButton.Left)); + AddStep("right click circle", () => InputManager.Click(MouseButton.Right)); + AddUntilStep("context menu is visible", () => contextMenuContainer.ChildrenOfType().Single().State == MenuState.Open); + AddStep("select slider placement tool", () => InputManager.Key(Key.Number3)); + AddUntilStep("context menu is not visible", () => contextMenuContainer.ChildrenOfType().Single().State == MenuState.Closed); + } + } +} diff --git a/osu.Game/Rulesets/Edit/HitObjectComposer.cs b/osu.Game/Rulesets/Edit/HitObjectComposer.cs index 4b64548f9c73..57966c38bc4a 100644 --- a/osu.Game/Rulesets/Edit/HitObjectComposer.cs +++ b/osu.Game/Rulesets/Edit/HitObjectComposer.cs @@ -531,6 +531,9 @@ private void toolSelected(CompositionTool tool) if (!(tool is SelectTool)) EditorBeatmap.SelectedHitObjects.Clear(); + + // Prevent object context menu from staying open. + GetContainingFocusManager()?.ChangeFocus(null); } #endregion