From 41d6e0f647bc4eae9d0c29856f014da930db2f96 Mon Sep 17 00:00:00 2001 From: jlewin Date: Fri, 7 Jun 2019 13:54:11 -0700 Subject: [PATCH] Add keyboard support for nudging selected scene items - Issue MatterHackers/MCCentral#5655 [Feature Request] Move objects with keyboard --- .../ApplicationView/ApplicationController.cs | 79 +++++++++++++++++-- 1 file changed, 73 insertions(+), 6 deletions(-) diff --git a/MatterControlLib/ApplicationView/ApplicationController.cs b/MatterControlLib/ApplicationView/ApplicationController.cs index 897a97e6c..82593c0c2 100644 --- a/MatterControlLib/ApplicationView/ApplicationController.cs +++ b/MatterControlLib/ApplicationView/ApplicationController.cs @@ -3441,8 +3441,15 @@ Support and tutorials: } else { - // move or rotate view left - Offset3DView(view3D, new Vector2(-offsetDist, 0), arrowKeyOperation); + if (view3D.sceneContext.Scene.SelectedItem is IObject3D object3D) + { + NudgeItem(view3D, object3D, ArrowDirection.Left, keyEvent); + } + else + { + // move or rotate view left + Offset3DView(view3D, new Vector2(-offsetDist, 0), arrowKeyOperation); + } } keyEvent.Handled = true; @@ -3459,8 +3466,15 @@ Support and tutorials: } else { - // move or rotate view right - Offset3DView(view3D, new Vector2(offsetDist, 0), arrowKeyOperation); + if (view3D.sceneContext.Scene.SelectedItem is IObject3D object3D) + { + NudgeItem(view3D, object3D, ArrowDirection.Right, keyEvent); + } + else + { + // move or rotate view right + Offset3DView(view3D, new Vector2(offsetDist, 0), arrowKeyOperation); + } } keyEvent.Handled = true; @@ -3476,7 +3490,14 @@ Support and tutorials: } else { - Offset3DView(view3D, new Vector2(0, offsetDist), arrowKeyOperation); + if (view3D.sceneContext.Scene.SelectedItem is IObject3D object3D) + { + NudgeItem(view3D, object3D, ArrowDirection.Up, keyEvent); + } + else + { + Offset3DView(view3D, new Vector2(0, offsetDist), arrowKeyOperation); + } } keyEvent.Handled = true; @@ -3492,7 +3513,14 @@ Support and tutorials: } else { - Offset3DView(view3D, new Vector2(0, -offsetDist), arrowKeyOperation); + if (view3D.sceneContext.Scene.SelectedItem is IObject3D object3D) + { + NudgeItem(view3D, object3D, ArrowDirection.Down, keyEvent); + } + else + { + Offset3DView(view3D, new Vector2(0, -offsetDist), arrowKeyOperation); + } } keyEvent.Handled = true; @@ -3597,6 +3625,45 @@ Support and tutorials: return systemWindow; } + private static void NudgeItem(View3DWidget view3D, IObject3D object3D, ArrowDirection arrowDirection, KeyEventArgs keyEvent) + { + // TODO: analyze the view and adjust movements to be relative to the current perspective + // + // Naive movements in Identity space + switch (arrowDirection) + { + case ArrowDirection.Left: + object3D.Translate(-view3D.InteractionLayer.SnapGridDistance, 0); + break; + + case ArrowDirection.Right: + object3D.Translate(view3D.InteractionLayer.SnapGridDistance, 0); + break; + + case ArrowDirection.Up: + if (keyEvent.Control) + { + object3D.Translate(0, 0, view3D.InteractionLayer.SnapGridDistance); + } + else + { + object3D.Translate(0, view3D.InteractionLayer.SnapGridDistance); + } + break; + + case ArrowDirection.Down: + if (keyEvent.Control) + { + object3D.Translate(0, 0, -view3D.InteractionLayer.SnapGridDistance); + } + else + { + object3D.Translate(0, -view3D.InteractionLayer.SnapGridDistance); + } + break; + } + } + private static void Offset3DView(View3DWidget view3D, Vector2 offset, TrackBallTransformType operation) { var center = view3D.TrackballTumbleWidget.LocalBounds.Center;