diff --git a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditor.cs b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditor.cs
index a999a9b4fc..35ba363f4b 100644
--- a/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditor.cs
+++ b/osu.Game.Tests/Visual/Gameplay/TestSceneSkinEditor.cs
@@ -83,6 +83,14 @@ namespace osu.Game.Tests.Visual.Gameplay
});
});
+ // This step is specifically added to reproduce an edge case which was found during cyclic selection development.
+ // If everything is working as expected it should not affect the subsequent drag selections.
+ AddRepeatStep("Select top left", () =>
+ {
+ InputManager.MoveMouseTo(box1.ScreenSpaceDrawQuad.TopLeft + new Vector2(box1.ScreenSpaceDrawQuad.Width / 8));
+ InputManager.Click(MouseButton.Left);
+ }, 2);
+
AddStep("Begin drag top left", () =>
{
InputManager.MoveMouseTo(box1.ScreenSpaceDrawQuad.TopLeft - new Vector2(box1.ScreenSpaceDrawQuad.Width / 4));
@@ -91,7 +99,7 @@ namespace osu.Game.Tests.Visual.Gameplay
AddStep("Drag to bottom right", () =>
{
- InputManager.MoveMouseTo(box2.ScreenSpaceDrawQuad.Centre + new Vector2(box2.ScreenSpaceDrawQuad.Width / 4));
+ InputManager.MoveMouseTo(box3.ScreenSpaceDrawQuad.TopRight + new Vector2(-box3.ScreenSpaceDrawQuad.Width / 8, box3.ScreenSpaceDrawQuad.Height / 4));
});
AddStep("Release button", () =>
diff --git a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
index 3ba71cebe6..143f343c7d 100644
--- a/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/BlueprintContainer.cs
@@ -178,6 +178,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
endClickSelection(e);
clickSelectionHandled = false;
isDraggingBlueprint = false;
+ wasDragStarted = false;
});
finishSelectionMovement();
@@ -191,6 +192,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
return false;
lastDragEvent = e;
+ wasDragStarted = true;
if (movementBlueprints != null)
{
@@ -399,7 +401,7 @@ namespace osu.Game.Screens.Edit.Compose.Components
return false;
}
- if (selectedBlueprintAlreadySelectedOnMouseDown && AllowCyclicSelection)
+ if (!wasDragStarted && selectedBlueprintAlreadySelectedOnMouseDown && AllowCyclicSelection)
{
// If a click occurred and was handled by the currently selected blueprint but didn't result in a drag,
// cycle between other blueprints which are also under the cursor.
@@ -485,6 +487,11 @@ namespace osu.Game.Screens.Edit.Compose.Components
///
private bool isDraggingBlueprint;
+ ///
+ /// Whether a drag operation was started at all.
+ ///
+ private bool wasDragStarted;
+
///
/// Attempts to begin the movement of any selected blueprints.
///