@@ -18,20 +18,27 @@ This file is part of Universal Gcode Sender (UGS).
1818 */
1919package com .willwinder .ugs .designer .gui ;
2020
21+ import com .willwinder .ugs .designer .actions .MoveAction ;
22+ import com .willwinder .ugs .designer .entities .Entity ;
2123import com .willwinder .ugs .designer .entities .EventType ;
2224import com .willwinder .ugs .designer .entities .controls .Control ;
25+ import com .willwinder .ugs .designer .entities .selection .SelectionManager ;
2326import com .willwinder .ugs .designer .logic .Controller ;
2427
2528import java .awt .*;
2629import java .awt .event .KeyEvent ;
2730import java .awt .event .KeyListener ;
31+ import java .awt .geom .Point2D ;
32+ import java .util .List ;
2833import java .util .Optional ;
2934
3035/**
3136 * @author Joacim Breiler
3237 */
3338public class KeyboardListener implements KeyListener {
3439
40+ private static final double DEFAULT_MOVE_STEP = 1.0 ;
41+
3542 private final Controller controller ;
3643 private final MouseListener mouseListener ;
3744
@@ -54,10 +61,49 @@ public void keyTyped(KeyEvent keyEvent) {
5461
5562 @ Override
5663 public void keyPressed (KeyEvent keyEvent ) {
64+ if (moveSelection (keyEvent )) {
65+ keyEvent .consume ();
66+ return ;
67+ }
5768 mouseListener .getHoveredControls ().forEach (control -> control .onEvent (new KeyboardEntityEvent (control , EventType .KEY_PRESSED , keyEvent )));
5869 updateCursor ();
5970 }
6071
72+ private boolean moveSelection (KeyEvent keyEvent ) {
73+ if (!controller .getDrawing ().isFocusOwner ()) {
74+ return false ;
75+ }
76+
77+ SelectionManager selectionManager = controller .getSelectionManager ();
78+ if (selectionManager .isEmpty ()) {
79+ return false ;
80+ }
81+
82+ double step = controller .getDrawing ().getSnapToGrid ();
83+ if (step <= 0 ) {
84+ step = DEFAULT_MOVE_STEP ;
85+ }
86+
87+ Point2D deltaMovement = switch (keyEvent .getKeyCode ()) {
88+ case KeyEvent .VK_LEFT -> new Point2D .Double (-step , 0 );
89+ case KeyEvent .VK_RIGHT -> new Point2D .Double (step , 0 );
90+ case KeyEvent .VK_UP -> new Point2D .Double (0 , step );
91+ case KeyEvent .VK_DOWN -> new Point2D .Double (0 , -step );
92+ default -> null ;
93+ };
94+
95+ if (deltaMovement == null ) {
96+ return false ;
97+ }
98+
99+ List <Entity > entities = List .copyOf (selectionManager .getSelection ());
100+ MoveAction moveAction = new MoveAction (entities , deltaMovement );
101+ moveAction .execute ();
102+ controller .getUndoManager ().addAction (moveAction );
103+ controller .getDrawing ().repaint ();
104+ return true ;
105+ }
106+
61107 @ Override
62108 public void keyReleased (KeyEvent keyEvent ) {
63109 mouseListener .getHoveredControls ().forEach (control -> control .onEvent (new KeyboardEntityEvent (control , EventType .KEY_RELEASED , keyEvent )));
0 commit comments