From 77ab989334c1eccacdceb3fd0f37669490daa818 Mon Sep 17 00:00:00 2001 From: bancika Date: Wed, 9 Dec 2020 21:30:08 +0100 Subject: [PATCH] pinch zooming for mac --- .../src/org/diylc/presenter/update.xml | 20 +++ diylc/diylc-swing/.classpath | 1 + diylc/diylc-swing/build.xml | 2 +- diylc/diylc-swing/lib/diylc-core.jar | Bin 338426 -> 338426 bytes .../diylc-swing/lib/gestures-wrapper-0.2.jar | Bin 0 -> 14881 bytes ...er.java => CanvasDragGestureListener.java} | 6 +- .../swing/plugins/canvas/CanvasPanel.java | 64 ++++---- .../swing/plugins/canvas/CanvasPlugin.java | 143 ++++++++++++------ 8 files changed, 159 insertions(+), 77 deletions(-) create mode 100644 diylc/diylc-swing/lib/gestures-wrapper-0.2.jar rename diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/{CanvasGestureListener.java => CanvasDragGestureListener.java} (87%) diff --git a/diylc/diylc-core/src/org/diylc/presenter/update.xml b/diylc/diylc-core/src/org/diylc/presenter/update.xml index 9a2ef701..f6e45d5b 100644 --- a/diylc/diylc-core/src/org/diylc/presenter/update.xml +++ b/diylc/diylc-core/src/org/diylc/presenter/update.xml @@ -3269,5 +3269,25 @@ https://github.com/bancika/diy-layout-creator/releases + + + 4 + 12 + 0 + + 2020-11-19 00:00:00.000 CET + + + + NEW_FEATURE + macOS: added pinch zooming functionality + + + IMPROVEMENT + macOS: added meta +/- (minus and equal keys) keyboard shortcuts for zooming + + + https://github.com/bancika/diy-layout-creator/releases + diff --git a/diylc/diylc-swing/.classpath b/diylc/diylc-swing/.classpath index 8159a3ea..c9ca94d3 100644 --- a/diylc/diylc-swing/.classpath +++ b/diylc/diylc-swing/.classpath @@ -15,6 +15,7 @@ + diff --git a/diylc/diylc-swing/build.xml b/diylc/diylc-swing/build.xml index 6fefedc7..52338685 100644 --- a/diylc/diylc-swing/build.xml +++ b/diylc/diylc-swing/build.xml @@ -10,7 +10,7 @@ - + diff --git a/diylc/diylc-swing/lib/diylc-core.jar b/diylc/diylc-swing/lib/diylc-core.jar index b9185f3893b102924f9ea6f194517e492446102f..459b2fbfed163a1dda429c5ccc28446dc28b442d 100644 GIT binary patch delta 6166 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 delta 6166 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 I+fg6$U*C#+?f?J) diff --git a/diylc/diylc-swing/lib/gestures-wrapper-0.2.jar b/diylc/diylc-swing/lib/gestures-wrapper-0.2.jar new file mode 100644 index 0000000000000000000000000000000000000000..d72ddc8a923ef8ceedc596ed32786eb7b821b25e GIT binary patch literal 14881 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 literal 0 HcmV?d00001 diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasGestureListener.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasDragGestureListener.java similarity index 87% rename from diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasGestureListener.java rename to diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasDragGestureListener.java index 5906bcb7..409d6248 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasGestureListener.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasDragGestureListener.java @@ -29,15 +29,15 @@ import java.awt.event.MouseEvent; import org.diylc.common.IPlugInPort; /** - * {@link DragGestureListener} for {@link CanvasPanel}. + * {@link DragGestureListener} implementation for {@link CanvasPanel}. * * @author Branislav Stojkovic */ -class CanvasGestureListener implements DragGestureListener { +class CanvasDragGestureListener implements DragGestureListener { private IPlugInPort presenter; - public CanvasGestureListener(IPlugInPort presenter) { + public CanvasDragGestureListener(IPlugInPort presenter) { super(); this.presenter = presenter; } diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java index a1c4166d..2417e0eb 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPanel.java @@ -124,7 +124,7 @@ public class CanvasPanel extends JComponent implements Autoscroll { // Initialize drag source recognizer. DragSource.getDefaultDragSource().createDefaultDragGestureRecognizer(this, DnDConstants.ACTION_COPY_OR_MOVE | DnDConstants.ACTION_LINK, - new CanvasGestureListener(plugInPort)); + new CanvasDragGestureListener(plugInPort)); // Initialize drop target. new DropTarget(this, DnDConstants.ACTION_COPY_OR_MOVE, new CanvasTargetListener(plugInPort), true); @@ -143,8 +143,12 @@ public class CanvasPanel extends JComponent implements Autoscroll { .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.CTRL_DOWN_MASK), "zoomOut"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_ADD, KeyEvent.META_DOWN_MASK), "zoomIn"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_EQUALS, KeyEvent.META_DOWN_MASK), "zoomIn"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_SUBTRACT, KeyEvent.META_DOWN_MASK), "zoomOut"); + getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) + .put(KeyStroke.getKeyStroke(KeyEvent.VK_MINUS, KeyEvent.META_DOWN_MASK), "zoomOut"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) .put(KeyStroke.getKeyStroke(KeyEvent.VK_0, KeyEvent.CTRL_DOWN_MASK), "resetZoom"); getInputMap(JComponent.WHEN_IN_FOCUSED_WINDOW) @@ -169,35 +173,35 @@ public class CanvasPanel extends JComponent implements Autoscroll { }); } - getActionMap().put("zoomIn", new AbstractAction() { - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - LOG.debug("Keyboard zoom-in triggered"); - double oldZoom = CanvasPanel.this.plugInPort.getZoomLevel(); - Double[] availableZoomLevels = CanvasPanel.this.plugInPort.getAvailableZoomLevels(); - int index = Arrays.binarySearch(availableZoomLevels, oldZoom); - if (index < availableZoomLevels.length - 1) - CanvasPanel.this.plugInPort.setZoomLevel(availableZoomLevels[index + 1]); - } - }); - - getActionMap().put("zoomOut", new AbstractAction() { - - private static final long serialVersionUID = 1L; - - @Override - public void actionPerformed(ActionEvent e) { - LOG.debug("Keyboard zoom-out triggered"); - double oldZoom = CanvasPanel.this.plugInPort.getZoomLevel(); - Double[] availableZoomLevels = CanvasPanel.this.plugInPort.getAvailableZoomLevels(); - int index = Arrays.binarySearch(availableZoomLevels, oldZoom); - if (index > 0) - CanvasPanel.this.plugInPort.setZoomLevel(availableZoomLevels[index - 1]); - } - }); +// getActionMap().put("zoomIn", new AbstractAction() { +// +// private static final long serialVersionUID = 1L; +// +// @Override +// public void actionPerformed(ActionEvent e) { +// LOG.debug("Keyboard zoom-in triggered"); +// double oldZoom = CanvasPanel.this.plugInPort.getZoomLevel(); +// Double[] availableZoomLevels = CanvasPanel.this.plugInPort.getAvailableZoomLevels(); +// int index = Arrays.binarySearch(availableZoomLevels, oldZoom); +// if (index < availableZoomLevels.length - 1) +// CanvasPanel.this.plugInPort.setZoomLevel(availableZoomLevels[index + 1]); +// } +// }); +// +// getActionMap().put("zoomOut", new AbstractAction() { +// +// private static final long serialVersionUID = 1L; +// +// @Override +// public void actionPerformed(ActionEvent e) { +// LOG.debug("Keyboard zoom-out triggered"); +// double oldZoom = CanvasPanel.this.plugInPort.getZoomLevel(); +// Double[] availableZoomLevels = CanvasPanel.this.plugInPort.getAvailableZoomLevels(); +// int index = Arrays.binarySearch(availableZoomLevels, oldZoom); +// if (index > 0) +// CanvasPanel.this.plugInPort.setZoomLevel(availableZoomLevels[index - 1]); +// } +// }); getActionMap().put("resetZoom", new AbstractAction() { diff --git a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java index 7de953d8..e6a08e6d 100644 --- a/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java +++ b/diylc/diylc-swing/src/org/diylc/swing/plugins/canvas/CanvasPlugin.java @@ -61,19 +61,24 @@ import org.diylc.common.IPlugInPort; import org.diylc.core.ExpansionMode; import org.diylc.core.IDIYComponent; import org.diylc.core.Template; -import org.diylc.swing.images.IconLoader; import org.diylc.core.measures.Size; import org.diylc.core.measures.SizeUnit; import org.diylc.swing.ActionFactory; import org.diylc.swing.ISwingUI; import org.diylc.swing.gui.TranslatedMenu; import org.diylc.swing.gui.TranslatedPopupMenu; +import org.diylc.swing.images.IconLoader; import org.diylc.swing.plugins.edit.ComponentTransferable; import org.diylc.swing.plugins.file.ProjectDrawingProvider; import org.diylc.swingframework.ruler.IRulerListener; import org.diylc.swingframework.ruler.Ruler.InchSubdivision; import org.diylc.swingframework.ruler.RulerScrollPane; +import com.guigarage.gestures.GestureMagnificationEvent; +import com.guigarage.gestures.GestureMagnificationListener; +import com.guigarage.gestures.GestureUtilities; +import com.guigarage.gestures.GesturesNotSupportedException; + public class CanvasPlugin implements IPlugIn, ClipboardOwner { private static final Logger LOG = Logger.getLogger(CanvasPlugin.class); @@ -343,6 +348,55 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { e.isShiftDown(), e.isAltDown()); } }); + + canvasPanel.getActionMap().put("zoomIn", new AbstractAction() { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + LOG.debug("Keyboard zoom-in triggered"); + zoom(-1); + } + }); + + canvasPanel.getActionMap().put("zoomOut", new AbstractAction() { + + private static final long serialVersionUID = 1L; + + @Override + public void actionPerformed(ActionEvent e) { + LOG.debug("Keyboard zoom-out triggered"); + zoom(1); + } + }); + + if (!GestureUtilities.isSupported()) { + LOG.info("Gestures are not supported, skipping initialization"); + } + try { + GestureUtilities.registerListener(canvasPanel, new GestureMagnificationListener() { + + private long prevEventTime = 0; + private static final int DELAY = 100; + + @Override + public void magnify(GestureMagnificationEvent e) { + if (System.currentTimeMillis() - this.prevEventTime < DELAY) + return; + + if (e.getMagnification() > 0) + CanvasPlugin.this.zoom(-1); + else if (e.getMagnification() < 0) + CanvasPlugin.this.zoom(1); + + prevEventTime = System.currentTimeMillis(); + } + }); + LOG.info("Magnification gesture listener initialized."); + } catch (GesturesNotSupportedException e) { + LOG.error("Error registering gesture listener", e); + } } return canvasPanel; } @@ -390,48 +444,7 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { configManager.readBoolean(IPlugInPort.WHEEL_ZOOM_KEY, false); if (wheelZoom || (Utils.isMac() ? e.isMetaDown() : e.isControlDown())) { - - Point mousePos = getCanvasPanel().getMousePosition(true); - - // change zoom level - double oldZoom = plugInPort.getZoomLevel(); - double newZoom; - Double[] availableZoomLevels = plugInPort.getAvailableZoomLevels(); - if (e.getWheelRotation() > 0) { - int i = availableZoomLevels.length - 1; - while (i > 0 && availableZoomLevels[i] >= oldZoom) { - i--; - } - plugInPort.setZoomLevel(newZoom = availableZoomLevels[i]); - } else { - int i = 0; - while (i < availableZoomLevels.length - 1 && availableZoomLevels[i] <= oldZoom) { - i++; - } - plugInPort.setZoomLevel(newZoom = availableZoomLevels[i]); - } - - Rectangle2D selectionBounds = plugInPort.getSelectionBounds(true); - Rectangle visibleRect = scrollPane.getVisibleRect(); - - JScrollBar horizontal = scrollPane.getHorizontalScrollBar(); - JScrollBar vertical = scrollPane.getVerticalScrollBar(); - - if (selectionBounds == null) { - // center to cursor - Point desiredPos = new Point((int) (1d * mousePos.x / oldZoom * newZoom), - (int) (1d * mousePos.y / oldZoom * newZoom)); - int dx = desiredPos.x - mousePos.x; - int dy = desiredPos.y - mousePos.y; - horizontal.setValue(horizontal.getValue() + dx); - vertical.setValue(vertical.getValue() + dy); - } else { - // center to selection - horizontal.setValue((int) (selectionBounds.getX() + selectionBounds.getWidth() / 2 - - visibleRect.getWidth() / 2)); - vertical.setValue((int) (selectionBounds.getY() + selectionBounds.getHeight() / 2 - - visibleRect.getHeight() / 2)); - } + CanvasPlugin.this.zoom(e.getWheelRotation()); } if (e.isShiftDown()) { int iScrollAmount = e.getScrollAmount(); @@ -451,6 +464,50 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { } return scrollPane; } + + public void zoom(int direction) { + Point mousePos = canvasPanel.getMousePosition(true); + + // change zoom level + double oldZoom = plugInPort.getZoomLevel(); + double newZoom; + Double[] availableZoomLevels = plugInPort.getAvailableZoomLevels(); + if (direction > 0) { + int i = availableZoomLevels.length - 1; + while (i > 0 && availableZoomLevels[i] >= oldZoom) { + i--; + } + plugInPort.setZoomLevel(newZoom = availableZoomLevels[i]); + } else { + int i = 0; + while (i < availableZoomLevels.length - 1 && availableZoomLevels[i] <= oldZoom) { + i++; + } + plugInPort.setZoomLevel(newZoom = availableZoomLevels[i]); + } + + Rectangle2D selectionBounds = plugInPort.getSelectionBounds(true); + Rectangle visibleRect = scrollPane.getVisibleRect(); + + JScrollBar horizontal = scrollPane.getHorizontalScrollBar(); + JScrollBar vertical = scrollPane.getVerticalScrollBar(); + + if (selectionBounds == null) { + // center to cursor + Point desiredPos = new Point((int) (1d * mousePos.x / oldZoom * newZoom), + (int) (1d * mousePos.y / oldZoom * newZoom)); + int dx = desiredPos.x - mousePos.x; + int dy = desiredPos.y - mousePos.y; + horizontal.setValue(horizontal.getValue() + dx); + vertical.setValue(vertical.getValue() + dy); + } else { + // center to selection + horizontal.setValue((int) (selectionBounds.getX() + selectionBounds.getWidth() / 2 + - visibleRect.getWidth() / 2)); + vertical.setValue((int) (selectionBounds.getY() + selectionBounds.getHeight() / 2 + - visibleRect.getHeight() / 2)); + } + } private void showPopupAt(int x, int y) { updateSelectionMenu(x, y);