diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index 5cd1757bce..f98b2f16ce 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -133,4 +133,26 @@ public interface RuneLiteConfig extends Config { return FontType.SMALL; } + + @ConfigItem( + keyName = "infoBoxVertical", + name = "Display infoboxes vertically", + description = "Toggles the infoboxes to display vertically", + position = 10 + ) + default boolean infoBoxVertical() + { + return false; + } + + @ConfigItem( + keyName = "infoBoxWrap", + name = "Infobox wrap count", + description = "Configures the amount of infoboxes shown before wrapping", + position = 11 + ) + default int infoBoxWrap() + { + return 4; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java index e089c1978d..a975474e74 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java @@ -71,7 +71,7 @@ public class InfoBoxComponent implements RenderableEntity { graphics.drawImage(image, position.x + (BOX_SIZE - image.getWidth()) / 2, - (BOX_SIZE - image.getHeight()) / 2, null); + position.y + (BOX_SIZE - image.getHeight()) / 2, null); } final TextComponent textComponent = new TextComponent(); @@ -79,7 +79,7 @@ public class InfoBoxComponent implements RenderableEntity textComponent.setText(text); textComponent.setPosition(new Point( position.x + ((BOX_SIZE - metrics.stringWidth(text)) / 2), - BOX_SIZE - SEPARATOR)); + position.y + BOX_SIZE - SEPARATOR)); textComponent.render(graphics); return new Dimension(BOX_SIZE, BOX_SIZE); } 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 c18b780c75..1ebacb7628 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 @@ -34,6 +34,7 @@ import java.util.List; import javax.inject.Inject; import javax.inject.Provider; import net.runelite.api.Client; +import net.runelite.client.config.RuneLiteConfig; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; @@ -45,18 +46,21 @@ public class InfoBoxOverlay extends Overlay { private static final int BOXSIZE = 35; private static final int SEPARATOR = 2; + private static final int TOTAL_BOXSIZE = BOXSIZE + SEPARATOR; private final InfoBoxManager infoboxManager; private final TooltipManager tooltipManager; private final Provider clientProvider; + private final RuneLiteConfig config; @Inject - public InfoBoxOverlay(InfoBoxManager infoboxManager, TooltipManager tooltipManager, Provider clientProvider) + public InfoBoxOverlay(InfoBoxManager infoboxManager, TooltipManager tooltipManager, Provider clientProvider, RuneLiteConfig config) { setPosition(OverlayPosition.TOP_LEFT); this.tooltipManager = tooltipManager; this.infoboxManager = infoboxManager; this.clientProvider = clientProvider; + this.config = config; } @Override @@ -69,8 +73,24 @@ public class InfoBoxOverlay extends Overlay return null; } - int width = infoBoxes.size() * (BOXSIZE + SEPARATOR); + int wrap = config.infoBoxWrap(); + int infoBoxCount = infoBoxes.size(); + boolean vertical = config.infoBoxVertical(); + + int width, height; + if (!vertical) + { + width = getWidth(infoBoxCount, wrap); + height = getHeight(infoBoxCount, wrap); + } + else + { + width = getHeight(infoBoxCount, wrap); + height = getWidth(infoBoxCount, wrap); + } + int x = 0; + int y = 0; for (InfoBox box : infoBoxes) { @@ -84,14 +104,14 @@ public class InfoBoxOverlay extends Overlay infoBoxComponent.setColor(box.getTextColor()); infoBoxComponent.setImage(box.getImage()); infoBoxComponent.setText(box.getText()); - infoBoxComponent.setPosition(new Point(x, 0)); + infoBoxComponent.setPosition(new Point(x, y)); final Dimension infoBoxBounds = infoBoxComponent.render(graphics); if (!Strings.isNullOrEmpty(box.getTooltip())) { final Rectangle intersectionRectangle = new Rectangle(infoBoxBounds); intersectionRectangle.setLocation(getBounds().getLocation()); - intersectionRectangle.translate(x, 0); + intersectionRectangle.translate(x, y); final Point transformed = OverlayUtil.transformPosition(getPosition(), intersectionRectangle.getSize()); intersectionRectangle.translate(transformed.x, transformed.y); @@ -104,9 +124,45 @@ public class InfoBoxOverlay extends Overlay } } - x += BOXSIZE + SEPARATOR; + // Determine which axis to reset/increase + if (vertical) + { + // Reset y if newbox reaches height limit + if (y + TOTAL_BOXSIZE < height) + { + y += TOTAL_BOXSIZE; + } + else + { + y = 0; + x += TOTAL_BOXSIZE; + } + } + else + { + // Reset x if newbox reaches width limit + if (x + TOTAL_BOXSIZE < width) + { + x += TOTAL_BOXSIZE; + } + else + { + x = 0; + y += TOTAL_BOXSIZE; + } + } } - return new Dimension(width, BOXSIZE); + return new Dimension(width, height); + } + + private static int getHeight(int infoBoxCount, int maxRow) + { + return maxRow == 0 ? TOTAL_BOXSIZE : (int) Math.ceil((double)infoBoxCount / maxRow) * TOTAL_BOXSIZE; + } + + private static int getWidth(int infoBoxCount, int maxRow) + { + return maxRow == 0 ? infoBoxCount * TOTAL_BOXSIZE : (maxRow > infoBoxCount ? infoBoxCount : maxRow) * TOTAL_BOXSIZE; } }