widgetoverlay: support detached overlays
This adds support for moving the wilderness icon layer, which is not in an area near a snap corner. With no preferred location set the overlay adjusts its bounds to the widget bounds and will not adjust the widget position.
This commit is contained in:
@@ -774,6 +774,7 @@ public class WidgetID
|
|||||||
static class Pvp
|
static class Pvp
|
||||||
{
|
{
|
||||||
static final int KILLDEATH_RATIO = 26;
|
static final int KILLDEATH_RATIO = 26;
|
||||||
|
static final int WILDERNESS_SKULL_CONTAINER = 44;
|
||||||
static final int SKULL_CONTAINER = 45;
|
static final int SKULL_CONTAINER = 45;
|
||||||
static final int SAFE_ZONE = 47;
|
static final int SAFE_ZONE = 47;
|
||||||
static final int WILDERNESS_LEVEL = 50; // this can also be the Deadman Mode "Protection" text
|
static final int WILDERNESS_LEVEL = 50; // this can also be the Deadman Mode "Protection" text
|
||||||
|
|||||||
@@ -501,6 +501,7 @@ public enum WidgetInfo
|
|||||||
SPELL_ARCEUUS_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.ArceuusSpellBook.ARCEUUS_HOME_TELEPORT),
|
SPELL_ARCEUUS_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.ArceuusSpellBook.ARCEUUS_HOME_TELEPORT),
|
||||||
SPELL_KOUREND_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.StandardSpellBook.KOUREND_HOME_TELEPORT),
|
SPELL_KOUREND_HOME_TELEPORT(WidgetID.SPELLBOOK_GROUP_ID, WidgetID.StandardSpellBook.KOUREND_HOME_TELEPORT),
|
||||||
|
|
||||||
|
PVP_WILDERNESS_SKULL_CONTAINER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.WILDERNESS_SKULL_CONTAINER),
|
||||||
PVP_SKULL_CONTAINER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SKULL_CONTAINER),
|
PVP_SKULL_CONTAINER(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SKULL_CONTAINER),
|
||||||
PVP_WORLD_SAFE_ZONE(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SAFE_ZONE),
|
PVP_WORLD_SAFE_ZONE(WidgetID.PVP_GROUP_ID, WidgetID.Pvp.SAFE_ZONE),
|
||||||
|
|
||||||
|
|||||||
@@ -120,4 +120,11 @@ public abstract class Overlay implements LayoutableRenderableEntity
|
|||||||
{
|
{
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public void reset()
|
||||||
|
{
|
||||||
|
setPreferredPosition(null);
|
||||||
|
setPreferredSize(null);
|
||||||
|
setPreferredLocation(null);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -289,9 +289,7 @@ public class OverlayManager
|
|||||||
*/
|
*/
|
||||||
public synchronized void resetOverlay(final Overlay overlay)
|
public synchronized void resetOverlay(final Overlay overlay)
|
||||||
{
|
{
|
||||||
overlay.setPreferredPosition(null);
|
overlay.reset();
|
||||||
overlay.setPreferredSize(null);
|
|
||||||
overlay.setPreferredLocation(null);
|
|
||||||
saveOverlay(overlay);
|
saveOverlay(overlay);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,11 +30,13 @@ import java.awt.Rectangle;
|
|||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.Collection;
|
import java.util.Collection;
|
||||||
import java.util.Objects;
|
import java.util.Objects;
|
||||||
|
import lombok.extern.slf4j.Slf4j;
|
||||||
import net.runelite.api.Client;
|
import net.runelite.api.Client;
|
||||||
import net.runelite.api.Varbits;
|
import net.runelite.api.Varbits;
|
||||||
import net.runelite.api.widgets.Widget;
|
import net.runelite.api.widgets.Widget;
|
||||||
import net.runelite.api.widgets.WidgetInfo;
|
import net.runelite.api.widgets.WidgetInfo;
|
||||||
|
|
||||||
|
@Slf4j
|
||||||
public class WidgetOverlay extends Overlay
|
public class WidgetOverlay extends Overlay
|
||||||
{
|
{
|
||||||
public static Collection<WidgetOverlay> createOverlays(final Client client)
|
public static Collection<WidgetOverlay> createOverlays(final Client client)
|
||||||
@@ -71,13 +73,15 @@ public class WidgetOverlay extends Overlay
|
|||||||
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT),
|
new WidgetOverlay(client, WidgetInfo.MULTICOMBAT_RESIZEABLE_CLASSIC, OverlayPosition.CANVAS_TOP_RIGHT),
|
||||||
new WidgetOverlay(client, WidgetInfo.TEMPOROSS_STATUS_INDICATOR, OverlayPosition.TOP_LEFT),
|
new WidgetOverlay(client, WidgetInfo.TEMPOROSS_STATUS_INDICATOR, OverlayPosition.TOP_LEFT),
|
||||||
new WidgetOverlay(client, WidgetInfo.BA_HEAL_TEAMMATES, OverlayPosition.BOTTOM_LEFT),
|
new WidgetOverlay(client, WidgetInfo.BA_HEAL_TEAMMATES, OverlayPosition.BOTTOM_LEFT),
|
||||||
new WidgetOverlay(client, WidgetInfo.BA_TEAM, OverlayPosition.TOP_RIGHT)
|
new WidgetOverlay(client, WidgetInfo.BA_TEAM, OverlayPosition.TOP_RIGHT),
|
||||||
|
new WidgetOverlay(client, WidgetInfo.PVP_WILDERNESS_SKULL_CONTAINER, OverlayPosition.DETACHED)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected final Client client;
|
protected final Client client;
|
||||||
private final WidgetInfo widgetInfo;
|
private final WidgetInfo widgetInfo;
|
||||||
private final Rectangle parentBounds = new Rectangle();
|
private final Rectangle parentBounds = new Rectangle();
|
||||||
|
private boolean revalidate;
|
||||||
|
|
||||||
private WidgetOverlay(final Client client, final WidgetInfo widgetInfo, final OverlayPosition overlayPosition)
|
private WidgetOverlay(final Client client, final WidgetInfo widgetInfo, final OverlayPosition overlayPosition)
|
||||||
{
|
{
|
||||||
@@ -107,10 +111,34 @@ public class WidgetOverlay extends Overlay
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
assert widget != null;
|
||||||
|
|
||||||
final Rectangle bounds = getBounds();
|
final Rectangle bounds = getBounds();
|
||||||
// The widget relative pos is relative to the parent
|
// OverlayRenderer sets the overlay bounds to the preferred location if one is set prior to calling render()
|
||||||
widget.setRelativeX(bounds.x - parent.x);
|
// for detached overlays.
|
||||||
widget.setRelativeY(bounds.y - parent.y);
|
if (getPosition() != OverlayPosition.DETACHED || getPreferredLocation() != null)
|
||||||
|
{
|
||||||
|
// The widget relative pos is relative to the parent
|
||||||
|
widget.setRelativeX(bounds.x - parent.x);
|
||||||
|
widget.setRelativeY(bounds.y - parent.y);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if (revalidate)
|
||||||
|
{
|
||||||
|
revalidate = false;
|
||||||
|
log.debug("Revalidating {}", widgetInfo);
|
||||||
|
// Revalidate the widget to reposition it back to its normal location after an overlay reset
|
||||||
|
widget.revalidate();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Update the overlay bounds to the widget bounds so the drag overlay renders correctly.
|
||||||
|
// Note OverlayManager uses original bounds reference to render managing mode and for
|
||||||
|
// onMouseOver, so update the existing bounds vs. replacing the reference.
|
||||||
|
Rectangle widgetBounds = widget.getBounds();
|
||||||
|
bounds.setBounds(widgetBounds.x, widgetBounds.y, widgetBounds.width, widgetBounds.height);
|
||||||
|
}
|
||||||
|
|
||||||
return new Dimension(widget.getWidth(), widget.getHeight());
|
return new Dimension(widget.getWidth(), widget.getHeight());
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -152,6 +180,14 @@ public class WidgetOverlay extends Overlay
|
|||||||
return getParentBounds(widget);
|
return getParentBounds(widget);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void reset()
|
||||||
|
{
|
||||||
|
super.reset();
|
||||||
|
// Revalidate must be called on the client thread, so defer til next frame
|
||||||
|
revalidate = true;
|
||||||
|
}
|
||||||
|
|
||||||
private static class XpTrackerWidgetOverlay extends WidgetOverlay
|
private static class XpTrackerWidgetOverlay extends WidgetOverlay
|
||||||
{
|
{
|
||||||
private XpTrackerWidgetOverlay(Client client, WidgetInfo widgetInfo, OverlayPosition overlayPosition)
|
private XpTrackerWidgetOverlay(Client client, WidgetInfo widgetInfo, OverlayPosition overlayPosition)
|
||||||
|
|||||||
Reference in New Issue
Block a user