implement resize feature
This commit is contained in:
@@ -5,6 +5,7 @@ import org.slf4j.LoggerFactory;
|
||||
import ovh.gasser.newshapes.HTMLExporter;
|
||||
import ovh.gasser.newshapes.Selection;
|
||||
import ovh.gasser.newshapes.attributes.ColorAttributes;
|
||||
import ovh.gasser.newshapes.shapes.ResizeHandle;
|
||||
import ovh.gasser.newshapes.shapes.SCollection;
|
||||
import ovh.gasser.newshapes.shapes.SText;
|
||||
import ovh.gasser.newshapes.shapes.Shape;
|
||||
@@ -27,6 +28,10 @@ public class Controller {
|
||||
|
||||
private Point lastMousePos;
|
||||
private boolean addingText;
|
||||
private boolean resizing;
|
||||
private ResizeHandle activeHandle;
|
||||
private Point resizeOrigin;
|
||||
private boolean resizeMode;
|
||||
|
||||
Controller(ShapesView view, SCollection model) {
|
||||
this.view = view;
|
||||
@@ -43,6 +48,13 @@ public class Controller {
|
||||
public void mouseDragged(MouseEvent evt) {
|
||||
handleMouseDragged(evt);
|
||||
}
|
||||
|
||||
@Override
|
||||
public void mouseReleased(MouseEvent evt) {
|
||||
resizing = false;
|
||||
activeHandle = null;
|
||||
resizeOrigin = null;
|
||||
}
|
||||
};
|
||||
this.view.addMouseMotionListener(adapter);
|
||||
this.view.addMouseListener(adapter);
|
||||
@@ -55,12 +67,31 @@ public class Controller {
|
||||
}
|
||||
|
||||
private void handleMouseDragged(MouseEvent evt) {
|
||||
int dx = evt.getX() - lastMousePos.x;
|
||||
int dy = evt.getY() - lastMousePos.y;
|
||||
for (Shape shape : selection) {
|
||||
shape.translate(dx, dy);
|
||||
if (resizeMode && resizing && activeHandle != null) {
|
||||
int dx = evt.getX() - resizeOrigin.x;
|
||||
int dy = evt.getY() - resizeOrigin.y;
|
||||
for (Shape shape : selection) {
|
||||
shape.resize(activeHandle, dx, dy);
|
||||
}
|
||||
resizeOrigin = evt.getPoint();
|
||||
} else if (resizeMode && !selection.isEmpty()) {
|
||||
lastMousePos = evt.getPoint();
|
||||
ResizeHandle handle = getHandleAt(evt.getPoint());
|
||||
if (handle != null) {
|
||||
resizing = true;
|
||||
activeHandle = handle;
|
||||
resizeOrigin = evt.getPoint();
|
||||
}
|
||||
} else {
|
||||
resizing = false;
|
||||
activeHandle = null;
|
||||
int dx = evt.getX() - lastMousePos.x;
|
||||
int dy = evt.getY() - lastMousePos.y;
|
||||
for (Shape shape : selection) {
|
||||
shape.translate(dx, dy);
|
||||
}
|
||||
lastMousePos = evt.getPoint();
|
||||
}
|
||||
lastMousePos = evt.getPoint();
|
||||
view.repaint();
|
||||
}
|
||||
|
||||
@@ -70,6 +101,21 @@ public class Controller {
|
||||
return;
|
||||
}
|
||||
|
||||
resizing = false;
|
||||
activeHandle = null;
|
||||
resizeOrigin = null;
|
||||
|
||||
if (resizeMode && !selection.isEmpty()) {
|
||||
ResizeHandle handle = getHandleAt(evt.getPoint());
|
||||
if (handle != null) {
|
||||
resizing = true;
|
||||
activeHandle = handle;
|
||||
resizeOrigin = evt.getPoint();
|
||||
view.repaint();
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
getTarget(evt, this.model)
|
||||
.ifPresentOrElse(
|
||||
s -> {
|
||||
@@ -85,6 +131,7 @@ public class Controller {
|
||||
view.repaint();
|
||||
}
|
||||
|
||||
<<<<<<< HEAD
|
||||
public void enterTextMode() {
|
||||
addingText = true;
|
||||
}
|
||||
@@ -101,8 +148,32 @@ public class Controller {
|
||||
view.repaint();
|
||||
}
|
||||
|
||||
public void enterTextMode() {
|
||||
addingText = true;
|
||||
}
|
||||
|
||||
private ResizeHandle getHandleAt(Point point) {
|
||||
final int handleSize = 5;
|
||||
for (Shape shape : selection) {
|
||||
Rectangle bounds = shape.getBounds();
|
||||
int cx = bounds.x + bounds.width / 2;
|
||||
int cy = bounds.y + bounds.height / 2;
|
||||
|
||||
if (point.x < cx && point.y < cy) return ResizeHandle.NW;
|
||||
if (point.x > cx && point.y < cy) return ResizeHandle.NE;
|
||||
if (point.x < cx && point.y > cy) return ResizeHandle.SW;
|
||||
if (point.x > cx && point.y > cy) return ResizeHandle.SE;
|
||||
if (point.y < cy) return ResizeHandle.N;
|
||||
if (point.y > cy) return ResizeHandle.S;
|
||||
if (point.x < cx) return ResizeHandle.W;
|
||||
if (point.x > cx) return ResizeHandle.E;
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
private void handleKeyPressed(KeyEvent evt) {
|
||||
switch (evt.getKeyCode()) {
|
||||
case KeyEvent.VK_R -> toggleResizeMode();
|
||||
case KeyEvent.VK_DELETE -> deleteSelected();
|
||||
case KeyEvent.VK_C -> copySelection();
|
||||
case KeyEvent.VK_A -> changeSelectionColor();
|
||||
@@ -111,6 +182,14 @@ public class Controller {
|
||||
}
|
||||
}
|
||||
|
||||
private void toggleResizeMode() {
|
||||
if (!selection.isEmpty()) {
|
||||
resizeMode = !resizeMode;
|
||||
view.setResizeMode(resizeMode);
|
||||
view.repaint();
|
||||
}
|
||||
}
|
||||
|
||||
private void exportHtml() {
|
||||
logger.info("Exporting view to html");
|
||||
try {
|
||||
|
||||
Reference in New Issue
Block a user