From d700ebc2572cb04e4f5e3df85973ed7c8e90c5ae Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 21 Jul 2018 00:02:44 +0200 Subject: [PATCH 1/4] Add support for resetting the detached overlays Add support for resetting saved data for detached overlays. Signed-off-by: Tomas Slusny --- .../net/runelite/client/ui/overlay/OverlayRenderer.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) 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 b746270971..e30977145c 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 @@ -242,11 +242,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener { if (SwingUtilities.isRightMouseButton(mouseEvent)) { - // detached overlays have no place to reset back to - if (overlay.getPosition() != OverlayPosition.DETACHED) - { - overlayManager.resetOverlay(overlay); - } + overlayManager.resetOverlay(overlay); } else { From 84473262ba6709d26525686fc838d2b6e137af46 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sun, 22 Jul 2018 11:55:42 +0200 Subject: [PATCH 2/4] Use Overlay#getBounds for getting correct bounds Use Overlay#getBounds for getting correct bounds in OverlayManager in case overlay overrides getBounds with custom functionality. Signed-off-by: Tomas Slusny --- .../net/runelite/client/ui/overlay/OverlayRenderer.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) 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 e30977145c..365383ff64 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 @@ -205,9 +205,9 @@ public class OverlayRenderer extends MouseListener implements KeyListener } safeRender(client, overlay, layer, graphics, location); - dimension.setSize(overlay.getBounds().getSize()); + final Rectangle bounds = overlay.getBounds(); - if (dimension.width == 0 && dimension.height == 0) + if (bounds.isEmpty()) { continue; } @@ -216,7 +216,7 @@ public class OverlayRenderer extends MouseListener implements KeyListener { final Color previous = graphics.getColor(); graphics.setColor(movedOverlay == overlay ? MOVING_OVERLAY_ACTIVE_COLOR : MOVING_OVERLAY_COLOR); - graphics.drawRect(location.x, location.y, dimension.width - 1, dimension.height - 1); + graphics.draw(bounds); graphics.setColor(previous); } } @@ -391,7 +391,6 @@ public class OverlayRenderer extends MouseListener implements KeyListener subGraphics.setFont(FontManager.getRunescapeFont()); } - subGraphics.translate(point.x, point.y); final Dimension dimension = MoreObjects.firstNonNull(overlay.render(subGraphics), new Dimension()); subGraphics.dispose(); From 2627f08f18dbc66cf5a2defd09f9b39f79805e65 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 21 Jul 2018 00:03:25 +0200 Subject: [PATCH 3/4] Add experience tracker widget WidgetInfo Signed-off-by: Tomas Slusny --- .../src/main/java/net/runelite/api/widgets/WidgetID.java | 2 +- .../src/main/java/net/runelite/api/widgets/WidgetInfo.java | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java index 32ffcfa9ef..858564cbf9 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetID.java @@ -513,7 +513,7 @@ public class WidgetID static class ExperienceTracker { - static final int WIDGET = 1; + static final int WIDGET = 2; static final int BOTTOM_BAR = 14; } diff --git a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java index bdaf93d0cd..c56a29ab62 100644 --- a/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java +++ b/runelite-api/src/main/java/net/runelite/api/widgets/WidgetInfo.java @@ -343,7 +343,8 @@ public enum WidgetInfo PYRAMID_PLUNDER_DATA(WidgetID.PYRAMID_PLUNDER_GROUP_ID, 0), - EXPERIENCE_TRACKER(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.WIDGET), + EXPERIENCE_TRACKER(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, 0), + EXPERIENCE_TRACKER_WIDGET(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.WIDGET), EXPERIENCE_TRACKER_BOTTOM_BAR(WidgetID.EXPERIENCE_TRACKER_GROUP_ID, WidgetID.ExperienceTracker.BOTTOM_BAR), TITHE_FARM(WidgetID.TITHE_FARM_GROUP_ID, 1), From a3ddd47a290bfef5c2ff0e892ab3e5848d0b7bb1 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Sat, 21 Jul 2018 00:04:07 +0200 Subject: [PATCH 4/4] Add support for RS movable widgets Add support for adding RS widgets to RuneLite overlay system and make them moveable with persisted positions during restarts. Depends on #3820 for widget ids Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 2 + .../client/ui/overlay/WidgetOverlay.java | 139 ++++++++++++++++++ 2 files changed, 141 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index 1dd7603ba2..dc4ecb4394 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -57,6 +57,7 @@ import net.runelite.client.ui.ClientUI; import net.runelite.client.ui.DrawManager; import net.runelite.client.ui.overlay.OverlayManager; import net.runelite.client.ui.overlay.OverlayRenderer; +import net.runelite.client.ui.overlay.WidgetOverlay; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.ui.overlay.infobox.InfoBoxOverlay; import net.runelite.client.ui.overlay.tooltip.TooltipOverlay; @@ -260,6 +261,7 @@ public class RuneLite if (!isOutdated) { eventBus.register(itemManager.get()); + WidgetOverlay.createOverlays(client).forEach(overlayManager::add); } // Add core overlays after configuration has been loaded so their properties will be diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java new file mode 100644 index 0000000000..a2a8249c9c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/WidgetOverlay.java @@ -0,0 +1,139 @@ +/* + * Copyright (c) 2018, Tomas Slusny + * 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 com.google.common.collect.ImmutableSet; +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.Rectangle; +import java.util.Objects; +import java.util.Set; +import java.util.stream.Collectors; +import net.runelite.api.Client; +import net.runelite.api.widgets.Widget; +import net.runelite.api.widgets.WidgetInfo; + +public class WidgetOverlay extends Overlay +{ + private static final Set WIDGETS = ImmutableSet.of( + WidgetInfo.RESIZABLE_MINIMAP_WIDGET, + WidgetInfo.RESIZABLE_MINIMAP_STONES_WIDGET, + WidgetInfo.EXPERIENCE_TRACKER_WIDGET + ); + + public static Set createOverlays(final Client client) + { + return WIDGETS.stream().map(w -> new WidgetOverlay(client, w)).collect(Collectors.toSet()); + } + + private final Client client; + private final WidgetInfo widgetInfo; + private Integer toRestoreX; + private Integer toRestoreY; + + private WidgetOverlay(final Client client, final WidgetInfo widgetInfo) + { + this.client = client; + this.widgetInfo = widgetInfo; + setLayer(OverlayLayer.UNDER_WIDGETS); + setPosition(OverlayPosition.DETACHED); + } + + @Override + public String getName() + { + return Objects.toString(widgetInfo); + } + + @Override + public Rectangle getBounds() + { + final Widget widget = client.getWidget(widgetInfo); + + if (widget != null && !widget.isHidden()) + { + return new Rectangle( + widget.getOriginalX() + widget.getRelativeX(), + widget.getOriginalY() + widget.getRelativeY(), + widget.getWidth(), widget.getHeight()); + } + + return new Rectangle(); + } + + @Override + public Dimension render(Graphics2D graphics) + { + final Widget widget = client.getWidget(widgetInfo); + + if (widget == null || widget.isHidden()) + { + return null; + } + + if (getPreferredLocation() == null) + { + if (toRestoreX != null) + { + widget.setRelativeX(toRestoreX); + toRestoreX = null; + } + + if (toRestoreY != null) + { + widget.setRelativeY(toRestoreY); + toRestoreY = null; + } + + return null; + } + + final Rectangle bounds = getBounds(); + int x = getPreferredLocation().x - widget.getOriginalX(); + int y = getPreferredLocation().y - widget.getOriginalY(); + x = Math.max(0, x); + y = Math.max(0, y); + + final Widget parent = widget.getParent(); + final Dimension dimensions = parent == null ? client.getRealDimensions() : new Dimension(parent.getWidth(), parent.getHeight()); + x = Math.min(dimensions.width - bounds.width, x); + y = Math.min(dimensions.height - bounds.height, y); + + if (toRestoreX == null) + { + toRestoreX = widget.getRelativeX(); + } + + if (toRestoreY == null) + { + toRestoreY = widget.getRelativeY(); + } + + widget.setRelativeX(x); + widget.setRelativeY(y); + + return null; + } +}