actionMap) {
public void mouseDragged(MouseEvent e) {
super.mouseDragged(e);
- if (isDraggingDrawings) {
+ if (isDraggingDrawings && selectedTool.equals(TemplatePointerTool.class)) {
ZonePoint dragTargetCell = getCellAtMouse(e);
if (!dragWorkingCell.equals(dragTargetCell)) {
-
for (DrawnElement de : draggedDrawnElementSet) {
- // Currently drag templates only
Drawable d = de.getDrawable();
if (d instanceof AbstractTemplate at) {
updateDraggedDrawnElements(e, at);
@@ -273,6 +270,25 @@ public void mouseDragged(MouseEvent e) {
dragWorkingCell = dragTargetCell;
renderer.repaint();
}
+
+ } else if (isDraggingDrawings && selectedTool.equals(DrawingPointerTool.class)) {
+ ZonePoint dragTargetZonePoint = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ if (e.isControlDown()) {
+ dragTargetZonePoint = renderer.getZone().getGrid().getNearestVertex(dragTargetZonePoint);
+ }
+ for (DrawnElement de : draggedDrawnElementSet) {
+ Drawable d = de.getDrawable();
+ if (d instanceof DrawablesGroup dg) {
+ updateDraggedDrawnElements(e, dg);
+ } else if (d instanceof ShapeDrawable sd) {
+ updateDraggedDrawnElements(e, sd);
+ } else if (d instanceof LineSegment ls) {
+ updateDraggedDrawnElements(e, ls);
+ }
+ }
+ dragWorkingZonePoint = dragTargetZonePoint;
+ renderer.repaint();
+
} else if (isDraggingSelectionBox) {
int x1 = dragStartPoint.x;
int y1 = dragStartPoint.y;
@@ -610,14 +626,13 @@ public void paintOverlay(ZoneRenderer renderer, Graphics2D g) {
*/
private void dragDrawnElementsStart(MouseEvent e) {
- if (isTemplate(drawnElementAtMouse)) {
- renderer.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
- }
+ renderer.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
isDraggingDrawings = true;
isDraggingSelectionBox = false;
dragStartPoint = new Point(e.getX(), e.getY());
dragWorkingCell = getCellAtMouse(e);
+ dragWorkingZonePoint = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
if (drawnElementAtMouse.getDrawable() instanceof AbstractTemplate at) {
dragStartVertex = new ZonePoint(at.getVertex());
}
@@ -867,8 +882,11 @@ void onZoneActivated(ZoneActivated event) {
}
/**
- * Paints the drawings which are being changed via dragging. This could be a change in position,
- * path, radius, direction, etc.
+ * Paints the drawables which are being changed via dragging.
+ *
+ * For templates this could be a change in position, path, radius, direction, etc.
+ *
+ *
For drawings this is just a change in position
*
* @param g where to paint.
*/
@@ -878,8 +896,9 @@ private void paintDraggedDrawings(Graphics2D g) {
for (DrawnElement de : draggedDrawnElementSet) {
if (de != null) {
- // Templates only
if (de.getDrawable() instanceof AbstractTemplate at) {
+ // i.e. templates only
+
Pen pen = de.getPen();
AffineTransform oldTransform = g.getTransform();
AffineTransform newTransform = g.getTransform();
@@ -906,6 +925,37 @@ private void paintDraggedDrawings(Graphics2D g) {
if (drawnElementAtMouse.getDrawable().getId() == at.getId()) {
paintTemplateMovementLabel(g, dragStartVertex, at);
}
+
+ } else if (de.getDrawable() instanceof LineSegment ls) {
+ // e.g. points and lines
+
+ log.info("paint dragged ls: {}", ls.getPoints().toString());
+ AffineTransform oldTransform = g.getTransform();
+ AffineTransform newTransform = g.getTransform();
+ newTransform.concatenate(getPaintTransform(renderer));
+ g.setTransform(newTransform);
+ ls.draw(getZone(), g, de.getPen());
+ g.setTransform(oldTransform);
+
+ } else if (de.getDrawable() instanceof ShapeDrawable sd) {
+ // e.g. Rectangles, Ellipses, etc
+
+ AffineTransform oldTransform = g.getTransform();
+ AffineTransform newTransform = g.getTransform();
+ newTransform.concatenate(getPaintTransform(renderer));
+ g.setTransform(newTransform);
+ sd.draw(getZone(), g, de.getPen());
+ g.setTransform(oldTransform);
+
+ } else if (de.getDrawable() instanceof DrawablesGroup dg) {
+ // groups of drawables (inc. other groups)
+
+ AffineTransform oldTransform = g.getTransform();
+ AffineTransform newTransform = g.getTransform();
+ newTransform.concatenate(getPaintTransform(renderer));
+ g.setTransform(newTransform);
+ dg.draw(getZone(), g, de.getPen());
+ g.setTransform(oldTransform);
}
}
} // end for
@@ -1165,10 +1215,8 @@ private void setDraggedDrawnElementsSet() {
Drawable d = de.getDrawable();
GUID id = d.getId();
if (selectedDrawableIdSet.contains(id)) {
- if (d instanceof AbstractTemplate) {
- DrawnElement deCopy = new DrawnElement(de);
- draggedDrawnElementSet.add(deCopy);
- }
+ DrawnElement deCopy = new DrawnElement(de);
+ draggedDrawnElementSet.add(deCopy);
}
}
}
@@ -1213,6 +1261,65 @@ private void updateDrawablesPanel() {
}
}
+ private void updateDraggedDrawnElements(MouseEvent e, DrawablesGroup dg) {
+
+ if (!MapTool.getPlayer().isGM() && MapTool.getServerPolicy().isMovementLocked()) {
+ // i.e. not allowed
+ return;
+ }
+
+ for (DrawnElement de : dg.getDrawableList()) {
+ if (de.getDrawable() instanceof DrawablesGroup dg2) {
+ updateDraggedDrawnElements(e, dg2);
+ } else if (de.getDrawable() instanceof LineSegment ls) {
+ updateDraggedDrawnElements(e, ls);
+ } else if (de.getDrawable() instanceof ShapeDrawable sd) {
+ updateDraggedDrawnElements(e, sd);
+ }
+ }
+ }
+
+ private void updateDraggedDrawnElements(MouseEvent e, LineSegment ls) {
+
+ if (!MapTool.getPlayer().isGM() && MapTool.getServerPolicy().isMovementLocked()) {
+ // i.e. not allowed
+ return;
+ }
+
+ ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
+ dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
+ if (e.isControlDown()) {
+ dragPointOffset = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ }
+ ls.translate(-dragPointOffset.x, -dragPointOffset.y);
+ }
+
+ private void updateDraggedDrawnElements(MouseEvent e, ShapeDrawable sd) {
+
+ if (!MapTool.getPlayer().isGM() && MapTool.getServerPolicy().isMovementLocked()) {
+ // i.e. not allowed
+ return;
+ }
+ ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
+ dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
+ if (e.isControlDown()) {
+ dragPointOffset = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ }
+
+ if (sd.getShape() instanceof RectangularShape rs) {
+ ZonePoint dragCurrentShapeZonePoint = new ZonePoint(rs.getBounds().x, rs.getBounds().y);
+ rs.setFrame(
+ dragCurrentShapeZonePoint.x - dragPointOffset.x,
+ dragCurrentShapeZonePoint.y - dragPointOffset.y,
+ rs.getWidth(),
+ rs.getHeight());
+ } else if (sd.getShape() instanceof Polygon p) {
+ p.translate(-dragPointOffset.x, -dragPointOffset.y);
+ }
+ }
+
/**
* Handles moving the template by moving the vertex and (if relevant) the pathVertex.
*
@@ -1302,30 +1409,11 @@ private void updateOriginalDrawnElements() {
for (DrawnElement deDragged : draggedDrawnElementSet) {
GUID id = deDragged.getDrawable().getId();
if (id == deOriginal.getDrawable().getId()) {
- if (deOriginal.getDrawable() instanceof AbstractTemplate atOriginal
- && deDragged.getDrawable() instanceof AbstractTemplate atDragged) {
-
- // Update the radius and vertex (all templates have these)
- atOriginal.setVertex(atDragged.getVertex());
- atOriginal.setRadius(atDragged.getRadius());
-
- // Update the path vertex (if applicable to the template type)
- setTemplatePathVertex(atOriginal, getTemplatePathVertex(atDragged));
-
- // Update other special things (applicable to specific template types)
- String templateType = getTemplateType(atOriginal);
- if (templateType.equals("BlastTemplate")) {
- int OffsetX = ((BlastTemplate) atDragged).getOffsetX();
- int OffsetY = ((BlastTemplate) atDragged).getOffsetY();
- ((BlastTemplate) atOriginal).setControlCellOffset(OffsetX, OffsetY);
- } else if (templateType.equals("ConeTemplate")) {
- ((ConeTemplate) atOriginal).setDirection(((ConeTemplate) atDragged).getDirection());
- }
+ deOriginal.setDrawable(deDragged.getDrawable());
- // Server drawing update
- MapTool.serverCommand().updateDrawing(zone.getId(), deOriginal.getPen(), deOriginal);
- renderer.getZone().updateDrawable(deOriginal, deOriginal.getPen());
- }
+ // Server drawing update
+ MapTool.serverCommand().updateDrawing(zone.getId(), deOriginal.getPen(), deOriginal);
+ renderer.getZone().updateDrawable(deOriginal, deOriginal.getPen());
}
} // end for
} // end for
diff --git a/src/main/java/net/rptools/maptool/model/drawing/LineSegment.java b/src/main/java/net/rptools/maptool/model/drawing/LineSegment.java
index 7b01a4c000..18e615e63d 100644
--- a/src/main/java/net/rptools/maptool/model/drawing/LineSegment.java
+++ b/src/main/java/net/rptools/maptool/model/drawing/LineSegment.java
@@ -130,6 +130,19 @@ public List getPoints() {
return Collections.unmodifiableList(points);
}
+ /**
+ * Translate the line segment
+ *
+ * @param deltaX offset in the X axis
+ * @param deltaY offset in the Y axis
+ */
+ public void translate(int deltaX, int deltaY) {
+ points.replaceAll(point1 -> new Point(point1.x + deltaX, point1.y + deltaY));
+ if (cachedBounds != null) {
+ cachedBounds.translate(deltaX, deltaY);
+ }
+ }
+
@Override
public @Nonnull Area getArea(Zone zone) {
if (area == null) {
From cf06307c8ca3fdb00de72706a447d111a75747c9 Mon Sep 17 00:00:00 2001
From: Baaaaaz <131240480+Baaaaaz@users.noreply.github.com>
Date: Thu, 6 Nov 2025 22:09:15 +0000
Subject: [PATCH 2/5] Drawings can now be duplicated using the draw panel popup
menu.
---
.../ui/drawpanel/DrawPanelPopupMenu.java | 25 ++++++-------------
1 file changed, 8 insertions(+), 17 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/ui/drawpanel/DrawPanelPopupMenu.java b/src/main/java/net/rptools/maptool/client/ui/drawpanel/DrawPanelPopupMenu.java
index c987f54311..bd14efaaa3 100644
--- a/src/main/java/net/rptools/maptool/client/ui/drawpanel/DrawPanelPopupMenu.java
+++ b/src/main/java/net/rptools/maptool/client/ui/drawpanel/DrawPanelPopupMenu.java
@@ -92,9 +92,7 @@ public DrawPanelPopupMenu(
add(new SetPropertiesAction());
add(new SetDrawingName());
add(new GetDrawingId());
- if (isDrawnElementTemplate(elementUnderMouse)) {
- add(new DuplicateDrawingAction(selectedDrawSet));
- }
+ add(new DuplicateDrawingAction(selectedDrawSet));
addGMItem(new JSeparator());
add(createPathVblMenu());
add(createShapeVblMenu());
@@ -178,11 +176,7 @@ public void actionPerformed(ActionEvent e) {
}
}
- /**
- * Duplicates selected drawings...
- *
- * ... but currently limited to templates only as we can drag and manipulate those
- */
+ /** Duplicates selected drawings... */
public static class DuplicateDrawingAction extends AbstractAction {
public DuplicateDrawingAction() {
@@ -208,18 +202,15 @@ public void actionPerformed(ActionEvent e) {
return;
}
- // check to see if this is the required action
for (GUID id : selectedDrawings) {
DrawnElement de = renderer.getZone().getDrawnElement(id);
Drawable d = de.getDrawable();
- if (de.getDrawable() instanceof AbstractTemplate) {
- AbstractTemplate at = (AbstractTemplate) d.copy();
- at.setId(new GUID());
- // Draw it
- MapTool.serverCommand().draw(renderer.getZone().getId(), de.getPen(), at);
- // Allow it to be undone
- renderer.getZone().addDrawable(de.getPen(), at);
- }
+ AbstractDrawing ad = (AbstractDrawing) d.copy();
+ ad.setId(new GUID());
+ // Draw it
+ MapTool.serverCommand().draw(renderer.getZone().getId(), de.getPen(), ad);
+ // Allow it to be undone
+ renderer.getZone().addDrawable(de.getPen(), ad);
}
renderer.repaint();
MapTool.getFrame().updateDrawTree();
From a53e5a7416d248dc37757e62c5bc2b3d32a80dda Mon Sep 17 00:00:00 2001
From: Baaaaaz <131240480+Baaaaaz@users.noreply.github.com>
Date: Sat, 8 Nov 2025 14:45:48 +0000
Subject: [PATCH 3/5] Address usability feedback on snapping-to-grid whilst
dragging drawings
---
.../tool/drawing/DrawingPointerTool.java | 105 ++++++++++++++----
1 file changed, 83 insertions(+), 22 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
index f1c65a2b38..7cb1a97ac9 100644
--- a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
+++ b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
@@ -116,6 +116,12 @@ public class DrawingPointerTool extends DefaultTool implements ZoneOverlay, Mous
*/
private static final Set draggedDrawnElementSet = new HashSet<>();
+ /**
+ * Stores pre-drag bounds of {@link Drawable}s. Used for snapping dragged drawings to grid based
+ * on their original position.
+ */
+ private static final Map draggedStartBoundsMap = new HashMap<>();
+
/**
* Factory to generate {@link FlatImageLabel}s for drawing/template name labels. Will be assigned
* prior to each use as user color preferences may change.
@@ -163,7 +169,6 @@ public class DrawingPointerTool extends DefaultTool implements ZoneOverlay, Mous
private ZonePoint dragStartVertex = null;
private ZonePoint dragWorkingCell = null;
-
private ZonePoint dragWorkingZonePoint = null;
/** An enumeration of template cursor types. */
@@ -284,9 +289,9 @@ public void mouseDragged(MouseEvent e) {
} else if (d instanceof LineSegment ls) {
updateDraggedDrawnElements(e, ls);
}
+ dragWorkingZonePoint = dragTargetZonePoint;
+ renderer.repaint();
}
- dragWorkingZonePoint = dragTargetZonePoint;
- renderer.repaint();
} else if (isDraggingSelectionBox) {
int x1 = dragStartPoint.x;
@@ -468,25 +473,24 @@ public void mouseReleased(MouseEvent e) {
for (DrawnElement de : drawableList) {
Drawable d = de.getDrawable();
- // Only select drawing types relevant to the tool
- // Object selectedTool = MapTool.getFrame().getToolbox().getSelectedTool().getClass();
+ // Only select drawn element types relevant to the tool
boolean isTemplate = isTemplate(de);
if (selectedTool == TemplatePointerTool.class && isTemplate
|| selectedTool == DrawingPointerTool.class && !isTemplate) {
GUID id = d.getId();
- // Check if the template bounds is within the bounds of the selection box
+ // Check if the drawable bounds is within the bounds of the selection box
if (zoneTemplateSelectionBox.contains(d.getBounds(zone))) {
boolean isControlCheck = true;
boolean isAltCheck = true;
- // CTRL key - check if the template border color matches the color picker
+ // CTRL key - check if the border color matches the color picker
if (e.isControlDown()) {
isControlCheck =
drawablePaintToString(de.getPen().getPaint())
.equals(drawablePaintToString(getPen().getPaint()));
}
- // ALT key - check if the template fill color matches the color picker
+ // ALT key - check if the fill color matches the color picker
if (e.isAltDown()) {
isAltCheck =
drawablePaintToString(de.getPen().getBackgroundPaint())
@@ -634,7 +638,10 @@ private void dragDrawnElementsStart(MouseEvent e) {
dragWorkingZonePoint = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
if (drawnElementAtMouse.getDrawable() instanceof AbstractTemplate at) {
dragStartVertex = new ZonePoint(at.getVertex());
+ } else {
+ dragStartVertex = renderer.getZone().getGrid().getNearestVertex(dragWorkingZonePoint);
}
+
setDraggedDrawnElementsSet();
}
@@ -912,7 +919,6 @@ private void paintDraggedDrawings(Graphics2D g) {
} else if (de.getDrawable() instanceof LineSegment ls) {
// e.g. points and lines
- log.info("paint dragged ls: {}", ls.getPoints().toString());
AffineTransform oldTransform = g.getTransform();
AffineTransform newTransform = g.getTransform();
newTransform.concatenate(getPaintTransform(renderer));
@@ -921,7 +927,7 @@ private void paintDraggedDrawings(Graphics2D g) {
g.setTransform(oldTransform);
} else if (de.getDrawable() instanceof ShapeDrawable sd) {
- // e.g. Rectangles, Ellipses, etc
+ // e.g. rectangles, ellipses, etc
AffineTransform oldTransform = g.getTransform();
AffineTransform newTransform = g.getTransform();
@@ -1182,9 +1188,12 @@ private void paintTemplateRadiusLabel(Graphics2D g, ZonePoint zp, AbstractTempla
}
/**
- * Creates a copy of the {@link DrawnElement}s being dragged. This {@link Set} is used for
- * displaying the dragged drawings. e.g. for templates this could be either a change in position,
- * path, direction, and/or size.
+ * Creates a copy of the {@link DrawnElement}s being dragged and stores their pre-drag bounds.
+ *
+ * The {@link Set} is used for displaying the dragged drawings. e.g. for templates this could
+ * be either a change in position, path, direction, and/or size.
+ *
+ *
The {@link Map} is used when snapping drawings to grid whilst dragging.
*
*
In the event of the Escape key being pressed while dragging, any changes to
* dragged drawings will not be applied to the original drawings.
@@ -1193,6 +1202,7 @@ private void setDraggedDrawnElementsSet() {
List drawableList = getDrawnElementsOnLayerList(false);
draggedDrawnElementSet.clear();
+ draggedStartBoundsMap.clear();
if (!selectedDrawableIdSet.isEmpty()) {
for (DrawnElement de : drawableList) {
Drawable d = de.getDrawable();
@@ -1200,11 +1210,33 @@ private void setDraggedDrawnElementsSet() {
if (selectedDrawableIdSet.contains(id)) {
DrawnElement deCopy = new DrawnElement(de);
draggedDrawnElementSet.add(deCopy);
+ draggedStartBoundsMap.put(id, de.getDrawable().getBounds(getZone()));
+ if (d instanceof DrawablesGroup dg) {
+ setGroupDraggedStartBoundsMap(dg);
+ }
}
}
}
}
+ /**
+ * Get the bounds of the drawables group contents, recursively if there are child groups.
+ *
+ * @param dg the drawables group
+ */
+ private void setGroupDraggedStartBoundsMap(DrawablesGroup dg) {
+
+ for (DrawnElement de : dg.getDrawableList()) {
+ if (de.getDrawable() instanceof DrawablesGroup dg2) {
+ setGroupDraggedStartBoundsMap(dg2);
+ } else if (de.getDrawable() instanceof LineSegment ls) {
+ draggedStartBoundsMap.put(ls.getId(), ls.getBounds(getZone()));
+ } else if (de.getDrawable() instanceof ShapeDrawable sd) {
+ draggedStartBoundsMap.put(sd.getId(), sd.getBounds(getZone()));
+ }
+ }
+ }
+
/**
* Helper method that sets the path vertex for the template (for known template types that have
* them), but prevents setting it where it would equal the vertex.
@@ -1270,11 +1302,26 @@ private void updateDraggedDrawnElements(MouseEvent e, LineSegment ls) {
}
ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
- dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
- dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
+
if (e.isControlDown()) {
- dragPointOffset = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ // Snap to grid based on the drawing's original (i.e. pre-dragged) position.
+ ZonePoint dragNearestVertex = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ dragPointOffset.x =
+ dragStartVertex.x
+ - draggedStartBoundsMap.get(ls.getId()).getBounds().x
+ - dragNearestVertex.x
+ + ls.getBounds(getZone()).x;
+ dragPointOffset.y =
+ dragStartVertex.y
+ - draggedStartBoundsMap.get(ls.getId()).getBounds().y
+ - dragNearestVertex.y
+ + ls.getBounds(getZone()).y;
+ } else {
+ // Not snapping to grid
+ dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
+ dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
}
+
ls.translate(-dragPointOffset.x, -dragPointOffset.y);
}
@@ -1284,18 +1331,32 @@ private void updateDraggedDrawnElements(MouseEvent e, ShapeDrawable sd) {
// i.e. not allowed
return;
}
+
ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
- dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
- dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
+
if (e.isControlDown()) {
- dragPointOffset = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ // Snap to grid based on the drawing's original (i.e. pre-dragged) position.
+ ZonePoint dragNearestVertex = renderer.getZone().getGrid().getNearestVertex(dragPointOffset);
+ dragPointOffset.x =
+ dragStartVertex.x
+ - draggedStartBoundsMap.get(sd.getId()).getBounds().x
+ - dragNearestVertex.x
+ + sd.getBounds().x;
+ dragPointOffset.y =
+ dragStartVertex.y
+ - draggedStartBoundsMap.get(sd.getId()).getBounds().y
+ - dragNearestVertex.y
+ + sd.getBounds().y;
+ } else {
+ // Not snapping to grid
+ dragPointOffset.x = dragWorkingZonePoint.x - dragPointOffset.x;
+ dragPointOffset.y = dragWorkingZonePoint.y - dragPointOffset.y;
}
if (sd.getShape() instanceof RectangularShape rs) {
- ZonePoint dragCurrentShapeZonePoint = new ZonePoint(rs.getBounds().x, rs.getBounds().y);
rs.setFrame(
- dragCurrentShapeZonePoint.x - dragPointOffset.x,
- dragCurrentShapeZonePoint.y - dragPointOffset.y,
+ rs.getBounds().x - dragPointOffset.x,
+ rs.getBounds().y - dragPointOffset.y,
rs.getWidth(),
rs.getHeight());
} else if (sd.getShape() instanceof Polygon p) {
From 7a159de70d34c99443c3f512618178bee81bfabb Mon Sep 17 00:00:00 2001
From: Baaaaaz <131240480+Baaaaaz@users.noreply.github.com>
Date: Thu, 13 Nov 2025 09:27:21 +0000
Subject: [PATCH 4/5] align with recent get zone scale changes
---
.../client/tool/drawing/DrawingPointerTool.java | 12 ++++++++----
1 file changed, 8 insertions(+), 4 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
index 9bb8638308..d2caccb191 100644
--- a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
+++ b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
@@ -276,7 +276,8 @@ public void mouseDragged(MouseEvent e) {
}
} else if (isDraggingDrawings && selectedTool.equals(DrawingPointerTool.class)) {
- ZonePoint dragTargetZonePoint = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ ZonePoint dragTargetZonePoint =
+ new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer.getViewModel().getZoneScale());
if (e.isControlDown()) {
dragTargetZonePoint = renderer.getZone().getGrid().getNearestVertex(dragTargetZonePoint);
}
@@ -635,7 +636,8 @@ private void dragDrawnElementsStart(MouseEvent e) {
isDraggingSelectionBox = false;
dragStartPoint = new Point(e.getX(), e.getY());
dragWorkingCell = getCellAtMouse(e);
- dragWorkingZonePoint = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ dragWorkingZonePoint =
+ new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer.getViewModel().getZoneScale());
if (drawnElementAtMouse.getDrawable() instanceof AbstractTemplate at) {
dragStartVertex = new ZonePoint(at.getVertex());
} else {
@@ -1303,7 +1305,8 @@ private void updateDraggedDrawnElements(MouseEvent e, LineSegment ls) {
return;
}
- ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ ZonePoint dragPointOffset =
+ new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer.getViewModel().getZoneScale());
if (e.isControlDown()) {
// Snap to grid based on the drawing's original (i.e. pre-dragged) position.
@@ -1334,7 +1337,8 @@ private void updateDraggedDrawnElements(MouseEvent e, ShapeDrawable sd) {
return;
}
- ZonePoint dragPointOffset = new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer);
+ ZonePoint dragPointOffset =
+ new ScreenPoint(e.getX(), e.getY()).convertToZone(renderer.getViewModel().getZoneScale());
if (e.isControlDown()) {
// Snap to grid based on the drawing's original (i.e. pre-dragged) position.
From 8cfd16f3d314cc88d3c6544f50ff373ea64e7e58 Mon Sep 17 00:00:00 2001
From: Baaaaaz <131240480+Baaaaaz@users.noreply.github.com>
Date: Thu, 13 Nov 2025 09:30:01 +0000
Subject: [PATCH 5/5] fix incorrect nesting when dragging multiple drawings
---
.../maptool/client/tool/drawing/DrawingPointerTool.java | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
index d2caccb191..b53c541e54 100644
--- a/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
+++ b/src/main/java/net/rptools/maptool/client/tool/drawing/DrawingPointerTool.java
@@ -290,9 +290,9 @@ public void mouseDragged(MouseEvent e) {
} else if (d instanceof LineSegment ls) {
updateDraggedDrawnElements(e, ls);
}
- dragWorkingZonePoint = dragTargetZonePoint;
- renderer.repaint();
}
+ dragWorkingZonePoint = dragTargetZonePoint;
+ renderer.repaint();
} else if (isDraggingSelectionBox) {
int x1 = dragStartPoint.x;