From 422545ffe27182722e42f47c47203eef982678d1 Mon Sep 17 00:00:00 2001 From: bancika Date: Tue, 11 Apr 2017 17:49:39 +0200 Subject: [PATCH] Zooming tracks mouse cursor position --- .../swing/plugins/canvas/CanvasPlugin.java | 61 ++++++++++++------- diylc/diylc-swing/update.xml | 6 +- 2 files changed, 43 insertions(+), 24 deletions(-) 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 95d90ef5..d1236e6d 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 @@ -22,6 +22,7 @@ import java.util.List; import javax.swing.JMenu; import javax.swing.JMenuItem; import javax.swing.JPopupMenu; +import javax.swing.JScrollBar; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; @@ -201,16 +202,9 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { new RulerScrollPane(getCanvasPanel(), new ProjectDrawingProvider(plugInPort, true, false), new Size(1d, SizeUnit.cm).convertToPixels(), new Size(1d, SizeUnit.in).convertToPixels()); boolean metric = ConfigurationManager.getInstance().readBoolean(Presenter.METRIC_KEY, true); - boolean wheelZoom = ConfigurationManager.getInstance().readBoolean(IPlugInPort.WHEEL_ZOOM_KEY, false); - ConfigurationManager.getInstance().addConfigListener(IPlugInPort.WHEEL_ZOOM_KEY, new IConfigListener() { - @Override - public void valueChanged(String key, Object value) { - scrollPane.setWheelScrollingEnabled(!(Boolean) value); - } - }); scrollPane.setMetric(metric); - scrollPane.setWheelScrollingEnabled(!wheelZoom); + scrollPane.setWheelScrollingEnabled(true); scrollPane.addUnitListener(new IRulerListener() { @Override @@ -223,23 +217,44 @@ public class CanvasPlugin implements IPlugIn, ClipboardOwner { @Override public void mouseWheelMoved(MouseWheelEvent e) { boolean wheelZoom = ConfigurationManager.getInstance().readBoolean(IPlugInPort.WHEEL_ZOOM_KEY, false); - if (!wheelZoom) { - return; - } - double d = plugInPort.getZoomLevel(); - Double[] availableZoomLevels = plugInPort.getAvailableZoomLevels(); - if (e.getWheelRotation() > 0) { - int i = availableZoomLevels.length - 1; - while (i > 0 && availableZoomLevels[i] >= d) { - i--; + + if (wheelZoom || e.isControlDown()) { + // disable scrolling + scrollPane.setWheelScrollingEnabled(false); + + Dimension oldDim = plugInPort.getCanvasDimensions(true); + + // change zoom level + double d = plugInPort.getZoomLevel(); + Double[] availableZoomLevels = plugInPort.getAvailableZoomLevels(); + if (e.getWheelRotation() > 0) { + int i = availableZoomLevels.length - 1; + while (i > 0 && availableZoomLevels[i] >= d) { + i--; + } + plugInPort.setZoomLevel(availableZoomLevels[i]); + } else { + int i = 0; + while (i < availableZoomLevels.length - 1 && availableZoomLevels[i] <= d) { + i++; + } + plugInPort.setZoomLevel(availableZoomLevels[i]); + // center to cursor + Point mousePos = getCanvasPanel().getMousePosition(true); + Dimension newDim = plugInPort.getCanvasDimensions(true); + Point desiredPos = + new Point((int) (1d * mousePos.x / oldDim.width * newDim.width), (int) (1d * mousePos.y + / oldDim.height * newDim.height)); + int dx = desiredPos.x - mousePos.x; + int dy = desiredPos.y - mousePos.y; + JScrollBar horizontal = scrollPane.getHorizontalScrollBar(); + horizontal.setValue(horizontal.getValue() + dx); + JScrollBar vertical = scrollPane.getVerticalScrollBar(); + vertical.setValue(vertical.getValue() + dy); } - plugInPort.setZoomLevel(availableZoomLevels[i]); } else { - int i = 0; - while (i < availableZoomLevels.length - 1 && availableZoomLevels[i] <= d) { - i++; - } - plugInPort.setZoomLevel(availableZoomLevels[i]); + // enable scrolling + scrollPane.setWheelScrollingEnabled(true); } } }); diff --git a/diylc/diylc-swing/update.xml b/diylc/diylc-swing/update.xml index b9149c9d..0eec600f 100644 --- a/diylc/diylc-swing/update.xml +++ b/diylc/diylc-swing/update.xml @@ -1645,7 +1645,11 @@ 2017-04-10 20:00:00.000 CET - + + + NEW_FEATURE + Hold Control key to zoom with mouse wheel. Zooming tracks mouse cursor position. + IMPROVEMENT Hookup wire can be sent to back behind boards