implement resize feature

This commit is contained in:
2026-03-19 22:20:23 +01:00
parent 332ac76a23
commit b34ad6a2e4
9 changed files with 249 additions and 9 deletions

View File

@@ -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 {