From 3548a3e445724e0b1a6374f18acd8cf6853dcb00 Mon Sep 17 00:00:00 2001 From: daawaan4U Date: Wed, 29 May 2024 13:50:45 +0800 Subject: [PATCH 1/2] Add map zoom out limit --- .../java/edu/project/components/GeoMap.java | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index e2bf9e8..1973260 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -3,7 +3,7 @@ import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; -import java.awt.event.MouseWheelListener; +import java.awt.event.MouseWheelEvent; import java.io.IOException; import java.util.HashSet; @@ -29,9 +29,18 @@ public GeoMap(Context context) { addMouseListener(mouseInputListener); addMouseMotionListener(mouseInputListener); - // Add Zoom Interaction - MouseWheelListener mouseWheelListener = new ZoomMouseWheelListenerCursor(this); - addMouseWheelListener(mouseWheelListener); + // Add Zoom Interaction with a zoom-out limiter + addMouseWheelListener(new ZoomMouseWheelListenerCursor(this) { + @Override + public void mouseWheelMoved(MouseWheelEvent evt) { + int zoom = getZoom(); + int maxZoom = getTileFactory().getInfo().getMaximumZoomLevel(); + int invertedZoom = maxZoom - zoom; + if (invertedZoom < 4) + return; + super.mouseWheelMoved(evt); + } + }); WaypointPainter waypointPainter = new WaypointPainter<>(); HashSet waypoints = new HashSet<>(); From 63ddbbad89703ee793f9f06d6219cd148e89074b Mon Sep 17 00:00:00 2001 From: daawaan4U Date: Wed, 29 May 2024 15:44:20 +0800 Subject: [PATCH 2/2] Add zoom buttons --- src/main/java/edu/project/Store.java | 25 ++++++++++++++ src/main/java/edu/project/components/App.java | 24 ++++++++++++++ .../java/edu/project/components/GeoMap.java | 31 ++++++++++++++--- .../project/components/ZoomButtonGroup.java | 33 +++++++++++++++++++ 4 files changed, 109 insertions(+), 4 deletions(-) create mode 100644 src/main/java/edu/project/components/ZoomButtonGroup.java diff --git a/src/main/java/edu/project/Store.java b/src/main/java/edu/project/Store.java index 6335f8b..87b9fef 100644 --- a/src/main/java/edu/project/Store.java +++ b/src/main/java/edu/project/Store.java @@ -85,4 +85,29 @@ public void setWeatherForecast5Data(WeatherForecast5Data data) { public void addWeatherForecast5DataListener(Consumer listener) { weatherForecast5DataListeners.add(listener); } + + /* Zoom */ + + public void zoomIn() { + SwingUtilities.invokeLater(() -> { + zoomInListeners.forEach(listener -> listener.run()); + }); + } + + public void zoomOut() { + SwingUtilities.invokeLater(() -> { + zoomOutListeners.forEach(listener -> listener.run()); + }); + } + + private ArrayList zoomInListeners = new ArrayList<>(); + private ArrayList zoomOutListeners = new ArrayList<>(); + + public void addZoomInListener(Runnable listener) { + zoomInListeners.add(listener); + } + + public void addZoomOutListener(Runnable listener) { + zoomOutListeners.add(listener); + } } diff --git a/src/main/java/edu/project/components/App.java b/src/main/java/edu/project/components/App.java index 95ee27c..08495c0 100644 --- a/src/main/java/edu/project/components/App.java +++ b/src/main/java/edu/project/components/App.java @@ -55,5 +55,29 @@ public void mouseClicked(MouseEvent e) { Config.WINDOW_INIT_PADDING, (int) (Config.WINDOW_INIT_WIDTH * 0.4), Config.WINDOW_INIT_HEIGHT - Config.WINDOW_INIT_PADDING * 2); + + ZoomButtonGroup zoomButtonGroup = new ZoomButtonGroup(context); + + // Disable click-throughts to the overlapped map + zoomButtonGroup.addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + e.consume(); + } + }); + + layers.add(zoomButtonGroup); + layers.setLayer(zoomButtonGroup, JLayeredPane.MODAL_LAYER + 1); + layers.addComponentListener(new ComponentAdapter() { + @Override + public void componentResized(ComponentEvent e) { + super.componentResized(e); + zoomButtonGroup.setBounds( + layers.getWidth() - 50 - 16, + layers.getHeight() - 100 - 16, + 50, + 100); + } + }); } } diff --git a/src/main/java/edu/project/components/GeoMap.java b/src/main/java/edu/project/components/GeoMap.java index 1973260..a3e6e55 100644 --- a/src/main/java/edu/project/components/GeoMap.java +++ b/src/main/java/edu/project/components/GeoMap.java @@ -33,15 +33,31 @@ public GeoMap(Context context) { addMouseWheelListener(new ZoomMouseWheelListenerCursor(this) { @Override public void mouseWheelMoved(MouseWheelEvent evt) { - int zoom = getZoom(); - int maxZoom = getTileFactory().getInfo().getMaximumZoomLevel(); - int invertedZoom = maxZoom - zoom; - if (invertedZoom < 4) + if (evt.getWheelRotation() > 0 && !canZoomOut()) return; super.mouseWheelMoved(evt); } }); + // Listen Zoom requests from store + context.store.addZoomInListener(() -> { + setZoom(getZoom() - 1); + }); + context.store.addZoomOutListener(() -> { + if (!canZoomOut()) + return; + setZoom(getZoom() + 1); + }); + + // Add Focus on click + addMouseListener(new MouseAdapter() { + @Override + public void mouseClicked(MouseEvent e) { + requestFocus(); + super.mouseClicked(e); + } + }); + WaypointPainter waypointPainter = new WaypointPainter<>(); HashSet waypoints = new HashSet<>(); DefaultWaypoint waypoint = new DefaultWaypoint(); @@ -75,4 +91,11 @@ public void mouseClicked(MouseEvent event) { setCenterPosition(context.store.getLocation()); setZoom(Config.MAP_INIT_ZOOM); } + + private boolean canZoomOut() { + int zoom = getZoom(); + int maxZoom = getTileFactory().getInfo().getMaximumZoomLevel(); + int invertedZoom = maxZoom - zoom; + return (invertedZoom >= 4); + } } diff --git a/src/main/java/edu/project/components/ZoomButtonGroup.java b/src/main/java/edu/project/components/ZoomButtonGroup.java new file mode 100644 index 0000000..15c589c --- /dev/null +++ b/src/main/java/edu/project/components/ZoomButtonGroup.java @@ -0,0 +1,33 @@ +package edu.project.components; + +import java.awt.Color; +import java.awt.Font; +import java.awt.GridLayout; + +import javax.swing.JButton; +import javax.swing.JPanel; + +import edu.project.Context; + +public class ZoomButtonGroup extends JPanel { + public ZoomButtonGroup(Context context) { + setOpaque(false); + setLayout(new GridLayout(2, 1)); + + JButton zoomInButton = new JButton("+"); + zoomInButton.setFont(new Font("Arial", Font.PLAIN, 32)); + zoomInButton.setForeground(Color.GRAY); + add(zoomInButton); + zoomInButton.addActionListener(e -> { + context.store.zoomIn(); + }); + + JButton zoomOutButton = new JButton("-"); + zoomOutButton.setForeground(Color.GRAY); + zoomOutButton.setFont(new Font("Arial", Font.PLAIN, 32)); + add(zoomOutButton); + zoomOutButton.addActionListener(e -> { + context.store.zoomOut(); + }); + } +}