diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java index 27c85dba67..3f1fd27839 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayPosition.java @@ -49,5 +49,9 @@ public enum OverlayPosition /** * Place overlay directly above right most area of chatbox possible */ - ABOVE_CHATBOX_RIGHT; + ABOVE_CHATBOX_RIGHT, + /** + * Tooltip overlay + */ + TOOLTIP; } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java index 96a8dfb9fa..664e9986b4 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/OverlayRenderer.java @@ -110,7 +110,7 @@ public class OverlayRenderer overlays.removeAll(event.getPlugin().getOverlays()); } - sortOverlays(); + sortOverlays(overlays); } private void refreshPlugins() @@ -123,10 +123,10 @@ public class OverlayRenderer .flatMap(plugin -> plugin.getOverlays().stream()), Stream.of(infoBoxOverlay, tooltipOverlay)) .collect(Collectors.toList())); - sortOverlays(); + sortOverlays(overlays); } - private void sortOverlays() + static void sortOverlays(List overlays) { overlays.sort((a, b) -> { @@ -235,7 +235,7 @@ public class OverlayRenderer break; } - if (overlayPosition.equals(OverlayPosition.DYNAMIC)) + if (overlayPosition == OverlayPosition.DYNAMIC || overlayPosition == OverlayPosition.TOOLTIP) { safeRender(overlay, graphics, new Point()); } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java index c27b7dc8de..b58afd5e79 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/tooltip/TooltipOverlay.java @@ -44,7 +44,7 @@ public class TooltipOverlay extends Overlay @Inject public TooltipOverlay(TooltipManager tooltipManager, Provider clientProvider) { - setPosition(OverlayPosition.DYNAMIC); + setPosition(OverlayPosition.TOOLTIP); setPriority(OverlayPriority.HIGH); this.tooltipManager = tooltipManager; this.clientProvider = clientProvider; diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayRendererTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayRendererTest.java new file mode 100644 index 0000000000..7a5de1fcb2 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/OverlayRendererTest.java @@ -0,0 +1,90 @@ +/* + * Copyright (c) 2016-2017, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (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.Point; +import java.util.Arrays; +import java.util.List; +import static org.junit.Assert.assertEquals; +import org.junit.Test; + +class TestOverlay extends Overlay +{ + public TestOverlay(OverlayPosition position, OverlayPriority priority) + { + setPosition(position); + setPriority(priority); + } + + @Override + public Dimension render(Graphics2D graphics, Point parent) + { + throw new UnsupportedOperationException("Not supported yet."); + } +} + +public class OverlayRendererTest +{ + @Test + public void testSort() + { + // High priorities overlays render first + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + Overlay tll = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.LOW); + List overlays = Arrays.asList(tlh, tll); + OverlayRenderer.sortOverlays(overlays); + assertEquals(tlh, overlays.get(0)); + assertEquals(tll, overlays.get(1)); + } + + @Test + public void testSortDynamic() + { + // Dynamic overlays render before static overlays + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH); + List overlays = Arrays.asList(tlh, dyn); + OverlayRenderer.sortOverlays(overlays); + assertEquals(dyn, overlays.get(0)); + assertEquals(tlh, overlays.get(1)); + } + + @Test + public void testTooltips() + { + // Tooltip overlay renders after everything + Overlay t = new TestOverlay(OverlayPosition.TOOLTIP, OverlayPriority.HIGH); + Overlay dyn = new TestOverlay(OverlayPosition.DYNAMIC, OverlayPriority.HIGH); + Overlay tlh = new TestOverlay(OverlayPosition.TOP_LEFT, OverlayPriority.HIGH); + List overlays = Arrays.asList(t, dyn, tlh); + OverlayRenderer.sortOverlays(overlays); + assertEquals(dyn, overlays.get(0)); + assertEquals(tlh, overlays.get(1)); + assertEquals(t, overlays.get(2)); + } + +}