From 96ba339a5799400543d5463dbf419a2c050e2667 Mon Sep 17 00:00:00 2001 From: Serg1o Date: Thu, 16 Apr 2020 00:02:37 +0200 Subject: [PATCH] Feature: map zoom now works with ctrl+mouse wheel --- src/VASSAL/build/module/Map.java | 34 +++++++++++++++++++++-- src/VASSAL/build/module/map/Scroller.java | 23 ++++++++++++++- src/VASSAL/build/module/map/Zoomer.java | 25 +++++++++++++++++ 3 files changed, 79 insertions(+), 3 deletions(-) diff --git a/src/VASSAL/build/module/Map.java b/src/VASSAL/build/module/Map.java index b3bf4570..914c0426 100644 --- a/src/VASSAL/build/module/Map.java +++ b/src/VASSAL/build/module/Map.java @@ -48,6 +48,8 @@ import java.awt.event.MouseEvent; import java.awt.event.MouseListener; import java.awt.event.MouseMotionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; import java.awt.event.WindowAdapter; import java.awt.event.WindowEvent; import java.awt.geom.AffineTransform; @@ -182,7 +184,7 @@ * A Map may contain many different {@link Buildable} subcomponents. Components which are added directly to a Map are * contained in the VASSAL.build.module.map package */ -public class Map extends AbstractConfigurable implements GameComponent, MouseListener, MouseMotionListener, DropTargetListener, Configurable, +public class Map extends AbstractConfigurable implements GameComponent, MouseListener, MouseMotionListener, MouseWheelListener, DropTargetListener, Configurable, UniqueIdManager.Identifyable, ToolBarComponent, MutablePropertiesContainer, PropertySource, PlayerRoster.SideChangeListener { protected static boolean changeReportingEnabled = true; protected String mapID = ""; //$NON-NLS-1$ @@ -209,7 +211,9 @@ public class Map extends AbstractConfigurable implements GameComponent, MouseLis protected String markUnmovedTooltip = Resources.getString("Map.mark_unmoved"); //$NON-NLS-1$ protected MouseListener multicaster = null; protected ArrayList mouseListenerStack = - new ArrayList(); + new ArrayList(); + protected ArrayList mouseWheelListenerStack = + new ArrayList(); protected List boards = new CopyOnWriteArrayList(); protected int[][] boardWidths; // Cache of board widths by row/column protected int[][] boardHeights; // Cache of board heights by row/column @@ -243,6 +247,7 @@ public void propertyChange(PropertyChangeEvent evt) { public Map() { getView(); theMap.addMouseListener(this); + theMap.addMouseWheelListener(this); if (shouldDockIntoMainWindow()) { toolBar.setLayout(new MigLayout("ins 0,gapx 0,hidemode 3")); } @@ -1207,6 +1212,14 @@ public void pushMouseListener(MouseListener l) { mouseListenerStack.add(l); } + /** + * MouseWheelListeners on a map may be pushed and popped onto a stack. + * Only the top listener on the stack receives mouse wheel events. + */ + public void pushMouseWheelListener(MouseWheelListener l) { + mouseWheelListenerStack.add(l); + } + /** * MouseListeners on a map may be pushed and popped onto a stack. Only the top listener on the stack receives mouse * events @@ -1215,6 +1228,14 @@ public void popMouseListener() { mouseListenerStack.remove(mouseListenerStack.size()-1); } + /** + * MouseWheelListeners on a map may be pushed and popped onto a stack. Only the top listener on the stack receives mouse + * wheel events + */ + public void popMouseWheelListener() { + mouseWheelListenerStack.remove(mouseWheelListenerStack.size()-1); + } + public void mouseEntered(MouseEvent e) { } @@ -1242,6 +1263,15 @@ else if (multicaster != null) { } } + @Override + public void mouseWheelMoved(MouseWheelEvent e) { + if (mouseWheelListenerStack.isEmpty()) { + return; + } + + mouseWheelListenerStack.get(mouseWheelListenerStack.size() - 1).mouseWheelMoved(e); + } + /** * Mouse events are first translated into map coordinates. Then the event is forwarded to the top MouseListener in the * stack, if any, otherwise forwarded to all LocalMouseListeners diff --git a/src/VASSAL/build/module/map/Scroller.java b/src/VASSAL/build/module/map/Scroller.java index a7bb58bb..c94a7196 100644 --- a/src/VASSAL/build/module/map/Scroller.java +++ b/src/VASSAL/build/module/map/Scroller.java @@ -27,6 +27,8 @@ import VASSAL.build.module.Map; import VASSAL.configure.BooleanConfigurer; import VASSAL.i18n.Resources; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; /** * This component listens to key events on a Map window and @@ -34,7 +36,7 @@ * will use number keypad or arrow keys, or will offer a * preferences setting for the user to choose */ -public class Scroller extends AbstractBuildable implements KeyListener { +public class Scroller extends AbstractBuildable implements KeyListener, MouseWheelListener { /** * The attribute name for whether to use arrow keys * instead of number keypad. Should be one of ALWAYS, NEVER, or PROMPT @@ -52,6 +54,7 @@ public class Scroller extends AbstractBuildable implements KeyListener { public void addTo(Buildable parent) { map = (Map) parent; map.getView().addKeyListener(this); + map.getView().addMouseWheelListener(this); final BooleanConfigurer c = new BooleanConfigurer( USE_ARROWS, @@ -143,4 +146,22 @@ public void keyTyped(KeyEvent e) { noEcho = 0; } } + + @Override + public void mouseWheelMoved(MouseWheelEvent event) { + int dx = 0; + int dy; + int direction = event.getWheelRotation(); + if (direction > 0) + { + dy = 1; + } + else + { + dy = -1; + } + + map.scroll(dx * xStep, dy * yStep); + event.consume(); + } } diff --git a/src/VASSAL/build/module/map/Zoomer.java b/src/VASSAL/build/module/map/Zoomer.java index 4581b829..56415ec9 100644 --- a/src/VASSAL/build/module/map/Zoomer.java +++ b/src/VASSAL/build/module/map/Zoomer.java @@ -29,6 +29,8 @@ import java.awt.Rectangle; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; +import java.awt.event.MouseWheelEvent; +import java.awt.event.MouseWheelListener; import java.util.ArrayList; import java.util.Arrays; import java.util.Collection; @@ -658,6 +660,29 @@ public void addTo(Buildable b) { map.getToolBar().add(zoomInButton); map.getToolBar().add(zoomPickButton); map.getToolBar().add(zoomOutButton); + + + MouseWheelListener mouseWheelListener = new MouseWheelListener() { + @Override + public void mouseWheelMoved(MouseWheelEvent event) { + if(!event.isControlDown()) { + return; + } + + int direction = event.getWheelRotation(); + if (direction > 0) + { + zoomOut(); + } + else + { + zoomIn(); + } + event.consume(); + } + }; + + map.pushMouseWheelListener(mouseWheelListener); } public String getAttributeValueString(String key) {