diff --git a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
index 79f457c050..5ab557804e 100644
--- a/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
+++ b/osu.Game/Screens/Edit/Compose/Components/ComposeBlueprintContainer.cs
@@ -10,6 +10,7 @@ using osu.Framework.Graphics;
using osu.Framework.Graphics.Containers;
using osu.Framework.Graphics.Sprites;
using osu.Framework.Input;
+using osu.Framework.Input.Events;
using osu.Game.Audio;
using osu.Game.Graphics.UserInterface;
using osu.Game.Rulesets.Edit;
@@ -19,6 +20,7 @@ using osu.Game.Rulesets.Objects.Drawables;
using osu.Game.Rulesets.Objects.Types;
using osu.Game.Screens.Edit.Components.TernaryButtons;
using osuTK;
+using osuTK.Input;
namespace osu.Game.Screens.Edit.Compose.Components
{
@@ -70,6 +72,50 @@ namespace osu.Game.Screens.Edit.Compose.Components
}
}
+ protected override bool OnKeyDown(KeyDownEvent e)
+ {
+ if (e.ControlPressed)
+ {
+ switch (e.Key)
+ {
+ case Key.Left:
+ moveSelection(new Vector2(-1, 0));
+ return true;
+
+ case Key.Right:
+ moveSelection(new Vector2(1, 0));
+ return true;
+
+ case Key.Up:
+ moveSelection(new Vector2(0, -1));
+ return true;
+
+ case Key.Down:
+ moveSelection(new Vector2(0, 1));
+ return true;
+ }
+ }
+
+ return false;
+ }
+
+ ///
+ /// Move the current selection spatially by the specified delta, in gamefield coordinates (ie. the same coordinates as the blueprints).
+ ///
+ ///
+ private void moveSelection(Vector2 delta)
+ {
+ var firstBlueprint = SelectionHandler.SelectedBlueprints.FirstOrDefault();
+
+ if (firstBlueprint == null)
+ return;
+
+ // convert to game space coordinates
+ delta = firstBlueprint.ToScreenSpace(delta) - firstBlueprint.ToScreenSpace(Vector2.Zero);
+
+ SelectionHandler.HandleMovement(new MoveSelectionEvent(firstBlueprint, firstBlueprint.ScreenSpaceSelectionPoint + delta));
+ }
+
private void updatePlacementNewCombo()
{
if (currentPlacement?.HitObject is IHasComboInformation c)