Skip to content

Commit 4d07459

Browse files
authored
Move entities with arrow keys (#3139)
1 parent 50c6b7d commit 4d07459

2 files changed

Lines changed: 52 additions & 0 deletions

File tree

ugs-designer/src/main/java/com/willwinder/ugs/designer/gui/Drawing.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,7 @@ public class Drawing extends JPanel implements ISnapToGridListener {
7575
private final transient Throttler refreshThrottler;
7676
private final transient Rectangle2D currentBounds = new Rectangle(0, 0, 8, 8);
7777
private double scale;
78+
private double snapToGrid;
7879
private Point2D.Double position = new Point2D.Double();
7980
private Dimension oldMinimumSize;
8081
private transient DropHandler dropHandler;
@@ -323,10 +324,15 @@ public Point2D.Double getPosition() {
323324

324325
@Override
325326
public void snapToGridUpdated(double aNewValue) {
327+
this.snapToGrid = aNewValue;
326328
for (Entity ctrl : this.controlsRoot.getAllChildren()) {
327329
if (ctrl instanceof ISnapToGridListener iSnapToGridListener) {
328330
iSnapToGridListener.snapToGridUpdated(aNewValue);
329331
}
330332
}
331333
}
334+
335+
public double getSnapToGrid() {
336+
return snapToGrid;
337+
}
332338
}

ugs-designer/src/main/java/com/willwinder/ugs/designer/gui/KeyboardListener.java

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,20 +18,27 @@ This file is part of Universal Gcode Sender (UGS).
1818
*/
1919
package com.willwinder.ugs.designer.gui;
2020

21+
import com.willwinder.ugs.designer.actions.MoveAction;
22+
import com.willwinder.ugs.designer.entities.Entity;
2123
import com.willwinder.ugs.designer.entities.EventType;
2224
import com.willwinder.ugs.designer.entities.controls.Control;
25+
import com.willwinder.ugs.designer.entities.selection.SelectionManager;
2326
import com.willwinder.ugs.designer.logic.Controller;
2427

2528
import java.awt.*;
2629
import java.awt.event.KeyEvent;
2730
import java.awt.event.KeyListener;
31+
import java.awt.geom.Point2D;
32+
import java.util.List;
2833
import java.util.Optional;
2934

3035
/**
3136
* @author Joacim Breiler
3237
*/
3338
public 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

Comments
 (0)