From 2a6ad6f573a3d7caeffc7b9ce86ec8758d63306c Mon Sep 17 00:00:00 2001 From: Unknown Date: Mon, 24 Sep 2018 15:07:55 +0200 Subject: [PATCH] instancemap: add 'X' button on the interface to close map --- .../instancemap/InstanceMapInputListener.java | 26 ++++++++++++ .../instancemap/InstanceMapOverlay.java | 42 ++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java index eb4839de33..62ea0e40c1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapInputListener.java @@ -29,6 +29,7 @@ import java.awt.event.KeyEvent; import java.awt.event.MouseEvent; import java.awt.event.MouseWheelEvent; import javax.inject.Inject; +import javax.swing.SwingUtilities; import net.runelite.client.input.KeyListener; import net.runelite.client.input.MouseListener; import net.runelite.client.input.MouseWheelListener; @@ -111,12 +112,37 @@ public class InstanceMapInputListener extends MouseListener implements KeyListen return event; } + if (SwingUtilities.isLeftMouseButton(event) && isWithinCloseButton(event.getPoint())) + { + plugin.closeMap(); + } + event.consume(); return event; } + @Override + public MouseEvent mouseMoved(MouseEvent event) + { + if (overlay.isMapShown()) + { + overlay.setCloseButtonHovered(isWithinCloseButton(event.getPoint())); + } + + return event; + } + private boolean isNotWithinOverlay(final Point point) { return !overlay.getBounds().contains(point); } + + private boolean isWithinCloseButton(final Point point) + { + Point overlayPoint = new Point(point.x - (int) overlay.getBounds().getX(), + point.y - (int) overlay.getBounds().getY()); + + return overlay.getCloseButtonBounds() != null + && overlay.getCloseButtonBounds().contains(overlayPoint); + } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java index 2cb0625bed..3e44e6d4b8 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/instancemap/InstanceMapOverlay.java @@ -31,17 +31,22 @@ import java.awt.Rectangle; import java.awt.image.BufferedImage; import javax.inject.Inject; import javax.inject.Singleton; +import lombok.Getter; +import lombok.Setter; import net.runelite.api.Client; import net.runelite.api.Player; import net.runelite.api.SpritePixels; import net.runelite.api.Tile; import net.runelite.api.coords.LocalPoint; import net.runelite.api.events.GameStateChanged; +import net.runelite.client.game.SpriteManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.BackgroundComponent; +import static net.runelite.api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X; +import static net.runelite.api.SpriteID.WINDOW_CLOSE_BUTTON_RED_X_HOVERED; @Singleton class InstanceMapOverlay extends Overlay @@ -70,6 +75,7 @@ class InstanceMapOverlay extends Overlay private int viewedPlane = 0; private final Client client; + private final SpriteManager spriteManager; /** * Saved image of the scene, no reason to draw the whole thing every @@ -79,10 +85,18 @@ class InstanceMapOverlay extends Overlay private volatile boolean showMap = false; private final BackgroundComponent backgroundComponent = new BackgroundComponent(); + @Setter + private boolean isCloseButtonHovered; + @Getter + private Rectangle closeButtonBounds; + private BufferedImage closeButtonImage; + private BufferedImage closeButtonHoveredImage; + @Inject - InstanceMapOverlay(Client client) + InstanceMapOverlay(Client client, SpriteManager spriteManager) { this.client = client; + this.spriteManager = spriteManager; setPriority(OverlayPriority.HIGH); setPosition(OverlayPosition.TOP_LEFT); setLayer(OverlayLayer.ABOVE_WIDGETS); @@ -152,6 +166,8 @@ class InstanceMapOverlay extends Overlay if (image == null) { + BufferedImage closeButton = getCloseButtonImage(); + SpritePixels map = client.drawInstanceMap(viewedPlane); image = minimapToBufferedImage(map); synchronized (this) @@ -161,6 +177,9 @@ class InstanceMapOverlay extends Overlay mapImage = image; } } + + closeButtonBounds = new Rectangle(image.getWidth() - closeButton.getWidth() - 5, 6, + closeButton.getWidth(), closeButton.getHeight()); } graphics.drawImage(image, 0, 0, null); @@ -172,6 +191,9 @@ class InstanceMapOverlay extends Overlay drawPlayerDot(graphics, client.getLocalPlayer(), Color.white, Color.black); } + graphics.drawImage(isCloseButtonHovered ? getCloseButtonHoveredImage() : getCloseButtonImage(), + (int) closeButtonBounds.getX(), (int) closeButtonBounds.getY(), null); + return new Dimension(image.getWidth(), image.getHeight()); } @@ -229,4 +251,22 @@ class InstanceMapOverlay extends Overlay img = img.getSubimage(48, 48, TILE_SIZE * 104, TILE_SIZE * 104); return img; } + + private BufferedImage getCloseButtonImage() + { + if (closeButtonImage == null) + { + closeButtonImage = spriteManager.getSprite(WINDOW_CLOSE_BUTTON_RED_X, 0); + } + return closeButtonImage; + } + + private BufferedImage getCloseButtonHoveredImage() + { + if (closeButtonHoveredImage == null) + { + closeButtonHoveredImage = spriteManager.getSprite(WINDOW_CLOSE_BUTTON_RED_X_HOVERED, 0); + } + return closeButtonHoveredImage; + } }