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 6e38b663de..ca5b8411fc 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 @@ -111,16 +111,15 @@ class BoostsOverlay extends Overlay } String str; - Color strColor = Color.WHITE; + int boost = boosted - base; + Color strColor = getTextColor(boost); if (!config.useRelativeBoost()) { - str = boosted + "/" + base; + str = "" + boosted + "/" + base; } else { - int boost = boosted - base; str = String.valueOf(boost); - strColor = getTextColor(boost); if (boost > 0) { str = "+" + str; 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 d2a8cb1047..80d528b099 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 @@ -129,7 +129,7 @@ public class PanelComponent implements RenderableEntity leftLineComponent.render(graphics, parent); final TextComponent rightLineComponent = new TextComponent(); - rightLineComponent.setPosition(new Point(position.x + width - RIGHT_BORDER - metrics.stringWidth(line.getRight()), y)); + 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, parent); 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 095e3f1a4c..39a3568cff 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 @@ -29,11 +29,16 @@ import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; +import java.util.regex.Pattern; import lombok.Setter; import net.runelite.client.ui.overlay.RenderableEntity; public class TextComponent implements RenderableEntity { + private static final String COL_TAG_REGEX = "()"; + private static final Pattern COL_TAG_PATTERN_W_LOOKAHEAD = Pattern.compile("(?=" + COL_TAG_REGEX + ")"); + private static final Pattern COL_TAG_PATTERN = Pattern.compile(COL_TAG_REGEX); + @Setter private String text; @@ -43,18 +48,47 @@ public class TextComponent implements RenderableEntity @Setter private Color color = Color.WHITE; + public static String textWithoutColTags(String text) + { + return COL_TAG_PATTERN.matcher(text).replaceAll(""); + } + @Override public Dimension render(Graphics2D graphics, Point parent) { - // Draw shadow - graphics.setColor(Color.BLACK); - graphics.drawString(text, position.x + 1, position.y + 1); - - // Draw actual text - graphics.setColor(color); - graphics.drawString(text, position.x, position.y); - final FontMetrics fontMetrics = graphics.getFontMetrics(); + + if (COL_TAG_PATTERN.matcher(text).find()) + { + String[] parts = COL_TAG_PATTERN_W_LOOKAHEAD.split(text); + int x = position.x; + for (int i = 0; i < parts.length; i++) + { + String textSplitOnCol = parts[i]; + String textWithoutCol = textWithoutColTags(textSplitOnCol); + String colColor = textSplitOnCol.substring(textSplitOnCol.indexOf("=") + 1, textSplitOnCol.indexOf(">")); + + // shadow + graphics.setColor(Color.BLACK); + graphics.drawString(textWithoutCol, x + 1, position.y + 1); + + // actual text + graphics.setColor(Color.decode("#" + colColor)); + graphics.drawString(textWithoutCol, x, position.y); + + x += fontMetrics.stringWidth(textWithoutCol); + } + } + else + { + // shadow + graphics.setColor(Color.BLACK); + graphics.drawString(text, position.x + 1, position.y + 1); + + // actual text + graphics.setColor(color); + graphics.drawString(text, position.x, position.y); + } return new Dimension(fontMetrics.stringWidth(text), fontMetrics.getHeight()); } } diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java new file mode 100644 index 0000000000..52e44b90f6 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TextComponentTest.java @@ -0,0 +1,88 @@ +/* + * Copyright (c) 2018, Adam + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND + * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED + * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR + * ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND + * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS + * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ +package net.runelite.client.ui.overlay.components; + +import java.awt.Color; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import static org.mockito.Matchers.anyInt; +import static org.mockito.Matchers.eq; +import org.mockito.Mock; +import static org.mockito.Mockito.atLeastOnce; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TextComponentTest +{ + @Mock + private Graphics2D graphics; + + @Before + public void before() + { + when(graphics.getFontMetrics()).thenReturn(mock(FontMetrics.class)); + } + + @Test + public void testRender() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test"); + textComponent.setColor(Color.RED); + textComponent.render(graphics, new Point(0, 0)); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.RED); + } + + @Test + public void testRender2() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test"); + textComponent.render(graphics, new Point(0, 0)); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + } + + @Test + public void testRender3() + { + TextComponent textComponent = new TextComponent(); + textComponent.setText("test test"); + textComponent.render(graphics, new Point(0, 0)); + verify(graphics, atLeastOnce()).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).drawString(eq(" test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + verify(graphics, atLeastOnce()).setColor(Color.GREEN); + } +} \ No newline at end of file