From 2d5b2b78fd6a66580acf09abb4924a8d1dd3c419 Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Sun, 15 Oct 2017 23:40:53 -0500 Subject: [PATCH 1/2] Store overlay bounds for overlays at LEFT and RIGHT OverlayPositions --- .../java/net/runelite/client/ui/overlay/Overlay.java | 12 ++++++++++++ .../client/ui/overlay/TopDownRendererLeft.java | 5 ++++- .../client/ui/overlay/TopDownRendererRight.java | 4 ++++ 3 files changed, 20 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java index 391c04baf0..5d3069cec2 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/Overlay.java @@ -27,11 +27,13 @@ package net.runelite.client.ui.overlay; import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.Rectangle; public abstract class Overlay { private OverlayPosition position; // where to draw it private OverlayPriority priority; // if multiple overlays exist in the same position, who wins + private Rectangle bounds; //screen bounds of overlay after OverlayRenderer decides location public Overlay(OverlayPosition position) { @@ -65,4 +67,14 @@ public abstract class Overlay } public abstract Dimension render(Graphics2D graphics); + + public Rectangle getBounds() + { + return bounds; + } + + public void storeBounds(Rectangle bounds) + { + this.bounds = bounds; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererLeft.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererLeft.java index ee5258b00c..2053b8cf4f 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererLeft.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererLeft.java @@ -22,11 +22,11 @@ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ - package net.runelite.client.ui.overlay; import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; @@ -61,6 +61,9 @@ public class TopDownRendererLeft implements Renderer if (dimension == null) continue; + Rectangle bounds = new Rectangle(BORDER_LEFT, y, (int) dimension.getWidth(), (int) dimension.getHeight()); + overlay.storeBounds(bounds); + y += dimension.getHeight() + PADDING; } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererRight.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererRight.java index bdb1067abf..5f03d511e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererRight.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/TopDownRendererRight.java @@ -26,6 +26,7 @@ package net.runelite.client.ui.overlay; import java.awt.Dimension; import java.awt.Graphics2D; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.List; @@ -74,6 +75,9 @@ public class TopDownRendererRight implements Renderer graphics.drawImage(image, clientWidth - BORDER_RIGHT - (int) dimension.getWidth(), y, null); graphics.dispose(); + Rectangle bounds = new Rectangle(clientWidth - BORDER_RIGHT - (int) dimension.getWidth(), y, (int) dimension.getWidth(), (int) dimension.getHeight()); + overlay.storeBounds(bounds); + y += dimension.getHeight() + PADDING; } } From 9fe360d6148669aa25ed3056889603aca9f4ab1b Mon Sep 17 00:00:00 2001 From: Tyler Hardy Date: Mon, 16 Oct 2017 00:10:06 -0500 Subject: [PATCH 2/2] Add tooltips for InfoBoxes --- .../client/ui/overlay/infobox/InfoBox.java | 12 ++++++ .../ui/overlay/infobox/InfoBoxOverlay.java | 41 ++++++++++++++++++- 2 files changed, 52 insertions(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java index 347bd5d5fb..87ed93b1c6 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java @@ -31,6 +31,8 @@ public abstract class InfoBox { private final BufferedImage image; + private String tooltip; + public InfoBox(BufferedImage image) { this.image = image; @@ -54,4 +56,14 @@ public abstract class InfoBox { return false; } + + public String getTooltip() + { + return tooltip; + } + + public void setTooltip(String tooltip) + { + this.tooltip = tooltip; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java index abbdcf9e46..c5ae5ec367 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java @@ -29,10 +29,12 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; +import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.List; import net.runelite.api.Client; import net.runelite.api.GameState; +import net.runelite.api.Point; import net.runelite.client.RuneLite; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; @@ -69,9 +71,14 @@ public class InfoBoxOverlay extends Overlay FontMetrics metrics = graphics.getFontMetrics(); - int width = infoBoxes.size() * BOXSIZE; + int width = infoBoxes.size() * (BOXSIZE + SEPARATOR); + + Point mouse = client.getMouseCanvasPosition(); + int mouseX = mouse.getX(); + int mouseY = mouse.getY(); int x = 0; + Rectangle overlayBounds = this.getBounds(); for (InfoBox box : infoBoxes) { if (!box.render()) @@ -101,6 +108,38 @@ public class InfoBoxOverlay extends Overlay graphics.setColor(color); graphics.drawString(str, x + ((BOXSIZE - metrics.stringWidth(str)) / 2), BOXSIZE - SEPARATOR); + if (overlayBounds == null) + { + continue; + } + + String tooltip = box.getTooltip(); + if (tooltip == null || tooltip.isEmpty()) + { + continue; + } + + Rectangle bounds = new Rectangle((int) overlayBounds.getX() + x, (int) overlayBounds.getY(), BOXSIZE, BOXSIZE); + if (bounds.contains(mouse.getX(), mouse.getY())) + { + int tooltipWidth = metrics.stringWidth(tooltip); + int height = metrics.getHeight(); + + Color gray = new Color(Color.darkGray.getRed(), Color.darkGray.getGreen(), Color.darkGray.getBlue(), 190); + graphics.setColor(gray); + + // Draws the background rect + graphics.fillRect(mouseX, mouseY - (height / 2), tooltipWidth + 6, height); + + // Draws the outline of the rect + graphics.setColor(Color.BLACK); + graphics.drawRect(mouseX, mouseY - (height / 2), tooltipWidth + 6, height); + + // Tooltip text + graphics.setColor(Color.WHITE); + graphics.drawString(tooltip, mouseX + 3, mouseY + 5); + } + x += BOXSIZE + SEPARATOR; }