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