diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java index a47a0ce563..ad707b685d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/agility/LapCounterOverlay.java @@ -32,6 +32,7 @@ import javax.inject.Inject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class LapCounterOverlay extends Overlay @@ -73,19 +74,18 @@ public class LapCounterOverlay extends Overlay return null; } - panelComponent.getLines().clear(); - - panelComponent.getLines().add(new PanelComponent.Line( - "Total Laps", - Integer.toString(session.getTotalLaps()) - )); + panelComponent.getChildren().clear(); + panelComponent.getChildren().add(LineComponent.builder() + .left("Total Laps") + .right(Integer.toString(session.getTotalLaps())) + .build()); if (session.getLapsTillLevel() > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Laps till level", - Integer.toString(session.getLapsTillLevel()) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Laps till level") + .right(Integer.toString(session.getLapsTillLevel())) + .build()); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java index f576ca9744..56e7a25564 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/attackstyles/AttackStylesOverlay.java @@ -34,8 +34,6 @@ import net.runelite.client.ui.overlay.components.PanelComponent; public class AttackStylesOverlay extends Overlay { - private static final int COMPONENT_WIDTH = 80; - private final AttackStylesPlugin plugin; private final AttackStylesConfig config; private final PanelComponent panelComponent = new PanelComponent(); @@ -56,10 +54,11 @@ public class AttackStylesOverlay extends Overlay if (warnedSkillSelected || config.alwaysShowStyle()) { final String attackStyleString = plugin.getAttackStyle().getName(); - panelComponent.setTitleColor(warnedSkillSelected ? Color.RED : Color.WHITE); panelComponent.setTitle(attackStyleString); - panelComponent.setWidth(COMPONENT_WIDTH); + panelComponent.setPreferredSize(new Dimension( + graphics.getFontMetrics().stringWidth(attackStyleString) + 10, + 0)); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java index 3ee4c6e4ba..4e8eeec66a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/barrows/BarrowsBrotherSlainOverlay.java @@ -34,6 +34,7 @@ import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class BarrowsBrotherSlainOverlay extends Overlay @@ -66,17 +67,16 @@ public class BarrowsBrotherSlainOverlay extends Overlay barrowsBrothers.setHidden(true); } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); for (BarrowsBrothers brother : BarrowsBrothers.values()) { String slain = client.getVar(brother.getKilledVarbit()) > 0 ? "✓" : ""; - panelComponent.getLines().add(new PanelComponent.Line( - brother.getName(), - Color.WHITE, - slain, - slain.isEmpty() ? Color.WHITE : Color.GREEN - )); + panelComponent.getChildren().add(LineComponent.builder() + .left(brother.getName()) + .right(slain) + .rightColor(slain.isEmpty() ? Color.WHITE : Color.GREEN) + .build()); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java index e1d3a111b2..ef5c76c0d4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceCofferOverlay.java @@ -33,6 +33,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.util.StackFormatter; @@ -60,17 +61,18 @@ class BlastFurnaceCofferOverlay extends Overlay Widget sack = client.getWidget(WidgetInfo.BLAST_FURNACE_COFFER); - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); if (sack != null) { sack.setHidden(true); - panelComponent.getLines().add(new PanelComponent.Line( - "Coffer:", - StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp" - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Coffer:") + .right(StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp") + .build()); } + return panelComponent.render(graphics); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java index 691e98f3ac..146770ea4d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/blastfurnace/BlastFurnaceOverlay.java @@ -32,13 +32,14 @@ import net.runelite.api.Client; import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.ImagePanelComponent; +import net.runelite.client.ui.overlay.components.ImageComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; class BlastFurnaceOverlay extends Overlay { private final Client client; private final BlastFurnacePlugin plugin; - private final ImagePanelComponent imagePanelComponent = new ImagePanelComponent(); + private final PanelComponent imagePanelComponent = new PanelComponent(); @Inject private ItemManager itemManager; @@ -49,6 +50,7 @@ class BlastFurnaceOverlay extends Overlay setPosition(OverlayPosition.TOP_LEFT); this.plugin = plugin; this.client = client; + imagePanelComponent.setOrientation(PanelComponent.Orientation.HORIZONTAL); } @Override @@ -59,7 +61,7 @@ class BlastFurnaceOverlay extends Overlay return null; } - imagePanelComponent.getImages().clear(); + imagePanelComponent.getChildren().clear(); for (BarsOres varbit : BarsOres.values()) { @@ -70,7 +72,7 @@ class BlastFurnaceOverlay extends Overlay continue; } - imagePanelComponent.getImages().add(getImage(varbit.getItemID(), amount)); + imagePanelComponent.getChildren().add(new ImageComponent(getImage(varbit.getItemID(), amount))); } return imagePanelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java index 1b51345445..364d2e97b3 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/boosts/BoostsOverlay.java @@ -36,6 +36,7 @@ import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; @@ -47,6 +48,7 @@ class BoostsOverlay extends Overlay private final Client client; private final BoostsConfig config; private final InfoBoxManager infoBoxManager; + private final PanelComponent panelComponent = new PanelComponent(); @Inject private BoostsPlugin plugin; @@ -54,8 +56,6 @@ class BoostsOverlay extends Overlay @Inject private SkillIconManager iconManager; - private PanelComponent panelComponent; - private boolean overlayActive; @Inject @@ -71,9 +71,9 @@ class BoostsOverlay extends Overlay @Override public Dimension render(Graphics2D graphics) { - panelComponent = new PanelComponent(); - Instant lastChange = plugin.getLastChange(); + panelComponent.getChildren().clear(); + if (!config.displayIndicators() && config.displayNextChange() && lastChange != null @@ -82,12 +82,10 @@ class BoostsOverlay extends Overlay int nextChange = plugin.getChangeTime(); if (nextChange > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Next change in", - Color.WHITE, - String.valueOf(nextChange), - Color.WHITE - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Next change in") + .right(String.valueOf(nextChange)) + .build()); } } @@ -148,16 +146,15 @@ class BoostsOverlay extends Overlay } } - panelComponent.getLines().add(new PanelComponent.Line( - skill.getName(), - Color.WHITE, - str, - strColor - )); + panelComponent.getChildren().add(LineComponent.builder() + .left(skill.getName()) + .right(str) + .rightColor(strColor) + .build()); } } - return panelComponent.getLines().isEmpty() ? null : panelComponent.render(graphics); + return panelComponent.render(graphics); } private Color getTextColor(int boost) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java index 67e675f964..e1f6766fc1 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cerberus/CerberusOverlay.java @@ -32,7 +32,8 @@ import lombok.extern.slf4j.Slf4j; import net.runelite.client.game.SkillIconManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.ImagePanelComponent; +import net.runelite.client.ui.overlay.components.ImageComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; @Slf4j @Singleton @@ -40,6 +41,7 @@ public class CerberusOverlay extends Overlay { private final CerberusPlugin plugin; private final SkillIconManager iconManager; + private final PanelComponent panelComponent = new PanelComponent(); @Inject CerberusOverlay(final CerberusPlugin plugin, final SkillIconManager iconManager) @@ -57,8 +59,9 @@ public class CerberusOverlay extends Overlay return null; } - final ImagePanelComponent imagePanelComponent = new ImagePanelComponent(); - imagePanelComponent.setTitle("Ghost order"); + panelComponent.getChildren().clear(); + panelComponent.setOrientation(PanelComponent.Orientation.HORIZONTAL); + panelComponent.setTitle("Ghost order"); // Ghosts are already sorted plugin.getGhosts().stream() @@ -66,11 +69,11 @@ public class CerberusOverlay extends Overlay .limit(CerberusGhost.values().length) .forEach(npc -> CerberusGhost .fromNPC(npc) - .ifPresent(ghost -> imagePanelComponent - .getImages() - .add(iconManager.getSkillImage(ghost.getType())))); + .ifPresent(ghost -> panelComponent + .getChildren() + .add(new ImageComponent(iconManager.getSkillImage(ghost.getType()))))); - return imagePanelComponent.render(graphics); + return panelComponent.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java index c3bcc2f1ba..49e4c76558 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/ClueScrollOverlay.java @@ -59,7 +59,7 @@ public class ClueScrollOverlay extends Overlay return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); clue.makeOverlayHint(panelComponent, plugin); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java index b11d652dfc..fa875d2935 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/AnagramClue.java @@ -36,6 +36,7 @@ import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -167,18 +168,25 @@ public class AnagramClue extends ClueScroll implements TextClueScroll, NpcClueSc public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.setTitle("Anagram Clue"); - panelComponent.setWidth(150); + panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getNpc()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); - panelComponent.getLines().add(new PanelComponent.Line("NPC:")); - panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); - - panelComponent.getLines().add(new PanelComponent.Line("Area:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getArea(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getArea()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); if (getAnswer() != null) { - panelComponent.getLines().add(new PanelComponent.Line("Answer:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getAnswer(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Answer:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getAnswer()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java index 822c0fde76..2dfd2ac2a6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CipherClue.java @@ -36,6 +36,7 @@ import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.CLUE_SCROLL_IMAGE; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -76,18 +77,25 @@ public class CipherClue extends ClueScroll implements TextClueScroll, NpcClueScr public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.setTitle("Cipher Clue"); - panelComponent.setWidth(150); + panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getNpc()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); - panelComponent.getLines().add(new PanelComponent.Line("NPC:")); - panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); - - panelComponent.getLines().add(new PanelComponent.Line("Area:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getArea(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Area:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getArea()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); if (getAnswer() != null) { - panelComponent.getLines().add(new PanelComponent.Line("Answer:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getAnswer(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Answer:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getAnswer()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java index 2d78eb06e4..d9f9171e67 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CoordinateClue.java @@ -33,6 +33,7 @@ import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -46,12 +47,9 @@ public class CoordinateClue extends ClueScroll implements TextClueScroll, Locati public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.setTitle("Coordinate Clue"); - panelComponent.setWidth(135); - - panelComponent.getLines().add(new PanelComponent.Line("Travel to the marked")); - panelComponent.getLines().add(new PanelComponent.Line("out destination to see")); - panelComponent.getLines().add(new PanelComponent.Line("a marker for where")); - panelComponent.getLines().add(new PanelComponent.Line("you should dig.")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Travel to the marked out destination to see a marker for where you should dig.") + .build()); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java index 800738ac19..dd9aa42e60 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/CrypticClue.java @@ -44,6 +44,7 @@ import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLI import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -338,15 +339,19 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.setTitle("Cryptic Clue"); - panelComponent.setWidth(150); - - panelComponent.getLines().add(new PanelComponent.Line("Clue:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getText(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Clue:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getText()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); if (getNpc() != null) { - panelComponent.getLines().add(new PanelComponent.Line("NPC:")); - panelComponent.getLines().add(new PanelComponent.Line(getNpc(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("NPC:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getNpc()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } if (objectId != -1) @@ -355,13 +360,19 @@ public class CrypticClue extends ClueScroll implements TextClueScroll, NpcClueSc if (object != null) { - panelComponent.getLines().add(new PanelComponent.Line("Object:")); - panelComponent.getLines().add(new PanelComponent.Line(object.getName(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Object:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(object.getName()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } } - panelComponent.getLines().add(new PanelComponent.Line("Solution:")); - panelComponent.getLines().add(new PanelComponent.Line(true, getSolution(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Solution:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getSolution()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java index fa78a2197b..0dbd99d977 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/EmoteClue.java @@ -41,7 +41,336 @@ import static net.runelite.api.EquipmentInventorySlot.RING; import static net.runelite.api.EquipmentInventorySlot.SHIELD; import static net.runelite.api.EquipmentInventorySlot.WEAPON; import net.runelite.api.Item; -import static net.runelite.api.ItemID.*; +import static net.runelite.api.ItemID.ABYSSAL_WHIP; +import static net.runelite.api.ItemID.ADAMANT_2H_SWORD; +import static net.runelite.api.ItemID.ADAMANT_BOOTS; +import static net.runelite.api.ItemID.ADAMANT_DAGGER; +import static net.runelite.api.ItemID.ADAMANT_FULL_HELM; +import static net.runelite.api.ItemID.ADAMANT_HALBERD; +import static net.runelite.api.ItemID.ADAMANT_MED_HELM; +import static net.runelite.api.ItemID.ADAMANT_PLATEBODY; +import static net.runelite.api.ItemID.ADAMANT_PLATELEGS; +import static net.runelite.api.ItemID.ADAMANT_PLATESKIRT; +import static net.runelite.api.ItemID.ADAMANT_SQ_SHIELD; +import static net.runelite.api.ItemID.ADAMANT_SWORD; +import static net.runelite.api.ItemID.AHRIMS_HOOD_0; +import static net.runelite.api.ItemID.AHRIMS_HOOD_100; +import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_0; +import static net.runelite.api.ItemID.AHRIMS_ROBESKIRT_100; +import static net.runelite.api.ItemID.AHRIMS_ROBETOP_0; +import static net.runelite.api.ItemID.AHRIMS_ROBETOP_100; +import static net.runelite.api.ItemID.AHRIMS_STAFF_0; +import static net.runelite.api.ItemID.AHRIMS_STAFF_100; +import static net.runelite.api.ItemID.AIR_TIARA; +import static net.runelite.api.ItemID.AMULET_OF_GLORY; +import static net.runelite.api.ItemID.AMULET_OF_GLORY1; +import static net.runelite.api.ItemID.AMULET_OF_GLORY2; +import static net.runelite.api.ItemID.AMULET_OF_GLORY3; +import static net.runelite.api.ItemID.AMULET_OF_GLORY4; +import static net.runelite.api.ItemID.AMULET_OF_GLORY5; +import static net.runelite.api.ItemID.AMULET_OF_GLORY6; +import static net.runelite.api.ItemID.AMULET_OF_POWER; +import static net.runelite.api.ItemID.AMULET_OF_STRENGTH; +import static net.runelite.api.ItemID.AMULET_OF_THE_DAMNED; +import static net.runelite.api.ItemID.ANCIENT_CROZIER; +import static net.runelite.api.ItemID.ANCIENT_MITRE; +import static net.runelite.api.ItemID.ANCIENT_STOLE; +import static net.runelite.api.ItemID.ARCLIGHT; +import static net.runelite.api.ItemID.ARMADYL_CROZIER; +import static net.runelite.api.ItemID.ARMADYL_MITRE; +import static net.runelite.api.ItemID.ARMADYL_STOLE; +import static net.runelite.api.ItemID.BANDOS_BOOTS; +import static net.runelite.api.ItemID.BANDOS_CLOAK; +import static net.runelite.api.ItemID.BANDOS_CROZIER; +import static net.runelite.api.ItemID.BANDOS_GODSWORD; +import static net.runelite.api.ItemID.BANDOS_MITRE; +import static net.runelite.api.ItemID.BANDOS_PLATEBODY; +import static net.runelite.api.ItemID.BANDOS_STOLE; +import static net.runelite.api.ItemID.BARROWS_GLOVES; +import static net.runelite.api.ItemID.BLACK_AXE; +import static net.runelite.api.ItemID.BLACK_BOATER; +import static net.runelite.api.ItemID.BLACK_CAPE; +import static net.runelite.api.ItemID.BLACK_DHIDE_BODY; +import static net.runelite.api.ItemID.BLACK_DHIDE_CHAPS; +import static net.runelite.api.ItemID.BLACK_DHIDE_VAMB; +import static net.runelite.api.ItemID.BLACK_DRAGON_MASK; +import static net.runelite.api.ItemID.BLACK_PLATEBODY; +import static net.runelite.api.ItemID.BLACK_SALAMANDER; +import static net.runelite.api.ItemID.BLACK_SLAYER_HELMET; +import static net.runelite.api.ItemID.BLACK_SLAYER_HELMET_I; +import static net.runelite.api.ItemID.BLUE_BOATER; +import static net.runelite.api.ItemID.BLUE_BOOTS; +import static net.runelite.api.ItemID.BLUE_DHIDE_BODY; +import static net.runelite.api.ItemID.BLUE_DHIDE_CHAPS; +import static net.runelite.api.ItemID.BLUE_DHIDE_VAMB; +import static net.runelite.api.ItemID.BLUE_ROBE_TOP; +import static net.runelite.api.ItemID.BLUE_WIZARD_HAT; +import static net.runelite.api.ItemID.BOBS_PURPLE_SHIRT; +import static net.runelite.api.ItemID.BOBS_RED_SHIRT; +import static net.runelite.api.ItemID.BODY_TIARA; +import static net.runelite.api.ItemID.BONE_DAGGER; +import static net.runelite.api.ItemID.BONE_SPEAR; +import static net.runelite.api.ItemID.BOOK_OF_BALANCE; +import static net.runelite.api.ItemID.BOOK_OF_DARKNESS; +import static net.runelite.api.ItemID.BOOK_OF_LAW; +import static net.runelite.api.ItemID.BOOK_OF_WAR; +import static net.runelite.api.ItemID.BRINE_SABRE; +import static net.runelite.api.ItemID.BRONZE_2H_SWORD; +import static net.runelite.api.ItemID.BRONZE_AXE; +import static net.runelite.api.ItemID.BRONZE_CHAINBODY; +import static net.runelite.api.ItemID.BRONZE_DAGGER; +import static net.runelite.api.ItemID.BRONZE_FULL_HELM; +import static net.runelite.api.ItemID.BRONZE_PLATELEGS; +import static net.runelite.api.ItemID.BRONZE_SPEAR; +import static net.runelite.api.ItemID.BRONZE_SQ_SHIELD; +import static net.runelite.api.ItemID.BROWN_APRON; +import static net.runelite.api.ItemID.BROWN_HEADBAND; +import static net.runelite.api.ItemID.BRUISE_BLUE_SNELM_3343; +import static net.runelite.api.ItemID.CAPE_OF_LEGENDS; +import static net.runelite.api.ItemID.CASTLE_WARS_BRACELET3; +import static net.runelite.api.ItemID.CLIMBING_BOOTS; +import static net.runelite.api.ItemID.COIF; +import static net.runelite.api.ItemID.COMBAT_BRACELET; +import static net.runelite.api.ItemID.CREAM_ROBE_TOP; +import static net.runelite.api.ItemID.DEATH_TIARA; +import static net.runelite.api.ItemID.DESERT_SHIRT; +import static net.runelite.api.ItemID.DHAROKS_GREATAXE_0; +import static net.runelite.api.ItemID.DHAROKS_GREATAXE_100; +import static net.runelite.api.ItemID.DHAROKS_HELM_0; +import static net.runelite.api.ItemID.DHAROKS_HELM_100; +import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_0; +import static net.runelite.api.ItemID.DHAROKS_PLATEBODY_100; +import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_0; +import static net.runelite.api.ItemID.DHAROKS_PLATELEGS_100; +import static net.runelite.api.ItemID.DIAMOND_BRACELET; +import static net.runelite.api.ItemID.DIAMOND_RING; +import static net.runelite.api.ItemID.DRAGONSTONE_AMULET; +import static net.runelite.api.ItemID.DRAGONSTONE_RING; +import static net.runelite.api.ItemID.DRAGON_2H_SWORD; +import static net.runelite.api.ItemID.DRAGON_AXE; +import static net.runelite.api.ItemID.DRAGON_BATTLEAXE; +import static net.runelite.api.ItemID.DRAGON_BOOTS; +import static net.runelite.api.ItemID.DRAGON_CHAINBODY_3140; +import static net.runelite.api.ItemID.DRAGON_DEFENDER; +import static net.runelite.api.ItemID.DRAGON_MED_HELM; +import static net.runelite.api.ItemID.DRAGON_NECKLACE; +import static net.runelite.api.ItemID.DRAGON_PICKAXE; +import static net.runelite.api.ItemID.DRAGON_PLATESKIRT; +import static net.runelite.api.ItemID.DRAGON_SPEAR; +import static net.runelite.api.ItemID.DRAGON_SQ_SHIELD; +import static net.runelite.api.ItemID.EARTH_RUNE; +import static net.runelite.api.ItemID.ELEMENTAL_SHIELD; +import static net.runelite.api.ItemID.EMERALD_AMULET; +import static net.runelite.api.ItemID.EMERALD_RING; +import static net.runelite.api.ItemID.FIRE_BATTLESTAFF; +import static net.runelite.api.ItemID.FIRE_CAPE; +import static net.runelite.api.ItemID.FLARED_TROUSERS; +import static net.runelite.api.ItemID.GOLD_NECKLACE; +import static net.runelite.api.ItemID.GOLD_RING; +import static net.runelite.api.ItemID.GRANITE_SHIELD; +import static net.runelite.api.ItemID.GREEN_BOATER; +import static net.runelite.api.ItemID.GREEN_BOOTS; +import static net.runelite.api.ItemID.GREEN_DHIDE_BODY; +import static net.runelite.api.ItemID.GREEN_DHIDE_CHAPS; +import static net.runelite.api.ItemID.GREEN_HAT; +import static net.runelite.api.ItemID.GREEN_HEADBAND; +import static net.runelite.api.ItemID.GREEN_ROBE_BOTTOMS; +import static net.runelite.api.ItemID.GREEN_ROBE_TOP; +import static net.runelite.api.ItemID.GREEN_SLAYER_HELMET; +import static net.runelite.api.ItemID.GREEN_SLAYER_HELMET_I; +import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_0; +import static net.runelite.api.ItemID.GUTHANS_CHAINSKIRT_100; +import static net.runelite.api.ItemID.GUTHANS_HELM_0; +import static net.runelite.api.ItemID.GUTHANS_HELM_100; +import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_0; +import static net.runelite.api.ItemID.GUTHANS_PLATEBODY_100; +import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_0; +import static net.runelite.api.ItemID.GUTHANS_WARSPEAR_100; +import static net.runelite.api.ItemID.GUTHIX_MITRE; +import static net.runelite.api.ItemID.GUTHIX_STOLE; +import static net.runelite.api.ItemID.HAM_BOOTS; +import static net.runelite.api.ItemID.HAM_ROBE; +import static net.runelite.api.ItemID.HARDLEATHER_BODY; +import static net.runelite.api.ItemID.HELM_OF_NEITIZNOT; +import static net.runelite.api.ItemID.HOLY_BOOK; +import static net.runelite.api.ItemID.IBANS_STAFF; +import static net.runelite.api.ItemID.IBANS_STAFF_U; +import static net.runelite.api.ItemID.IRON_2H_SWORD; +import static net.runelite.api.ItemID.IRON_CHAINBODY; +import static net.runelite.api.ItemID.IRON_FULL_HELM; +import static net.runelite.api.ItemID.IRON_KITESHIELD; +import static net.runelite.api.ItemID.IRON_MED_HELM; +import static net.runelite.api.ItemID.IRON_PICKAXE; +import static net.runelite.api.ItemID.IRON_PLATEBODY; +import static net.runelite.api.ItemID.IRON_PLATELEGS; +import static net.runelite.api.ItemID.IRON_PLATESKIRT; +import static net.runelite.api.ItemID.IRON_SCIMITAR; +import static net.runelite.api.ItemID.IRON_WARHAMMER; +import static net.runelite.api.ItemID.KARILS_COIF_0; +import static net.runelite.api.ItemID.KARILS_COIF_100; +import static net.runelite.api.ItemID.KARILS_CROSSBOW_0; +import static net.runelite.api.ItemID.KARILS_CROSSBOW_100; +import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_0; +import static net.runelite.api.ItemID.KARILS_LEATHERSKIRT_100; +import static net.runelite.api.ItemID.KARILS_LEATHERTOP_0; +import static net.runelite.api.ItemID.KARILS_LEATHERTOP_100; +import static net.runelite.api.ItemID.LAVA_BATTLESTAFF; +import static net.runelite.api.ItemID.LEATHER_BOOTS; +import static net.runelite.api.ItemID.LEATHER_CHAPS; +import static net.runelite.api.ItemID.LEATHER_COWL; +import static net.runelite.api.ItemID.LEATHER_GLOVES; +import static net.runelite.api.ItemID.LONGBOW; +import static net.runelite.api.ItemID.MAGIC_LONGBOW; +import static net.runelite.api.ItemID.MAPLE_LONGBOW; +import static net.runelite.api.ItemID.MAPLE_SHORTBOW; +import static net.runelite.api.ItemID.MENAPHITE_PURPLE_HAT; +import static net.runelite.api.ItemID.MENAPHITE_PURPLE_ROBE; +import static net.runelite.api.ItemID.MENAPHITE_PURPLE_TOP; +import static net.runelite.api.ItemID.MIND_SHIELD; +import static net.runelite.api.ItemID.MITHRIL_CHAINBODY; +import static net.runelite.api.ItemID.MITHRIL_FULL_HELM; +import static net.runelite.api.ItemID.MITHRIL_MED_HELM; +import static net.runelite.api.ItemID.MITHRIL_PICKAXE; +import static net.runelite.api.ItemID.MITHRIL_PLATEBODY; +import static net.runelite.api.ItemID.MITHRIL_PLATELEGS; +import static net.runelite.api.ItemID.MITHRIL_PLATESKIRT; +import static net.runelite.api.ItemID.MITHRIL_SCIMITAR; +import static net.runelite.api.ItemID.MYSTIC_FIRE_STAFF; +import static net.runelite.api.ItemID.MYSTIC_GLOVES; +import static net.runelite.api.ItemID.MYSTIC_HAT; +import static net.runelite.api.ItemID.MYSTIC_ROBE_BOTTOM; +import static net.runelite.api.ItemID.MYSTIC_ROBE_BOTTOM_DARK; +import static net.runelite.api.ItemID.MYSTIC_ROBE_TOP; +import static net.runelite.api.ItemID.MYSTIC_ROBE_TOP_DARK; +import static net.runelite.api.ItemID.NEW_CRYSTAL_BOW_I; +import static net.runelite.api.ItemID.OAK_LONGBOW; +import static net.runelite.api.ItemID.OAK_SHORTBOW; +import static net.runelite.api.ItemID.OBSIDIAN_CAPE; +import static net.runelite.api.ItemID.ORANGE_BOATER; +import static net.runelite.api.ItemID.PHARAOHS_SCEPTRE_3; +import static net.runelite.api.ItemID.PINK_BOATER; +import static net.runelite.api.ItemID.PINK_ROBE_TOP; +import static net.runelite.api.ItemID.PINK_SKIRT; +import static net.runelite.api.ItemID.PIRATE_BANDANA; +import static net.runelite.api.ItemID.PIRATE_BANDANA_7124; +import static net.runelite.api.ItemID.PIRATE_BANDANA_7130; +import static net.runelite.api.ItemID.PIRATE_BANDANA_7136; +import static net.runelite.api.ItemID.PROSELYTE_HAUBERK; +import static net.runelite.api.ItemID.PURPLE_BOATER; +import static net.runelite.api.ItemID.PURPLE_GLOVES; +import static net.runelite.api.ItemID.PURPLE_SLAYER_HELMET; +import static net.runelite.api.ItemID.PURPLE_SLAYER_HELMET_I; +import static net.runelite.api.ItemID.RED_BOATER; +import static net.runelite.api.ItemID.RED_DHIDE_CHAPS; +import static net.runelite.api.ItemID.RED_HEADBAND; +import static net.runelite.api.ItemID.RED_SLAYER_HELMET; +import static net.runelite.api.ItemID.RED_SLAYER_HELMET_I; +import static net.runelite.api.ItemID.RING_OF_DUELING1; +import static net.runelite.api.ItemID.RING_OF_DUELING2; +import static net.runelite.api.ItemID.RING_OF_DUELING3; +import static net.runelite.api.ItemID.RING_OF_DUELING4; +import static net.runelite.api.ItemID.RING_OF_DUELING5; +import static net.runelite.api.ItemID.RING_OF_DUELING6; +import static net.runelite.api.ItemID.RING_OF_DUELING7; +import static net.runelite.api.ItemID.RING_OF_DUELING8; +import static net.runelite.api.ItemID.RING_OF_FORGING; +import static net.runelite.api.ItemID.RING_OF_LIFE; +import static net.runelite.api.ItemID.RING_OF_WEALTH; +import static net.runelite.api.ItemID.RING_OF_WEALTH_1; +import static net.runelite.api.ItemID.RING_OF_WEALTH_2; +import static net.runelite.api.ItemID.RING_OF_WEALTH_3; +import static net.runelite.api.ItemID.RING_OF_WEALTH_4; +import static net.runelite.api.ItemID.RING_OF_WEALTH_5; +import static net.runelite.api.ItemID.ROLLING_PIN; +import static net.runelite.api.ItemID.RUBY_AMULET; +import static net.runelite.api.ItemID.RUBY_RING; +import static net.runelite.api.ItemID.RUNE_AXE; +import static net.runelite.api.ItemID.RUNE_BOOTS; +import static net.runelite.api.ItemID.RUNE_CROSSBOW; +import static net.runelite.api.ItemID.RUNE_FULL_HELM; +import static net.runelite.api.ItemID.RUNE_HALBERD; +import static net.runelite.api.ItemID.RUNE_HELM_H1; +import static net.runelite.api.ItemID.RUNE_HELM_H5; +import static net.runelite.api.ItemID.RUNE_KITESHIELD; +import static net.runelite.api.ItemID.RUNE_LONGSWORD; +import static net.runelite.api.ItemID.RUNE_PICKAXE; +import static net.runelite.api.ItemID.RUNE_PLATEBODY; +import static net.runelite.api.ItemID.RUNE_PLATELEGS; +import static net.runelite.api.ItemID.RUNE_PLATESKIRT; +import static net.runelite.api.ItemID.RUNE_SHIELD_H1; +import static net.runelite.api.ItemID.RUNE_SHIELD_H2; +import static net.runelite.api.ItemID.RUNE_SHIELD_H3; +import static net.runelite.api.ItemID.RUNE_SHIELD_H4; +import static net.runelite.api.ItemID.RUNE_SHIELD_H5; +import static net.runelite.api.ItemID.RUNE_SPEAR; +import static net.runelite.api.ItemID.RUNE_WARHAMMER; +import static net.runelite.api.ItemID.SAPPHIRE_AMULET; +import static net.runelite.api.ItemID.SAPPHIRE_NECKLACE; +import static net.runelite.api.ItemID.SAPPHIRE_RING; +import static net.runelite.api.ItemID.SARADOMIN_CROZIER; +import static net.runelite.api.ItemID.SARADOMIN_MITRE; +import static net.runelite.api.ItemID.SARADOMIN_STOLE; +import static net.runelite.api.ItemID.SEERCULL; +import static net.runelite.api.ItemID.SHADOW_SWORD; +import static net.runelite.api.ItemID.SILVER_SICKLE; +import static net.runelite.api.ItemID.SLAYER_HELMET; +import static net.runelite.api.ItemID.SLAYER_HELMET_I; +import static net.runelite.api.ItemID.SLED_4084; +import static net.runelite.api.ItemID.SNAKESKIN_BOOTS; +import static net.runelite.api.ItemID.SNAKESKIN_CHAPS; +import static net.runelite.api.ItemID.SPINED_CHAPS; +import static net.runelite.api.ItemID.SPLITBARK_BODY; +import static net.runelite.api.ItemID.SPLITBARK_LEGS; +import static net.runelite.api.ItemID.SPOTTED_CAPE; +import static net.runelite.api.ItemID.SPOTTED_CAPE_10073; +import static net.runelite.api.ItemID.STAFF; +import static net.runelite.api.ItemID.STAFF_OF_AIR; +import static net.runelite.api.ItemID.STAFF_OF_WATER; +import static net.runelite.api.ItemID.STEEL_AXE; +import static net.runelite.api.ItemID.STEEL_FULL_HELM; +import static net.runelite.api.ItemID.STEEL_KITESHIELD; +import static net.runelite.api.ItemID.STEEL_LONGSWORD; +import static net.runelite.api.ItemID.STEEL_MACE; +import static net.runelite.api.ItemID.STEEL_MED_HELM; +import static net.runelite.api.ItemID.STEEL_PICKAXE; +import static net.runelite.api.ItemID.STEEL_PLATEBODY; +import static net.runelite.api.ItemID.STEEL_PLATESKIRT; +import static net.runelite.api.ItemID.STEEL_SQ_SHIELD; +import static net.runelite.api.ItemID.STUDDED_BODY; +import static net.runelite.api.ItemID.STUDDED_CHAPS; +import static net.runelite.api.ItemID.TEAM1_CAPE; +import static net.runelite.api.ItemID.TEAM50_CAPE; +import static net.runelite.api.ItemID.TIARA; +import static net.runelite.api.ItemID.TOKTZKETXIL; +import static net.runelite.api.ItemID.TOKTZXILUL; +import static net.runelite.api.ItemID.TORAGS_HAMMERS_0; +import static net.runelite.api.ItemID.TORAGS_HAMMERS_100; +import static net.runelite.api.ItemID.TORAGS_HELM_0; +import static net.runelite.api.ItemID.TORAGS_HELM_100; +import static net.runelite.api.ItemID.TORAGS_PLATEBODY_0; +import static net.runelite.api.ItemID.TORAGS_PLATEBODY_100; +import static net.runelite.api.ItemID.TORAGS_PLATELEGS_0; +import static net.runelite.api.ItemID.TORAGS_PLATELEGS_100; +import static net.runelite.api.ItemID.TURQUOISE_ROBE_BOTTOMS; +import static net.runelite.api.ItemID.TURQUOISE_SLAYER_HELMET; +import static net.runelite.api.ItemID.TURQUOISE_SLAYER_HELMET_I; +import static net.runelite.api.ItemID.UNHOLY_BOOK; +import static net.runelite.api.ItemID.VERACS_BRASSARD_0; +import static net.runelite.api.ItemID.VERACS_BRASSARD_100; +import static net.runelite.api.ItemID.VERACS_FLAIL_0; +import static net.runelite.api.ItemID.VERACS_FLAIL_100; +import static net.runelite.api.ItemID.VERACS_HELM_0; +import static net.runelite.api.ItemID.VERACS_HELM_100; +import static net.runelite.api.ItemID.VERACS_PLATESKIRT_0; +import static net.runelite.api.ItemID.VERACS_PLATESKIRT_100; +import static net.runelite.api.ItemID.WHITE_APRON; +import static net.runelite.api.ItemID.WHITE_BOATER; +import static net.runelite.api.ItemID.WHITE_HEADBAND; +import static net.runelite.api.ItemID.ZAMORAK_CROZIER; +import static net.runelite.api.ItemID.ZAMORAK_FULL_HELM; +import static net.runelite.api.ItemID.ZAMORAK_GODSWORD; +import static net.runelite.api.ItemID.ZAMORAK_MITRE; +import static net.runelite.api.ItemID.ZAMORAK_STOLE; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_CONTENT_COLOR; @@ -50,13 +379,40 @@ import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.EMOTE_IMA import net.runelite.client.plugins.cluescrolls.clues.emote.AllRequirementsCollection; import net.runelite.client.plugins.cluescrolls.clues.emote.AnyRequirementCollection; import net.runelite.client.plugins.cluescrolls.clues.emote.Emote; -import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.*; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.ANGRY; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.BECKON; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.BLOW_KISS; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.BOW; import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.BULL_ROARER; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.CHEER; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.CLAP; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.CRY; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.DANCE; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.FLAP; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.GOBLIN_SALUTE; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.HEADBANG; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.JIG; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.JUMP_FOR_JOY; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.LAUGH; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.NO; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.PANIC; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.PUSH_UP; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.RASPBERRY; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.SALUTE; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.SHRUG; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.SLAP_HEAD; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.SPIN; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.STOMP; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.THINK; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.WAVE; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.YAWN; +import static net.runelite.client.plugins.cluescrolls.clues.emote.Emote.YES; import net.runelite.client.plugins.cluescrolls.clues.emote.ItemRequirement; import net.runelite.client.plugins.cluescrolls.clues.emote.RangeItemRequirement; import net.runelite.client.plugins.cluescrolls.clues.emote.SingleItemRequirement; import net.runelite.client.plugins.cluescrolls.clues.emote.SlotLimitationRequirement; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -227,22 +583,30 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu { panelComponent.setTitle("Emote Clue"); - panelComponent.getLines().add(new PanelComponent.Line("Emotes:")); - panelComponent.getLines().add(new PanelComponent.Line(getFirstEmote().getName(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder().left("Emotes:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getFirstEmote().getName()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); + if (getSecondEmote() != null) { - panelComponent.getLines().add(new PanelComponent.Line(getSecondEmote().getName(), TITLED_CONTENT_COLOR)); + panelComponent.getChildren().add(LineComponent.builder() + .left(getSecondEmote().getName()) + .leftColor(TITLED_CONTENT_COLOR) + .build()); } if (getItemRequirements() == null) { - panelComponent.setWidth(130); - panelComponent.getLines().add(new PanelComponent.Line("Items:", "None")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Items:") + .right("None") + .build()); } else { - panelComponent.setWidth(160); - panelComponent.getLines().add(new PanelComponent.Line("Equip:")); + panelComponent.getChildren().add(LineComponent.builder().left("Equip:").build()); Item[] items = plugin.getEquippedItems(); @@ -255,10 +619,13 @@ public class EmoteClue extends ClueScroll implements TextClueScroll, LocationClu for (ItemRequirement requirement : getItemRequirements()) { boolean found = requirement.fulfilledBy(items); - panelComponent.getLines().add(new PanelComponent.Line( - requirement.getCollectiveName(plugin.getClient()), TITLED_CONTENT_COLOR, - found ? "X" : "-", found ? Color.GREEN : Color.RED) - ); + + panelComponent.getChildren().add(LineComponent.builder() + .left(requirement.getCollectiveName(plugin.getClient())) + .leftColor(TITLED_CONTENT_COLOR) + .right(found ? "X" : "-") + .rightColor(found ? Color.GREEN : Color.RED) + .build()); } } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java index fdaff7cff2..87a153350d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/FairyRingClue.java @@ -35,6 +35,7 @@ import static net.runelite.client.plugins.cluescrolls.ClueScrollOverlay.TITLED_C import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; import static net.runelite.client.plugins.cluescrolls.ClueScrollPlugin.SPADE_IMAGE; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -66,13 +67,15 @@ public class FairyRingClue extends ClueScroll implements TextClueScroll, Locatio public void makeOverlayHint(PanelComponent panelComponent, ClueScrollPlugin plugin) { panelComponent.setTitle("Fairy Ring Clue"); - panelComponent.setWidth(140); + panelComponent.getChildren().add(LineComponent.builder().left("Code:").build()); + panelComponent.getChildren().add(LineComponent.builder() + .left(getText().substring(0, 5)) + .leftColor(TITLED_CONTENT_COLOR) + .build()); - panelComponent.getLines().add(new PanelComponent.Line("Code:")); - panelComponent.getLines().add(new PanelComponent.Line(getText().substring(0, 5), TITLED_CONTENT_COLOR)); - - panelComponent.getLines().add(new PanelComponent.Line("Travel to the fairy ring")); - panelComponent.getLines().add(new PanelComponent.Line("to see where to dig.")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Travel to the fairy ring to see where to dig.") + .build()); } @Override diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java index 94b50698a3..66d049bf16 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cluescrolls/clues/MapClue.java @@ -32,7 +32,10 @@ import lombok.Getter; import net.runelite.api.GameObject; import static net.runelite.api.ItemID.*; import net.runelite.api.ObjectComposition; -import static net.runelite.api.ObjectID.*; +import static net.runelite.api.ObjectID.CRATE_18506; +import static net.runelite.api.ObjectID.CRATE_2620; +import static net.runelite.api.ObjectID.CRATE_354; +import static net.runelite.api.ObjectID.CRATE_357; import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.plugins.cluescrolls.ClueScrollPlugin; @@ -43,6 +46,7 @@ import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLI import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.CLICKBOX_HOVER_BORDER_COLOR; import static net.runelite.client.plugins.cluescrolls.ClueScrollWorldOverlay.IMAGE_Z_OFFSET; import net.runelite.client.ui.overlay.OverlayUtil; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; @Getter @@ -103,25 +107,24 @@ public class MapClue extends ClueScroll implements ObjectClueScroll if (objectId != -1) { - panelComponent.setWidth(150); - ObjectComposition objectToClick = plugin.getClient().getObjectDefinition(getObjectId()); String objectName = "N/A"; + if (objectToClick != null) { objectName = objectToClick.getName(); } - panelComponent.getLines().add(new PanelComponent.Line("Travel to the destination")); - panelComponent.getLines().add(new PanelComponent.Line("and click the " + objectName + ".")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Travel to the destination and click the " + objectName + ".") + .build()); } else { - panelComponent.setWidth(160); - - panelComponent.getLines().add(new PanelComponent.Line("Travel to the destination")); - panelComponent.getLines().add(new PanelComponent.Line("and dig on the marked tile.")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Travel to the destination and dig on the marked tile.") + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java index e49282d44f..1079c6b5ea 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/LocationOverlay.java @@ -34,12 +34,14 @@ import net.runelite.api.coords.LocalPoint; import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class LocationOverlay extends Overlay { private final Client client; private final DevToolsPlugin plugin; + private final PanelComponent panelComponent = new PanelComponent(); @Inject LocationOverlay(Client client, DevToolsPlugin plugin) @@ -57,7 +59,7 @@ public class LocationOverlay extends Overlay return null; } - PanelComponent panelComponent = new PanelComponent(); + panelComponent.setPreferredSize(new Dimension(150, 0)); WorldPoint localWorld = client.getLocalPlayer().getWorldLocation(); LocalPoint localPoint = client.getLocalPlayer().getLocalLocation(); @@ -66,8 +68,9 @@ public class LocationOverlay extends Overlay if (client.isInInstancedRegion()) { - panelComponent.setWidth(150); - panelComponent.getLines().add(new PanelComponent.Line("Instance")); + panelComponent.getChildren().add(LineComponent.builder() + .left("Instance") + .build()); int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); int z = client.getPlane(); @@ -77,25 +80,26 @@ public class LocationOverlay extends Overlay int chunkY = (chunkData >> 3 & 0x7FF) * CHUNK_SIZE; int chunkX = (chunkData >> 14 & 0x3FF) * CHUNK_SIZE; - panelComponent.getLines().add(new PanelComponent.Line( - "Chunk " + localPoint.getRegionX() / CHUNK_SIZE + "," + localPoint.getRegionY() / CHUNK_SIZE, - rotation + " " + chunkX + " " + chunkY - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Chunk " + localPoint.getRegionX() / CHUNK_SIZE + "," + localPoint.getRegionY() / CHUNK_SIZE) + .right(rotation + " " + chunkX + " " + chunkY) + .build()); } - panelComponent.getLines().add(new PanelComponent.Line( - "Tile", - localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane() - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Tile") + .right(localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane()) + .build()); for (int i = 0; i < client.getMapRegions().length; i++) { int region = client.getMapRegions()[i]; - panelComponent.getLines().add(new PanelComponent.Line( - (i == 0) ? "Map regions" : " ", new Color(255, 255, 255, 255), - String.valueOf(region), (region == regionID) ? new Color(0, 255, 0, 255) : new Color(255, 255, 255, 255) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left((i == 0) ? "Map regions" : " ") + .right(String.valueOf(region)) + .rightColor((region == regionID) ? Color.GREEN : Color.WHITE) + .build()); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java index 6cb78e2b92..73b701505e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/FightCaveOverlay.java @@ -29,7 +29,6 @@ import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; -import net.runelite.client.ui.overlay.components.ImagePanelComponent; import javax.imageio.ImageIO; import javax.inject.Inject; @@ -38,6 +37,8 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; +import net.runelite.client.ui.overlay.components.ImageComponent; +import net.runelite.client.ui.overlay.components.PanelComponent; @Slf4j public class FightCaveOverlay extends Overlay @@ -46,7 +47,7 @@ public class FightCaveOverlay extends Overlay private final Client client; private final FightCavePlugin plugin; - + private final PanelComponent imagePanelComponent = new PanelComponent(); private BufferedImage protectFromMagicImg; private BufferedImage protectFromMissilesImg; @@ -68,13 +69,14 @@ public class FightCaveOverlay extends Overlay return null; } BufferedImage prayerImage = getPrayerImage(attack); - ImagePanelComponent imagePanelComponent = new ImagePanelComponent(); imagePanelComponent.setTitle("TzTok-Jad"); - imagePanelComponent.getImages().add(prayerImage); + imagePanelComponent.getChildren().add(new ImageComponent(prayerImage)); + if (!client.isPrayerActive(attack.getPrayer())) { imagePanelComponent.setBackgroundColor(NOT_ACTIVATED_BACKGROUND_COLOR); } + return imagePanelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java index 6e0c1a0e01..715f410ee0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fishing/FishingOverlay.java @@ -35,6 +35,7 @@ import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; class FishingOverlay extends Overlay @@ -81,7 +82,7 @@ class FishingOverlay extends Overlay return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); if (client.getLocalPlayer().getInteracting() != null && client.getLocalPlayer().getInteracting().getName() .contains(FISHING_SPOT)) { @@ -97,17 +98,17 @@ class FishingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.FISHING); if (actions > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Caught fish:", - Integer.toString(actions) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Caught fish:") + .right(Integer.toString(actions)) + .build()); if (actions > 2) { - panelComponent.getLines().add(new PanelComponent.Line( - "Fish/hr:", - Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING)) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Fish/hr:") + .right(Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))) + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java index d4266dbf13..9952b402eb 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/hunter/TrapOverlay.java @@ -37,7 +37,7 @@ import net.runelite.api.coords.WorldPoint; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; -import net.runelite.client.ui.overlay.components.ProgressPie; +import net.runelite.client.ui.overlay.components.ProgressPieComponent; /** * Represents the overlay that shows timers on traps that are placed by the @@ -148,10 +148,12 @@ public class TrapOverlay extends Overlay double timeLeft = 1 - trap.getTrapTimeRelative(); - ProgressPie pie = new ProgressPie(); + ProgressPieComponent pie = new ProgressPieComponent(); pie.setFill(timeLeft > TIMER_LOW ? fill : fillTimeLow); pie.setBorderColor(timeLeft > TIMER_LOW ? border : borderTimeLow); - pie.render(graphics, loc, timeLeft); + pie.setPosition(loc); + pie.setProgress(timeLeft); + pie.render(graphics); } /** @@ -175,9 +177,11 @@ public class TrapOverlay extends Overlay } net.runelite.api.Point loc = Perspective.worldToCanvas(client, localLoc.getX(), localLoc.getY(), trap.getWorldLocation().getPlane()); - ProgressPie pie = new ProgressPie(); + ProgressPieComponent pie = new ProgressPieComponent(); pie.setFill(fill); pie.setBorderColor(border); - pie.render(graphics, loc, 1); + pie.setPosition(loc); + pie.setProgress(1); + pie.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java index 6806ca109f..553eb6d3f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeGemOverlay.java @@ -31,6 +31,7 @@ import java.time.Instant; import javax.inject.Inject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class MotherlodeGemOverlay extends Overlay @@ -70,41 +71,42 @@ public class MotherlodeGemOverlay extends Overlay int emeraldsFound = session.getEmeraldsFound(); int sapphiresFound = session.getSapphiresFound(); - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); panelComponent.setTitle("Gems found"); if (diamondsFound > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Diamonds:", - Integer.toString(diamondsFound) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Diamonds:") + .right(Integer.toString(diamondsFound)) + .build()); } if (rubiesFound > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Rubies:", - Integer.toString(rubiesFound) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Rubies:") + .right(Integer.toString(rubiesFound)) + .build()); } if (emeraldsFound > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Emeralds:", - Integer.toString(emeraldsFound) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Emeralds:") + .right(Integer.toString(emeraldsFound)) + .build()); } if (sapphiresFound > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Sapphires:", - Integer.toString(sapphiresFound) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Sapphires:") + .right(Integer.toString(sapphiresFound)) + .build()); } + return panelComponent.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java index b11486926f..f5db4f84c6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOverlay.java @@ -45,6 +45,7 @@ import static net.runelite.api.AnimationID.MINING_MOTHERLODE_STEEL; import net.runelite.api.Client; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; class MotherlodeOverlay extends Overlay @@ -93,7 +94,7 @@ class MotherlodeOverlay extends Overlay return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); if (config.showMiningState()) { @@ -113,17 +114,15 @@ class MotherlodeOverlay extends Overlay panelComponent.setTitle(null); } - panelComponent.getLines().add(new PanelComponent.Line( - "Pay-dirt mined:", - Integer.toString(session.getTotalMined()) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Pay-dirt mined:") + .right(Integer.toString(session.getTotalMined())) + .build()); - panelComponent.getLines().add(new PanelComponent.Line( - "Pay-dirt/hr:", - session.getRecentMined() > 2 - ? Integer.toString(session.getPerHour()) - : "" - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Pay-dirt/hr:") + .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") + .build()); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java index 311f649f04..e568341278 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeSackOverlay.java @@ -37,6 +37,7 @@ import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.BackgroundComponent; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; class MotherlodeSackOverlay extends Overlay @@ -67,7 +68,7 @@ class MotherlodeSackOverlay extends Overlay Widget sack = client.getWidget(WidgetInfo.MOTHERLODE_MINE); - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); panelComponent.setBackgroundColor(BackgroundComponent.DEFAULT_BACKGROUND_COLOR); if (sack != null) @@ -81,23 +82,16 @@ class MotherlodeSackOverlay extends Overlay panelComponent.setBackgroundColor(DANGER); } - panelComponent.getLines().add(new PanelComponent.Line( - "Pay-dirt in sack:", - Color.WHITE, - String.valueOf(client.getVar(Varbits.SACK_NUMBER)), - Color.WHITE - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Pay-dirt in sack:") + .right(String.valueOf(client.getVar(Varbits.SACK_NUMBER))) + .build()); } if (config.showDepositsLeft()) { final Integer depositsLeft = plugin.getDepositsLeft(); - final PanelComponent.Line line = new PanelComponent.Line( - "Deposits left:", - Color.WHITE, - depositsLeft == null ? "N/A" : String.valueOf(depositsLeft), - Color.WHITE - ); + Color color = Color.WHITE; if (depositsLeft != null) { @@ -107,12 +101,16 @@ class MotherlodeSackOverlay extends Overlay } else if (depositsLeft == 1) { - line.setLeftColor(Color.RED); - line.setRightColor(Color.RED); + color = Color.RED; } } - panelComponent.getLines().add(line); + panelComponent.getChildren().add(LineComponent.builder() + .left("Deposits left:") + .leftColor(color) + .right(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft)) + .rightColor(color) + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java index dcd3e2c802..937ff59961 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/nightmarezone/NightmareZoneOverlay.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.nightmarezone; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; @@ -37,6 +36,7 @@ import net.runelite.client.game.ItemManager; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.StackFormatter; @@ -96,13 +96,11 @@ class NightmareZoneOverlay extends Overlay renderAbsorptionCounter(); - panelComponent.getLines().clear(); - panelComponent.getLines().add(new PanelComponent.Line( - "Points: ", - Color.WHITE, - StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS)), - Color.WHITE - )); + panelComponent.getChildren().clear(); + panelComponent.getChildren().add(LineComponent.builder() + .left("Points: ") + .right(StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS))) + .build()); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java index a6f9680368..c6d1638bdc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsOverlay.java @@ -33,6 +33,7 @@ import net.runelite.client.plugins.raids.solver.Room; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class RaidsOverlay extends Overlay @@ -61,7 +62,7 @@ public class RaidsOverlay extends Overlay return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); if (plugin.getRaid() == null || plugin.getRaid().getLayout() == null) { @@ -81,9 +82,11 @@ public class RaidsOverlay extends Overlay color = Color.RED; } - panelComponent.getLines().add(new PanelComponent.Line( - "Layout", Color.WHITE, layout, color - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Layout") + .right(layout) + .rightColor(color) + .build()); int bossMatches = 0; int bossCount = 0; @@ -119,9 +122,12 @@ public class RaidsOverlay extends Overlay color = Color.RED; } - panelComponent.getLines().add(new PanelComponent.Line( - room.getType().getName(), Color.WHITE, room.getBoss().getName(), color - )); + panelComponent.getChildren().add(LineComponent.builder() + .left(room.getType().getName()) + .right(room.getBoss().getName()) + .rightColor(color) + .build()); + break; case PUZZLE: @@ -134,9 +140,11 @@ public class RaidsOverlay extends Overlay color = Color.RED; } - panelComponent.getLines().add(new PanelComponent.Line( - room.getType().getName(), Color.WHITE, room.getPuzzle().getName(), color - )); + panelComponent.getChildren().add(LineComponent.builder() + .left(room.getType().getName()) + .right(room.getPuzzle().getName()) + .rightColor(color) + .build()); break; } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java index 1492c22c04..11ca3d8c40 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/raids/RaidsPointsOverlay.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.raids; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; @@ -34,6 +33,7 @@ import static net.runelite.client.plugins.raids.RaidsPlugin.POINTS_FORMAT; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class RaidsPointsOverlay extends Overlay @@ -64,16 +64,21 @@ public class RaidsPointsOverlay extends Overlay int totalPoints = client.getVar(Varbits.TOTAL_POINTS); int personalPoints = client.getVar(Varbits.PERSONAL_POINTS); - panel.getLines().clear(); - panel.getLines().add(new PanelComponent.Line( - "Total:", Color.WHITE, POINTS_FORMAT.format(totalPoints), Color.WHITE - )); - panel.getLines().add(new PanelComponent.Line( - client.getLocalPlayer().getName() + ":", Color.WHITE, POINTS_FORMAT.format(personalPoints), Color.WHITE - )); - panel.getLines().add(new PanelComponent.Line( - "Party size:", Color.WHITE, String.valueOf(client.getVar(Varbits.RAID_PARTY_SIZE)), Color.WHITE - )); + panel.getChildren().clear(); + panel.getChildren().add(LineComponent.builder() + .left("Total:") + .right(POINTS_FORMAT.format(totalPoints)) + .build()); + + panel.getChildren().add(LineComponent.builder() + .left(client.getLocalPlayer().getName() + ":") + .right(POINTS_FORMAT.format(personalPoints)) + .build()); + + panel.getChildren().add(LineComponent.builder() + .left("Party size:") + .right(String.valueOf(client.getVar(Varbits.RAID_PARTY_SIZE))) + .build()); return panel.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java index 0cee24c583..0dd961d8fa 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/teamcapes/TeamCapesOverlay.java @@ -24,7 +24,6 @@ */ package net.runelite.client.plugins.teamcapes; -import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import java.util.Map; @@ -32,6 +31,7 @@ import javax.inject.Inject; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; public class TeamCapesOverlay extends Overlay @@ -57,20 +57,20 @@ public class TeamCapesOverlay extends Overlay { return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); + for (Map.Entry team : teams.entrySet()) { // Only display team capes that have a count greater than the configured minimum. if (team.getValue() >= config.getMinimumCapeCount()) { - panelComponent.getLines().add(new PanelComponent.Line( - "Team-" + Integer.toString(team.getKey()), - Color.WHITE, - Integer.toString(team.getValue()), - Color.WHITE - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Team-" + Integer.toString(team.getKey())) + .right(Integer.toString(team.getValue())) + .build()); } } + return panelComponent.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmSackOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmSackOverlay.java index 37b62a3d17..dd1c6ea0bf 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmSackOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/tithefarm/TitheFarmSackOverlay.java @@ -33,6 +33,7 @@ import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; class TitheFarmSackOverlay extends Overlay @@ -58,19 +59,20 @@ class TitheFarmSackOverlay extends Overlay return null; } - panelComponent.getLines().clear(); - + panelComponent.getChildren().clear(); sack.setHidden(true); + if (config.showSack()) { - panelComponent.getLines().add(new PanelComponent.Line( - "Fruits in sack:", - String.valueOf(client.getVar(Varbits.TITHE_FARM_SACK_AMOUNT)) - )); - panelComponent.getLines().add(new PanelComponent.Line( - "Points:", - String.valueOf(client.getVar(Varbits.TITHE_FARM_POINTS)) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Fruits in sack:") + .right(String.valueOf(client.getVar(Varbits.TITHE_FARM_SACK_AMOUNT))) + .build()); + + panelComponent.getChildren().add(LineComponent.builder() + .left("Points:") + .right(String.valueOf(client.getVar(Varbits.TITHE_FARM_POINTS))) + .build()); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java index 85930f689a..3fecafe6e6 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/woodcutting/WoodcuttingOverlay.java @@ -45,6 +45,7 @@ import net.runelite.api.Skill; import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; class WoodcuttingOverlay extends Overlay @@ -95,7 +96,7 @@ class WoodcuttingOverlay extends Overlay return null; } - panelComponent.getLines().clear(); + panelComponent.getChildren().clear(); if (IntStream.of(animationIds).anyMatch(x -> x == client.getLocalPlayer().getAnimation())) { @@ -111,17 +112,17 @@ class WoodcuttingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.WOODCUTTING); if (actions > 0) { - panelComponent.getLines().add(new PanelComponent.Line( - "Logs cut:", - Integer.toString(actions) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Logs cut:") + .right(Integer.toString(actions)) + .build()); if (actions > 2) { - panelComponent.getLines().add(new PanelComponent.Line( - "Logs/hr:", - Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING)) - )); + panelComponent.getChildren().add(LineComponent.builder() + .left("Logs/hr:") + .right(Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))) + .build()); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java index f9a5e2d065..b8976dd274 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/xpglobes/XpGlobesOverlay.java @@ -47,6 +47,7 @@ import net.runelite.client.plugins.xptracker.XpTrackerService; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; +import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.ProgressBarComponent; @@ -57,6 +58,7 @@ public class XpGlobesOverlay extends Overlay private final XpGlobesPlugin plugin; private final XpGlobesConfig config; private final XpTrackerService xpTrackerService; + private final PanelComponent xpTooltip = new PanelComponent(); @Inject private SkillIconManager iconManager; @@ -228,22 +230,38 @@ public class XpGlobesOverlay extends Overlay DecimalFormat decimalFormat = new DecimalFormat("###,###,###"); String skillCurrentXp = decimalFormat.format(mouseOverSkill.getCurrentXp()); - PanelComponent xpTooltip = new PanelComponent(); + xpTooltip.getChildren().clear(); xpTooltip.setPosition(new java.awt.Point(x, y)); - xpTooltip.setWidth(TOOLTIP_RECT_SIZE_X); + xpTooltip.setPreferredSize(new Dimension(TOOLTIP_RECT_SIZE_X, 0)); + + xpTooltip.getChildren().add(LineComponent.builder() + .left(skillName) + .right(skillLevel) + .build()); + + xpTooltip.getChildren().add(LineComponent.builder() + .left("Current xp:") + .leftColor(Color.ORANGE) + .right(skillCurrentXp) + .build()); - List lines = xpTooltip.getLines(); - lines.add(new PanelComponent.Line(skillName, Color.WHITE, skillLevel, Color.WHITE)); - lines.add(new PanelComponent.Line("Current xp:", Color.ORANGE, skillCurrentXp, Color.WHITE)); if (mouseOverSkill.getGoalXp() != -1) { int actionsLeft = xpTrackerService.getActionsLeft(mouseOverSkill.getSkill()); String actionsLeftString = decimalFormat.format(actionsLeft); - lines.add(new PanelComponent.Line("Actions left:", Color.ORANGE, actionsLeftString, Color.WHITE)); + xpTooltip.getChildren().add(LineComponent.builder() + .left("Actions left:") + .leftColor(Color.ORANGE) + .right(actionsLeftString) + .build()); int xpLeft = mouseOverSkill.getGoalXp() - mouseOverSkill.getCurrentXp(); String skillXpToLvl = decimalFormat.format(xpLeft); - lines.add(new PanelComponent.Line("Xp to level:", Color.ORANGE, skillXpToLvl, Color.WHITE)); + xpTooltip.getChildren().add(LineComponent.builder() + .left("Xp to level:") + .leftColor(Color.ORANGE) + .right(skillXpToLvl) + .build()); //Create progress bar for skill. ProgressBarComponent progressBar = new ProgressBarComponent(); @@ -251,7 +269,7 @@ public class XpGlobesOverlay extends Overlay mouseOverSkill.getCurrentXp(), mouseOverSkill.getGoalXp()); progressBar.setProgress(progress); - xpTooltip.setProgressBar(progressBar); + xpTooltip.getChildren().add(progressBar); } xpTooltip.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java new file mode 100644 index 0000000000..4eef508b39 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImageComponent.java @@ -0,0 +1,56 @@ +/* + * 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.components; + +import java.awt.Dimension; +import java.awt.Graphics2D; +import java.awt.image.BufferedImage; +import lombok.AllArgsConstructor; +import lombok.Setter; + +@AllArgsConstructor +@Setter +public class ImageComponent implements LayoutableRenderableEntity +{ + private BufferedImage image; + + @Override + public Dimension render(Graphics2D graphics) + { + if (image == null) + { + return null; + } + + graphics.drawImage(image, 0, -graphics.getFontMetrics().getHeight(), null); + return new Dimension(image.getWidth(), image.getHeight()); + } + + @Override + public void setPreferredSize(Dimension dimension) + { + // Just use image dimensions for now + } +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImagePanelComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImagePanelComponent.java deleted file mode 100644 index cc81463875..0000000000 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ImagePanelComponent.java +++ /dev/null @@ -1,127 +0,0 @@ -/* - * Copyright (c) 2017, Devin French - * 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.components; - -import com.google.common.base.Strings; -import java.awt.Color; -import java.awt.Dimension; -import java.awt.FontMetrics; -import java.awt.Graphics2D; -import java.awt.Point; -import java.awt.Rectangle; -import java.awt.image.BufferedImage; -import java.util.ArrayList; -import java.util.List; -import javax.annotation.Nullable; -import lombok.Getter; -import lombok.Setter; -import net.runelite.client.ui.overlay.RenderableEntity; - -public class ImagePanelComponent implements RenderableEntity -{ - private static final int TOP_BORDER = 4; - private static final int SIDE_BORDER = 4; - private static final int BOTTOM_BORDER = 4; - private static final int SEPARATOR = 1; - - @Setter - @Nullable - private String title; - - @Setter - private Color titleColor = Color.WHITE; - - @Setter - private Color backgroundColor = BackgroundComponent.DEFAULT_BACKGROUND_COLOR; - - @Getter - private final List images = new ArrayList<>(); - - @Setter - private Point position = new Point(); - - @Override - public Dimension render(Graphics2D graphics) - { - final Dimension dimension = new Dimension(); - final FontMetrics metrics = graphics.getFontMetrics(); - - //Determine max height and width of images - int maxImageHeight = 0; - int imageWidth = 0; - for (final BufferedImage image : images) - { - if (image.getHeight() > maxImageHeight) - { - maxImageHeight = image.getHeight(); - } - imageWidth += image.getWidth() + SEPARATOR; - } - - int height = TOP_BORDER + (Strings.isNullOrEmpty(title) ? 0 : metrics.getHeight() + SEPARATOR) - + maxImageHeight + BOTTOM_BORDER; - int width = Math.max(Strings.isNullOrEmpty(title) ? 0 : metrics.stringWidth(title), imageWidth) + SIDE_BORDER * 2; - dimension.setSize(width, height); - - if (dimension.height == TOP_BORDER + BOTTOM_BORDER) - { - return null; - } - - int y = position.y + TOP_BORDER; - if (!Strings.isNullOrEmpty(title)) - { - // Calculate panel dimensions - y += metrics.getHeight(); - } - - // Render background - final BackgroundComponent backgroundComponent = new BackgroundComponent(); - backgroundComponent.setBackgroundColor(backgroundColor); - backgroundComponent.setRectangle(new Rectangle(position.x, position.y, dimension.width, dimension.height)); - backgroundComponent.render(graphics); - - // Render title - if (!Strings.isNullOrEmpty(title)) - { - final TextComponent titleComponent = new TextComponent(); - titleComponent.setText(title); - titleComponent.setColor(titleColor); - titleComponent.setPosition(new Point(position.x + (width - metrics.stringWidth(title)) / 2, y)); - titleComponent.render(graphics); - y += SEPARATOR; - } - - // Render all images - int imageOffsetX = ((width - imageWidth) / 2); - for (final BufferedImage image : images) - { - graphics.drawImage(image, imageOffsetX + ((imageWidth / images.size()) - image.getWidth()) / 2, y, null); - imageOffsetX += image.getWidth() + SEPARATOR; - } - - return dimension; - } -} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java new file mode 100644 index 0000000000..b717f58706 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LayoutableRenderableEntity.java @@ -0,0 +1,33 @@ +/* + * 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.components; + +import java.awt.Dimension; +import net.runelite.client.ui.overlay.RenderableEntity; + +public interface LayoutableRenderableEntity extends RenderableEntity +{ + void setPreferredSize(Dimension dimension); +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java new file mode 100644 index 0000000000..1cdcf68df6 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/LineComponent.java @@ -0,0 +1,170 @@ +/* + * 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.components; + +import com.google.common.base.MoreObjects; +import com.google.common.base.Strings; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import lombok.Builder; +import lombok.Setter; + +@Setter +@Builder +public class LineComponent implements LayoutableRenderableEntity +{ + private static final int SEPARATOR = 1; + + private String left; + private String right; + + @Builder.Default + private Color leftColor = Color.WHITE; + + @Builder.Default + private Color rightColor = Color.WHITE; + + @Builder.Default + private Dimension preferredSize = new Dimension(); + + @Override + public Dimension render(Graphics2D graphics) + { + // Prevent NPEs + final String left = MoreObjects.firstNonNull(this.left, ""); + final String right = MoreObjects.firstNonNull(this.right, ""); + + final FontMetrics metrics = graphics.getFontMetrics(); + int x = 0; + int y = 0; + final int leftFullWidth = getLineWidth(left, metrics); + final int rightFullWidth = getLineWidth(right, metrics); + + if (preferredSize.width < leftFullWidth + rightFullWidth) + { + int leftSmallWidth = preferredSize.width; + int rightSmallWidth = 0; + + if (!Strings.isNullOrEmpty(right)) + { + rightSmallWidth = (preferredSize.width / 3); + leftSmallWidth -= rightSmallWidth; + } + + final String[] leftSplitLines = lineBreakText(left, leftSmallWidth, metrics); + final String[] rightSplitLines = lineBreakText(right, rightSmallWidth, metrics); + + int lineCount = Math.max(leftSplitLines.length, rightSplitLines.length); + + for (int i = 0; i < lineCount; i++) + { + String leftText = ""; + String rightText = ""; + + if (i < leftSplitLines.length) + { + leftText = leftSplitLines[i]; + } + + if (i < rightSplitLines.length) + { + rightText = rightSplitLines[i]; + } + + final TextComponent leftLineComponent = new TextComponent(); + leftLineComponent.setPosition(new Point(x, y)); + leftLineComponent.setText(leftText); + leftLineComponent.setColor(leftColor); + leftLineComponent.render(graphics); + + final TextComponent rightLineComponent = new TextComponent(); + rightLineComponent.setPosition(new Point(x + leftSmallWidth + rightFullWidth - getLineWidth(rightText, metrics), y)); + rightLineComponent.setText(rightText); + rightLineComponent.setColor(rightColor); + rightLineComponent.render(graphics); + y += metrics.getHeight() + SEPARATOR; + } + + return new Dimension(preferredSize.width, y); + } + + final TextComponent leftLineComponent = new TextComponent(); + leftLineComponent.setPosition(new Point(x, y)); + leftLineComponent.setText(left); + leftLineComponent.setColor(leftColor); + leftLineComponent.render(graphics); + + final TextComponent rightLineComponent = new TextComponent(); + rightLineComponent.setPosition(new Point(x + preferredSize.width - getLineWidth(right, metrics), y)); + rightLineComponent.setText(right); + rightLineComponent.setColor(rightColor); + rightLineComponent.render(graphics); + y += metrics.getHeight() + SEPARATOR; + + return new Dimension(preferredSize.width, y); + } + + private static int getLineWidth(final String line, final FontMetrics metrics) + { + return metrics.stringWidth(TextComponent.textWithoutColTags(line)); + } + + private static String[] lineBreakText(String text, int maxWidth, FontMetrics metrics) + { + final String[] words = text.split(" "); + + if (words.length == 0) + { + return new String[0]; + } + + final StringBuilder wrapped = new StringBuilder(words[0]); + int spaceLeft = maxWidth - metrics.stringWidth(wrapped.toString()); + + for (int i = 1; i < words.length; i++) + { + final String word = words[i]; + final int wordLen = metrics.stringWidth(word); + final int spaceWidth = metrics.stringWidth(" "); + + if (wordLen + spaceWidth > spaceLeft) + { + wrapped.append("\n").append(word); + spaceLeft = maxWidth - wordLen; + } + else + { + wrapped.append(" ").append(word); + spaceLeft -= spaceWidth + wordLen; + } + } + + return wrapped.toString().split("\n"); + } +} + diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java index 600c01287d..0bf95c128d 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/PanelComponent.java @@ -33,78 +33,23 @@ import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; import java.util.List; -import java.util.ListIterator; -import java.util.Objects; -import lombok.AllArgsConstructor; -import lombok.Data; import lombok.Getter; import lombok.Setter; -import net.runelite.client.ui.overlay.RenderableEntity; -public class PanelComponent implements RenderableEntity +public class PanelComponent implements LayoutableRenderableEntity { + public enum Orientation + { + HORIZONTAL, + VERTICAL; + } + private static final int TOP_BORDER = 4; private static final int LEFT_BORDER = 4; private static final int RIGHT_BORDER = 4; private static final int BOTTOM_BORDER = 4; private static final int SEPARATOR = 1; - @Data - @AllArgsConstructor - public static class Line - { - private boolean wrapWords; - private String left; - private Color leftColor = Color.WHITE; - private String right = ""; - private Color rightColor = Color.WHITE; - - public Line(String left) - { - this.left = left; - } - - public Line(boolean wrapWords, String left) - { - this.wrapWords = wrapWords; - this.left = left; - } - - public Line(String left, Color leftColor) - { - this.left = left; - this.leftColor = leftColor; - } - - public Line(boolean wrapWords, String left, Color leftColor) - { - this.wrapWords = wrapWords; - this.left = left; - this.leftColor = leftColor; - } - - public Line(String left, String right) - { - this.left = left; - this.right = right; - } - - public Line(boolean wrapWords, String left, String right) - { - this.wrapWords = wrapWords; - this.left = left; - this.right = right; - } - - public Line(String left, Color leftColor, String right, Color rightColor) - { - this.left = left; - this.leftColor = leftColor; - this.right = right; - this.rightColor = rightColor; - } - } - @Setter private String title; @@ -117,152 +62,92 @@ public class PanelComponent implements RenderableEntity @Setter private Point position = new Point(); + @Setter + private Dimension preferredSize = new Dimension(129, 0); + @Getter - private List lines = new ArrayList<>(); + private List children = new ArrayList<>(); @Setter - private ProgressBarComponent progressBar; + private Orientation orientation = Orientation.VERTICAL; - @Setter - private int width = 129; + private final Dimension savedChildrenSize = new Dimension(); @Override public Dimension render(Graphics2D graphics) { - final FontMetrics metrics = graphics.getFontMetrics(); - - // Do word wrapping - ListIterator iterator = lines.listIterator(); - while (iterator.hasNext()) - { - Line line = iterator.next(); - - if (line.wrapWords) - { - iterator.remove(); - - int maxWidth = width; - if (line.right.length() > 0) - { - maxWidth /= 2; - } - maxWidth -= LEFT_BORDER + RIGHT_BORDER; - - List leftSplitLines = lineBreakText(line.getLeft(), maxWidth, metrics); - List rightSplitLines = lineBreakText(line.getRight(), maxWidth, metrics); - - int lineCount = Math.max(leftSplitLines.size(), rightSplitLines.size()); - - for (int i = 0; i < lineCount; i++) - { - String left = ""; - String right = ""; - - if (i < leftSplitLines.size()) - { - left = leftSplitLines.get(i); - } - - if (i < rightSplitLines.size()) - { - right = rightSplitLines.get(i); - } - - iterator.add(new Line(false, left, line.getLeftColor(), right, line.getRightColor())); - } - } - } - - final Dimension dimension = new Dimension(); - final int elementNumber = (Strings.isNullOrEmpty(title) ? 0 : 1) + lines.size() + (Objects.isNull(progressBar) ? 0 : 1); - int height = elementNumber == 0 ? 0 : - TOP_BORDER + (graphics.getFontMetrics().getHeight() * elementNumber) - + SEPARATOR * elementNumber + (Objects.isNull(progressBar) ? 0 : progressBar.getHeight() / 2) - + BOTTOM_BORDER; - dimension.setSize(width, height); - - if (dimension.height == 0) + if (Strings.isNullOrEmpty(title) && children.isEmpty()) { return null; } + final FontMetrics metrics = graphics.getFontMetrics(); + // Calculate panel dimensions - int y = position.y + TOP_BORDER + metrics.getHeight(); + int width = preferredSize.width; + int height = preferredSize.height; + int x = LEFT_BORDER; + int y = TOP_BORDER + metrics.getHeight(); + + // Set graphics offset at correct position + graphics.translate(position.x, position.y); // Render background + final Dimension dimension = new Dimension( + savedChildrenSize.width + RIGHT_BORDER, + savedChildrenSize.height + BOTTOM_BORDER); + final BackgroundComponent backgroundComponent = new BackgroundComponent(); + backgroundComponent.setRectangle(new Rectangle(dimension)); backgroundComponent.setBackgroundColor(backgroundColor); - backgroundComponent.setRectangle(new Rectangle(position.x, position.y, dimension.width, dimension.height)); backgroundComponent.render(graphics); - // Render title if (!Strings.isNullOrEmpty(title)) { + // Render title final TextComponent titleComponent = new TextComponent(); titleComponent.setText(title); titleComponent.setColor(titleColor); - titleComponent.setPosition(new Point(position.x + (width - metrics.stringWidth(title)) / 2, y)); + titleComponent.setPosition(new Point((dimension.width - metrics.stringWidth(title)) / 2, y)); titleComponent.render(graphics); - y += metrics.getHeight() + SEPARATOR; + + // Move children a bit + height = y += metrics.getHeight() + SEPARATOR; } - // Render all lines - for (final Line line : lines) + // Render all children + final Dimension childPreferredSize = new Dimension( + preferredSize.width - RIGHT_BORDER, + preferredSize.height - BOTTOM_BORDER); + + for (final LayoutableRenderableEntity child : children) { - final TextComponent leftLineComponent = new TextComponent(); - leftLineComponent.setPosition(new Point(position.x + LEFT_BORDER, y)); - leftLineComponent.setText(line.getLeft()); - leftLineComponent.setColor(line.getLeftColor()); - leftLineComponent.render(graphics); + child.setPreferredSize(childPreferredSize); + graphics.translate(x, y); + final Dimension childDimension = child.render(graphics); + graphics.translate(-x, -y); - final TextComponent rightLineComponent = new TextComponent(); - rightLineComponent.setPosition(new Point(position.x + width - RIGHT_BORDER - metrics.stringWidth(TextComponent.textWithoutColTags(line.getRight())), y)); - rightLineComponent.setText(line.getRight()); - rightLineComponent.setColor(line.getRightColor()); - rightLineComponent.render(graphics); - y += metrics.getHeight() + SEPARATOR; + switch (orientation) + { + case VERTICAL: + height = y += childDimension.height + SEPARATOR; + width = Math.max(width, x + childDimension.width); + break; + case HORIZONTAL: + width = x += childDimension.width + SEPARATOR; + height = Math.max(height, y + childDimension.height); + break; + } } - //Render progress bar - if (!Objects.isNull(progressBar)) - { - progressBar.setWidth(width - LEFT_BORDER - RIGHT_BORDER); - progressBar.setPosition(new Point(position.x + LEFT_BORDER, y - (metrics.getHeight() / 2))); - progressBar.render(graphics); - } + // Reset the padding + height -= metrics.getHeight(); + // Save children size + savedChildrenSize.setSize(width, height); + + // Reset graphics position + graphics.translate(-position.x, -position.y); return dimension; } - - private List lineBreakText(String text, int maxWidth, FontMetrics metrics) - { - List lines = new ArrayList<>(); - - int pos = 0; - String[] words = text.split(" "); - String line = ""; - - while (pos < words.length) - { - String newLine = pos > 0 && !line.isEmpty() - ? line + " " + words[pos] - : words[pos]; - int width = metrics.stringWidth(newLine); - - if (width >= maxWidth) - { - lines.add(line); - line = ""; - } - else - { - line = newLine; - pos++; - } - } - - lines.add(line); - - return lines; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java index 00b8f624f5..6fbbaa5bb4 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressBarComponent.java @@ -31,10 +31,9 @@ import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; import java.text.DecimalFormat; -import lombok.Getter; import lombok.Setter; -public class ProgressBarComponent +public class ProgressBarComponent implements LayoutableRenderableEntity { @Setter private String text; @@ -54,20 +53,16 @@ public class ProgressBarComponent @Setter private Color fontColor = Color.WHITE; - @Getter @Setter - private int width = 140; - - @Getter - @Setter - private int height = 16; + private Dimension preferredSize = new Dimension(129, 16); + @Override public Dimension render(Graphics2D graphics) { FontMetrics metrics = graphics.getFontMetrics(); int barX = position.x; - int barY = position.y; + int barY = position.y - metrics.getHeight(); String textToWrite; if (Strings.isNullOrEmpty(text)) @@ -80,6 +75,9 @@ public class ProgressBarComponent textToWrite = text; } + int width = preferredSize.width; + int height = Math.max(preferredSize.height, 16); + int progressTextX = barX + (width - metrics.stringWidth(textToWrite)) / 2; int progressTextY = barY + ((height - metrics.getHeight()) / 2) + metrics.getAscent(); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPie.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java similarity index 91% rename from runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPie.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java index 0c7c26c3a1..9632ebca4c 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPie.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/ProgressPieComponent.java @@ -32,9 +32,10 @@ import java.awt.Stroke; import java.awt.geom.Arc2D; import lombok.Setter; import net.runelite.api.Point; +import net.runelite.client.ui.overlay.RenderableEntity; -public class ProgressPie +public class ProgressPieComponent implements RenderableEntity { @Setter private int diameter = 25; @@ -48,7 +49,14 @@ public class ProgressPie @Setter private Stroke stroke = new BasicStroke(1); - public Dimension render(Graphics2D graphics, Point position, double progress) + @Setter + private double progress; + + @Setter + private Point position; + + @Override + public Dimension render(Graphics2D graphics) { //Construct the arc Arc2D.Float arc = new Arc2D.Float(Arc2D.PIE); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java index 11f3615feb..b0656614c8 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TextComponent.java @@ -60,13 +60,13 @@ public class TextComponent implements RenderableEntity if (COL_TAG_PATTERN.matcher(text).find()) { - String[] parts = COL_TAG_PATTERN_W_LOOKAHEAD.split(text); + final String[] parts = COL_TAG_PATTERN_W_LOOKAHEAD.split(text); int x = position.x; - for (int i = 0; i < parts.length; i++) + + for (String textSplitOnCol : parts) { - String textSplitOnCol = parts[i]; - String textWithoutCol = textWithoutColTags(textSplitOnCol); - String colColor = textSplitOnCol.substring(textSplitOnCol.indexOf("=") + 1, textSplitOnCol.indexOf(">")); + final String textWithoutCol = textWithoutColTags(textSplitOnCol); + final String colColor = textSplitOnCol.substring(textSplitOnCol.indexOf("=") + 1, textSplitOnCol.indexOf(">")); // shadow graphics.setColor(Color.BLACK); @@ -89,6 +89,7 @@ public class TextComponent implements RenderableEntity graphics.setColor(color); graphics.drawString(text, position.x, position.y); } + return new Dimension(fontMetrics.stringWidth(text), fontMetrics.getHeight()); } }