From 789c89dcf2da8044497c322d1351d026de2ceb0c Mon Sep 17 00:00:00 2001 From: Jordan Atwood Date: Tue, 17 Jul 2018 16:33:35 -0700 Subject: [PATCH 01/19] ui: Add Table Component --- .../ui/overlay/components/TableComponent.java | 351 ++++++++++++++++++ .../components/TableComponentTest.java | 81 ++++ 2 files changed, 432 insertions(+) create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java create mode 100644 runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java new file mode 100644 index 0000000000..9424c34791 --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java @@ -0,0 +1,351 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * 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.Dimension; +import java.awt.FontMetrics; +import java.awt.Graphics2D; +import java.awt.Point; +import java.util.ArrayList; +import javax.annotation.Nonnull; + +public class TableComponent implements LayoutableRenderableEntity +{ + public enum TableAlignment + { + LEFT, + CENTER, + RIGHT + } + + private ArrayList cells = new ArrayList<>(); + private TableAlignment[] columnAlignments; + private Color[] columnColors; + private int numCols; + private int numRows; + + private TableAlignment defaultAlignment = TableAlignment.LEFT; + private Color defaultColor = Color.WHITE; + private Dimension gutter = new Dimension(3, 0); + private Point preferredLocation = new Point(); + private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); + + @Override + public Dimension render(final Graphics2D graphics) + { + final FontMetrics metrics = graphics.getFontMetrics(); + final int[] columnWidths = getColumnWidths(metrics); + int height = 0; + + graphics.translate(preferredLocation.x, preferredLocation.y); + + for (int row = 0; row < numRows; row++) + { + int x = 0; + int startingRowHeight = height; + for (int col = 0; col < numCols; col++) + { + int y = startingRowHeight; + final String[] lines = lineBreakText(getCellText(col, row), columnWidths[col], metrics); + for (String line : lines) + { + final int alignmentOffset = getAlignedPosition(line, getColumnAlignment(col), columnWidths[col], metrics); + final TextComponent leftLineComponent = new TextComponent(); + y += metrics.getHeight(); + + leftLineComponent.setPosition(new Point(x + alignmentOffset, y)); + leftLineComponent.setText(line); + leftLineComponent.setColor(getColumnColor(col)); + leftLineComponent.render(graphics); + } + height = Math.max(height, y); + x += columnWidths[col] + gutter.width; + } + height += gutter.height; + } + + graphics.translate(-preferredLocation.x, -preferredLocation.y); + return new Dimension(preferredSize.width, height); + } + + public void setDefaultColor(@Nonnull final Color color) + { + this.defaultColor = color; + } + + public void setDefaultAlignment(@Nonnull final TableAlignment alignment) + { + this.defaultAlignment = alignment; + } + + public void setGutter(@Nonnull final Dimension gutter) + { + this.gutter = gutter; + } + + @Override + public void setPreferredLocation(@Nonnull final Point location) + { + this.preferredLocation = location; + } + + @Override + public void setPreferredSize(@Nonnull final Dimension size) + { + this.preferredSize = size; + } + + public void setColumnColors(@Nonnull Color... colors) + { + columnColors = colors; + } + + public void setColumnAlignments(@Nonnull TableAlignment... alignments) + { + columnAlignments = alignments; + } + + public void setColumnColor(final int col, final Color color) + { + assert columnColors.length > col; + columnColors[col] = color; + } + + public void setColumnAlignment(final int col, final TableAlignment alignment) + { + assert columnAlignments.length > col; + columnAlignments[col] = alignment; + } + + public void addRow(@Nonnull final String... cells) + { + numCols = Math.max(numCols, cells.length); + numRows++; + this.cells.add(cells); + } + + public void addRows(@Nonnull final String[]... rows) + { + for (String[] row : rows) + { + addRow(row); + } + } + + private Color getColumnColor(final int column) + { + if (columnColors == null + || columnColors.length <= column + || columnColors[column] == null) + { + return defaultColor; + } + return columnColors[column]; + } + + private TableAlignment getColumnAlignment(final int column) + { + if (columnAlignments == null + || columnAlignments.length <= column + || columnAlignments[column] == null) + { + return defaultAlignment; + } + return columnAlignments[column]; + } + + private String getCellText(final int col, final int row) + { + assert col < numCols && row < numRows; + + if (cells.get(row).length < col) + { + return ""; + } + return cells.get(row)[col]; + } + + private int[] getColumnWidths(final FontMetrics metrics) + { + // Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width + int[] maxtextw = new int[numCols]; // max text width over all rows + int[] maxwordw = new int[numCols]; // max width of longest word + boolean[] flex = new boolean[numCols]; // is column flexible? + boolean[] wrap = new boolean[numCols]; // can column be wrapped? + int[] finalcolw = new int[numCols]; // final width of columns + + for (int col = 0; col < numCols; col++) + { + for (int row = 0; row < numRows; row++) + { + final String cell = getCellText(col, row); + final int cellWidth = getTextWidth(metrics, cell); + + maxtextw[col] = Math.max(maxtextw[col], cellWidth); + for (String word : cell.split(" ")) + { + maxwordw[col] = Math.max(maxwordw[col], getTextWidth(metrics, word)); + } + + if (maxtextw[col] == cellWidth) + { + wrap[col] = cell.contains(" "); + } + } + } + + int left = preferredSize.width - (numCols - 1) * gutter.width; + final double avg = left / numCols; + int nflex = 0; + + // Determine whether columns should be flexible and assign width of non-flexible cells + for (int col = 0; col < numCols; col++) + { + // This limit can be adjusted as needed + final double maxNonFlexLimit = 1.5 * avg; + + flex[col] = maxtextw[col] > maxNonFlexLimit; + if (flex[col]) + { + nflex++; + } + else + { + finalcolw[col] = maxtextw[col]; + left -= finalcolw[col]; + } + } + + // If there is not enough space, make columns that could be word-wrapped flexible too + if (left < nflex * avg) + { + for (int col = 0; col < numCols; col++) + { + if (!flex[col] && wrap[col]) + { + left += finalcolw[col]; + finalcolw[col] = 0; + flex[col] = true; + nflex++; + } + } + } + + // Calculate weights for flexible columns. The max width is capped at the table width to + // treat columns that have to be wrapped more or less equal + int tot = 0; + for (int col = 0; col < numCols; col++) + { + if (flex[col]) + { + maxtextw[col] = Math.min(maxtextw[col], preferredSize.width); + tot += maxtextw[col]; + } + } + + // Now assign the actual width for flexible columns. Make sure that it is at least as long + // as the longest word length + for (int col = 0; col < numCols; col++) + { + if (flex[col]) + { + finalcolw[col] = left * maxtextw[col] / tot; + finalcolw[col] = Math.max(finalcolw[col], maxwordw[col]); + left -= finalcolw[col]; + } + } + + // When the sum of column widths is less than the total space available, distribute the + // extra space equally across all columns + final int extraPerCol = left / numCols; + for (int col = 0; col < numCols; col++) + { + finalcolw[col] += extraPerCol; + left -= extraPerCol; + } + // Add any remainder to the right-most column + finalcolw[finalcolw.length - 1] += left; + + return finalcolw; + } + + private static int getTextWidth(final FontMetrics metrics, final String cell) + { + return metrics.stringWidth(TextComponent.textWithoutColTags(cell)); + } + + private static String[] lineBreakText(final String text, final int maxWidth, final 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 - getTextWidth(metrics, wrapped.toString()); + + for (int i = 1; i < words.length; i++) + { + final String word = words[i]; + final int wordLen = getTextWidth(metrics, 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"); + } + + private static int getAlignedPosition(final String str, final TableAlignment alignment, final int columnWidth, final FontMetrics metrics) + { + final int stringWidth = getTextWidth(metrics, str); + int offset = 0; + + switch (alignment) + { + case LEFT: + break; + case CENTER: + offset = (columnWidth / 2) - (stringWidth / 2); + break; + case RIGHT: + offset = columnWidth - stringWidth; + break; + } + return offset; + } +} diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java new file mode 100644 index 0000000000..404f4f0ff4 --- /dev/null +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java @@ -0,0 +1,81 @@ +/* + * Copyright (c) 2018, Jordan Atwood + * 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 net.runelite.client.ui.overlay.components.TableComponent.TableAlignment; +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.when; +import static org.mockito.Mockito.verify; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class TableComponentTest +{ + @Mock + private Graphics2D graphics; + + @Before + public void before() + { + when(graphics.getFontMetrics()).thenReturn(mock(FontMetrics.class)); + } + + @Test + public void testRender() + { + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("test"); + tableComponent.setDefaultAlignment(TableAlignment.CENTER); + tableComponent.setDefaultColor(Color.RED); + tableComponent.render(graphics); + verify(graphics, times(2)).drawString(eq("test"), anyInt(), anyInt()); + verify(graphics, atLeastOnce()).setColor(Color.RED); + } + + @Test + public void testColors() + { + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("test", "test", "test", "test", "test"); + tableComponent.setColumnColors(Color.RED, Color.GREEN, Color.BLUE); + tableComponent.render(graphics); + verify(graphics, atLeastOnce()).setColor(Color.RED); + verify(graphics, atLeastOnce()).setColor(Color.GREEN); + verify(graphics, atLeastOnce()).setColor(Color.BLUE); + verify(graphics, atLeastOnce()).setColor(Color.YELLOW); + verify(graphics, atLeastOnce()).setColor(Color.WHITE); + } +} From 8595713d3dafb9f21032f8830eae8314ea9497bb Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Tue, 30 Apr 2019 23:34:31 -0700 Subject: [PATCH 02/19] Add needed `bounds` variable and utilize setter annonations --- .../ui/overlay/components/TableComponent.java | 71 +++++++------------ 1 file changed, 27 insertions(+), 44 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java index 9424c34791..7286320ea6 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java @@ -1,5 +1,6 @@ /* * Copyright (c) 2018, Jordan Atwood + * Copyright (c) 2019, TheStonedTurtle * All rights reserved. * * Redistribution and use in source and binary forms, with or without @@ -29,9 +30,14 @@ import java.awt.Dimension; import java.awt.FontMetrics; import java.awt.Graphics2D; import java.awt.Point; +import java.awt.Rectangle; import java.util.ArrayList; import javax.annotation.Nonnull; +import lombok.AccessLevel; +import lombok.Getter; +import lombok.Setter; +@Setter public class TableComponent implements LayoutableRenderableEntity { public enum TableAlignment @@ -41,16 +47,29 @@ public class TableComponent implements LayoutableRenderableEntity RIGHT } + @Getter + private final Rectangle bounds = new Rectangle(); + + @Setter(AccessLevel.NONE) private ArrayList cells = new ArrayList<>(); - private TableAlignment[] columnAlignments; - private Color[] columnColors; + @Nonnull + private TableAlignment[] columnAlignments = new TableAlignment[0]; + @Nonnull + private Color[] columnColors = new Color[0]; + @Setter(AccessLevel.NONE) private int numCols; + @Setter(AccessLevel.NONE) private int numRows; + @Nonnull private TableAlignment defaultAlignment = TableAlignment.LEFT; + @Nonnull private Color defaultColor = Color.WHITE; + @Nonnull private Dimension gutter = new Dimension(3, 0); + @Nonnull private Point preferredLocation = new Point(); + @Nonnull private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); @Override @@ -88,44 +107,10 @@ public class TableComponent implements LayoutableRenderableEntity } graphics.translate(-preferredLocation.x, -preferredLocation.y); - return new Dimension(preferredSize.width, height); - } - - public void setDefaultColor(@Nonnull final Color color) - { - this.defaultColor = color; - } - - public void setDefaultAlignment(@Nonnull final TableAlignment alignment) - { - this.defaultAlignment = alignment; - } - - public void setGutter(@Nonnull final Dimension gutter) - { - this.gutter = gutter; - } - - @Override - public void setPreferredLocation(@Nonnull final Point location) - { - this.preferredLocation = location; - } - - @Override - public void setPreferredSize(@Nonnull final Dimension size) - { - this.preferredSize = size; - } - - public void setColumnColors(@Nonnull Color... colors) - { - columnColors = colors; - } - - public void setColumnAlignments(@Nonnull TableAlignment... alignments) - { - columnAlignments = alignments; + final Dimension dimension = new Dimension(preferredSize.width, height); + bounds.setLocation(preferredLocation); + bounds.setSize(dimension); + return dimension; } public void setColumnColor(final int col, final Color color) @@ -157,8 +142,7 @@ public class TableComponent implements LayoutableRenderableEntity private Color getColumnColor(final int column) { - if (columnColors == null - || columnColors.length <= column + if (columnColors.length <= column || columnColors[column] == null) { return defaultColor; @@ -168,8 +152,7 @@ public class TableComponent implements LayoutableRenderableEntity private TableAlignment getColumnAlignment(final int column) { - if (columnAlignments == null - || columnAlignments.length <= column + if (columnAlignments.length <= column || columnAlignments[column] == null) { return defaultAlignment; From c1dddcb88171268fa0c3724f6ebb12f7a466fcd3 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Tue, 30 Apr 2019 23:48:41 -0700 Subject: [PATCH 03/19] Expand row and col styling via sub components --- .../components/table/TableAlignment.java | 8 + .../{ => table}/TableComponent.java | 151 +++++++++++++----- .../components/table/TableElement.java | 38 +++++ .../ui/overlay/components/table/TableRow.java | 38 +++++ 4 files changed, 194 insertions(+), 41 deletions(-) create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java rename runelite-client/src/main/java/net/runelite/client/ui/overlay/components/{ => table}/TableComponent.java (68%) create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java create mode 100644 runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java new file mode 100644 index 0000000000..d7fd5ed87e --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java @@ -0,0 +1,8 @@ +package net.runelite.client.ui.overlay.components.table; + +public enum TableAlignment +{ + LEFT, + CENTER, + RIGHT +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java similarity index 68% rename from runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java rename to runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 7286320ea6..63acf66389 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -23,7 +23,7 @@ * (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; +package net.runelite.client.ui.overlay.components.table; import java.awt.Color; import java.awt.Dimension; @@ -32,34 +32,27 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; +import java.util.List; import javax.annotation.Nonnull; -import lombok.AccessLevel; +import javax.annotation.Nullable; import lombok.Getter; import lombok.Setter; +import net.runelite.client.ui.overlay.components.ComponentConstants; +import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity; +import net.runelite.client.ui.overlay.components.TextComponent; @Setter public class TableComponent implements LayoutableRenderableEntity { - public enum TableAlignment - { - LEFT, - CENTER, - RIGHT - } + private static final TableRow EMPTY_ROW = TableRow.builder().build(); + private static final TableElement EMPTY_ELEMENT = TableElement.builder().build(); @Getter private final Rectangle bounds = new Rectangle(); - @Setter(AccessLevel.NONE) - private ArrayList cells = new ArrayList<>(); @Nonnull - private TableAlignment[] columnAlignments = new TableAlignment[0]; - @Nonnull - private Color[] columnColors = new Color[0]; - @Setter(AccessLevel.NONE) - private int numCols; - @Setter(AccessLevel.NONE) - private int numRows; + private TableElement[] tableColumns = new TableElement[0]; + private final List tableRows = new ArrayList<>(); @Nonnull private TableAlignment defaultAlignment = TableAlignment.LEFT; @@ -81,6 +74,9 @@ public class TableComponent implements LayoutableRenderableEntity graphics.translate(preferredLocation.x, preferredLocation.y); + final int numRows = tableRows.size(); + final int numCols = tableColumns.length; + for (int row = 0; row < numRows; row++) { int x = 0; @@ -91,13 +87,16 @@ public class TableComponent implements LayoutableRenderableEntity final String[] lines = lineBreakText(getCellText(col, row), columnWidths[col], metrics); for (String line : lines) { - final int alignmentOffset = getAlignedPosition(line, getColumnAlignment(col), columnWidths[col], metrics); + final TableAlignment alignment = getCellAlignment(row, col); + final int alignmentOffset = getAlignedPosition(line, alignment, columnWidths[col], metrics); final TextComponent leftLineComponent = new TextComponent(); y += metrics.getHeight(); + final Color lineColor = getCellColor(row, col); + leftLineComponent.setPosition(new Point(x + alignmentOffset, y)); leftLineComponent.setText(line); - leftLineComponent.setColor(getColumnColor(col)); + leftLineComponent.setColor(lineColor); leftLineComponent.render(graphics); } height = Math.max(height, y); @@ -115,21 +114,28 @@ public class TableComponent implements LayoutableRenderableEntity public void setColumnColor(final int col, final Color color) { - assert columnColors.length > col; - columnColors[col] = color; + assert tableColumns.length > col; + tableColumns[col].setColor(color); } public void setColumnAlignment(final int col, final TableAlignment alignment) { - assert columnAlignments.length > col; - columnAlignments[col] = alignment; + assert tableColumns.length > col; + tableColumns[col].setAlignment(alignment); } public void addRow(@Nonnull final String... cells) { - numCols = Math.max(numCols, cells.length); - numRows++; - this.cells.add(cells); + final TableElement[] elements = new TableElement[cells.length]; + for (int i = 0; i < cells.length; i++) + { + elements[i] = TableElement.builder().content(cells[i]).build(); + } + + final TableRow row = TableRow.builder().build(); + row.setElements(elements); + + this.tableRows.add(row); } public void addRows(@Nonnull final String[]... rows) @@ -140,39 +146,43 @@ public class TableComponent implements LayoutableRenderableEntity } } - private Color getColumnColor(final int column) + public void addRow(@Nonnull TableRow row) { - if (columnColors.length <= column - || columnColors[column] == null) - { - return defaultColor; - } - return columnColors[column]; + this.tableRows.add(row); } - private TableAlignment getColumnAlignment(final int column) + public void addRows(@Nonnull final TableRow... rows) { - if (columnAlignments.length <= column - || columnAlignments[column] == null) + for (TableRow row : rows) { - return defaultAlignment; + addRow(row); } - return columnAlignments[column]; } private String getCellText(final int col, final int row) { - assert col < numCols && row < numRows; + assert col < tableColumns.length && row < tableRows.size(); - if (cells.get(row).length < col) + if (row == -1) + { + return tableColumns[col].getContent(); + } + + TableElement[] elements = tableRows.get(row).getElements(); + if (col >= elements.length) { return ""; } - return cells.get(row)[col]; + + final String result = elements[col].content; + return result != null ? result : ""; } private int[] getColumnWidths(final FontMetrics metrics) { + final int numRows = tableRows.size(); + final int numCols = tableColumns.length; + // Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width int[] maxtextw = new int[numCols]; // max text width over all rows int[] maxwordw = new int[numCols]; // max width of longest word @@ -331,4 +341,63 @@ public class TableComponent implements LayoutableRenderableEntity } return offset; } + + private Color getCellColor(final int row, final int column) + { + assert row < tableRows.size() && column < tableColumns.length; + + // Row should be -1 for columns so use a empty TableRow + final TableRow rowEle = row != -1 ? tableRows.get(row) : EMPTY_ROW; + final TableElement columnElement = tableColumns[column]; + final TableElement[] elements = rowEle.getElements(); + + // Some rows may not have every element, even though they should.. + final TableElement ele = column < elements.length ? elements[column] : EMPTY_ELEMENT; + + // Color priorities goes as follow: cell->row->column->default + return firstNonNull( + ele.getColor(), + rowEle.getRowColor(), + columnElement.getColor(), + defaultColor); + } + + private TableAlignment getCellAlignment(final int row, final int column) + { + assert row < tableRows.size() && column < tableColumns.length; + + // Row should be -1 for columns so use a empty TableRow + final TableRow rowEle = row != -1 ? tableRows.get(row) : EMPTY_ROW; + final TableElement columnElement = tableColumns[column]; + final TableElement[] elements = rowEle.getElements(); + + // Some rows may not have every element, even though they should.. + final TableElement ele = column < elements.length ? elements[column] : EMPTY_ELEMENT; + + // Alignment priorities goes as follow: cell->row->column->default + return firstNonNull( + ele.getAlignment(), + rowEle.getRowAlignment(), + columnElement.getAlignment(), + defaultAlignment); + } + + @SafeVarargs + private static T firstNonNull(@Nullable T... elements) + { + if (elements == null || elements.length == 0) + { + return null; + } + + int i = 0; + T cur = elements[0]; + while (cur == null && i < elements.length) + { + cur = elements[i]; + i++; + } + + return cur; + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java new file mode 100644 index 0000000000..8229f9533c --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableElement.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * 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.table; + +import java.awt.Color; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class TableElement +{ + TableAlignment alignment; + Color color; + String content; +} diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java new file mode 100644 index 0000000000..1f38d7368b --- /dev/null +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java @@ -0,0 +1,38 @@ +/* + * Copyright (c) 2019, TheStonedTurtle + * 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.table; + +import java.awt.Color; +import lombok.Builder; +import lombok.Data; + +@Data +@Builder +public class TableRow +{ + Color rowColor; + TableAlignment rowAlignment; + TableElement[] elements; +} From 8a753f58724c87e877e25f26aa82ff00feb67e9c Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Tue, 30 Apr 2019 23:51:30 -0700 Subject: [PATCH 04/19] Variable rename --- .../components/table/TableComponent.java | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 63acf66389..14b9fa467f 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -51,8 +51,8 @@ public class TableComponent implements LayoutableRenderableEntity private final Rectangle bounds = new Rectangle(); @Nonnull - private TableElement[] tableColumns = new TableElement[0]; - private final List tableRows = new ArrayList<>(); + private TableElement[] columns = new TableElement[0]; + private final List rows = new ArrayList<>(); @Nonnull private TableAlignment defaultAlignment = TableAlignment.LEFT; @@ -74,8 +74,8 @@ public class TableComponent implements LayoutableRenderableEntity graphics.translate(preferredLocation.x, preferredLocation.y); - final int numRows = tableRows.size(); - final int numCols = tableColumns.length; + final int numRows = rows.size(); + final int numCols = columns.length; for (int row = 0; row < numRows; row++) { @@ -114,14 +114,14 @@ public class TableComponent implements LayoutableRenderableEntity public void setColumnColor(final int col, final Color color) { - assert tableColumns.length > col; - tableColumns[col].setColor(color); + assert columns.length > col; + columns[col].setColor(color); } public void setColumnAlignment(final int col, final TableAlignment alignment) { - assert tableColumns.length > col; - tableColumns[col].setAlignment(alignment); + assert columns.length > col; + columns[col].setAlignment(alignment); } public void addRow(@Nonnull final String... cells) @@ -135,7 +135,7 @@ public class TableComponent implements LayoutableRenderableEntity final TableRow row = TableRow.builder().build(); row.setElements(elements); - this.tableRows.add(row); + this.rows.add(row); } public void addRows(@Nonnull final String[]... rows) @@ -148,7 +148,7 @@ public class TableComponent implements LayoutableRenderableEntity public void addRow(@Nonnull TableRow row) { - this.tableRows.add(row); + this.rows.add(row); } public void addRows(@Nonnull final TableRow... rows) @@ -161,14 +161,14 @@ public class TableComponent implements LayoutableRenderableEntity private String getCellText(final int col, final int row) { - assert col < tableColumns.length && row < tableRows.size(); + assert col < columns.length && row < rows.size(); if (row == -1) { - return tableColumns[col].getContent(); + return columns[col].getContent(); } - TableElement[] elements = tableRows.get(row).getElements(); + TableElement[] elements = rows.get(row).getElements(); if (col >= elements.length) { return ""; @@ -180,8 +180,8 @@ public class TableComponent implements LayoutableRenderableEntity private int[] getColumnWidths(final FontMetrics metrics) { - final int numRows = tableRows.size(); - final int numCols = tableColumns.length; + final int numRows = rows.size(); + final int numCols = columns.length; // Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width int[] maxtextw = new int[numCols]; // max text width over all rows @@ -344,11 +344,11 @@ public class TableComponent implements LayoutableRenderableEntity private Color getCellColor(final int row, final int column) { - assert row < tableRows.size() && column < tableColumns.length; + assert row < rows.size() && column < columns.length; // Row should be -1 for columns so use a empty TableRow - final TableRow rowEle = row != -1 ? tableRows.get(row) : EMPTY_ROW; - final TableElement columnElement = tableColumns[column]; + final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; + final TableElement columnElement = columns[column]; final TableElement[] elements = rowEle.getElements(); // Some rows may not have every element, even though they should.. @@ -364,11 +364,11 @@ public class TableComponent implements LayoutableRenderableEntity private TableAlignment getCellAlignment(final int row, final int column) { - assert row < tableRows.size() && column < tableColumns.length; + assert row < rows.size() && column < columns.length; // Row should be -1 for columns so use a empty TableRow - final TableRow rowEle = row != -1 ? tableRows.get(row) : EMPTY_ROW; - final TableElement columnElement = tableColumns[column]; + final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; + final TableElement columnElement = columns[column]; final TableElement[] elements = rowEle.getElements(); // Some rows may not have every element, even though they should.. From 831c32c5bb34529073a456abf54defe63707cf22 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Tue, 30 Apr 2019 23:59:19 -0700 Subject: [PATCH 05/19] Columns to list and add methods --- .../components/table/TableComponent.java | 56 ++++++++++++++----- 1 file changed, 42 insertions(+), 14 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 14b9fa467f..63b22bd083 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -50,8 +50,7 @@ public class TableComponent implements LayoutableRenderableEntity @Getter private final Rectangle bounds = new Rectangle(); - @Nonnull - private TableElement[] columns = new TableElement[0]; + private final List columns = new ArrayList<>(); private final List rows = new ArrayList<>(); @Nonnull @@ -75,7 +74,7 @@ public class TableComponent implements LayoutableRenderableEntity graphics.translate(preferredLocation.x, preferredLocation.y); final int numRows = rows.size(); - final int numCols = columns.length; + final int numCols = columns.size(); for (int row = 0; row < numRows; row++) { @@ -114,14 +113,14 @@ public class TableComponent implements LayoutableRenderableEntity public void setColumnColor(final int col, final Color color) { - assert columns.length > col; - columns[col].setColor(color); + assert columns.size() > col; + columns.get(col).setColor(color); } public void setColumnAlignment(final int col, final TableAlignment alignment) { - assert columns.length > col; - columns[col].setAlignment(alignment); + assert columns.size() > col; + columns.get(col).setAlignment(alignment); } public void addRow(@Nonnull final String... cells) @@ -146,6 +145,35 @@ public class TableComponent implements LayoutableRenderableEntity } } + public void addColumn(@Nonnull TableElement element) + { + this.columns.add(element); + } + + public void addColumns(@Nonnull final TableElement... elements) + { + for (TableElement ele : elements) + { + addColumn(ele); + } + } + + public void addColumn(@Nonnull final String... cells) + { + for (int i = 0; i < cells.length; i++) + { + this.columns.add(TableElement.builder().content(cells[i]).build()); + } + } + + public void addColumns(@Nonnull final String[]... columns) + { + for (String[] col : columns) + { + addColumn(col); + } + } + public void addRow(@Nonnull TableRow row) { this.rows.add(row); @@ -161,11 +189,11 @@ public class TableComponent implements LayoutableRenderableEntity private String getCellText(final int col, final int row) { - assert col < columns.length && row < rows.size(); + assert col < columns.size() && row < rows.size(); if (row == -1) { - return columns[col].getContent(); + return columns.get(col).getContent(); } TableElement[] elements = rows.get(row).getElements(); @@ -181,7 +209,7 @@ public class TableComponent implements LayoutableRenderableEntity private int[] getColumnWidths(final FontMetrics metrics) { final int numRows = rows.size(); - final int numCols = columns.length; + final int numCols = columns.size(); // Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width int[] maxtextw = new int[numCols]; // max text width over all rows @@ -344,11 +372,11 @@ public class TableComponent implements LayoutableRenderableEntity private Color getCellColor(final int row, final int column) { - assert row < rows.size() && column < columns.length; + assert row < rows.size() && column < columns.size(); // Row should be -1 for columns so use a empty TableRow final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; - final TableElement columnElement = columns[column]; + final TableElement columnElement = columns.get(column); final TableElement[] elements = rowEle.getElements(); // Some rows may not have every element, even though they should.. @@ -364,11 +392,11 @@ public class TableComponent implements LayoutableRenderableEntity private TableAlignment getCellAlignment(final int row, final int column) { - assert row < rows.size() && column < columns.length; + assert row < rows.size() && column < columns.size(); // Row should be -1 for columns so use a empty TableRow final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; - final TableElement columnElement = columns[column]; + final TableElement columnElement = columns.get(column); final TableElement[] elements = rowEle.getElements(); // Some rows may not have every element, even though they should.. From 395793b716a64f7f43fd77e89b7b4ee38ee638dc Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:00:57 -0700 Subject: [PATCH 06/19] set column colors --- .../ui/overlay/components/table/TableComponent.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 63b22bd083..317ab3bd04 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -123,6 +123,14 @@ public class TableComponent implements LayoutableRenderableEntity columns.get(col).setAlignment(alignment); } + public void setColumnColors(@Nonnull final Color... colors) + { + for (int i = 0; i < colors.length; i++) + { + setColumnColor(i, colors[i]); + } + } + public void addRow(@Nonnull final String... cells) { final TableElement[] elements = new TableElement[cells.length]; From f2c2ebe711e3c6470be4113f90e33efe15224f90 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:08:50 -0700 Subject: [PATCH 07/19] change addColumns to setColumns --- .../components/table/TableComponent.java | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 317ab3bd04..158b7b82cf 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -32,6 +32,7 @@ import java.awt.Graphics2D; import java.awt.Point; import java.awt.Rectangle; import java.util.ArrayList; +import java.util.Arrays; import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; @@ -50,7 +51,9 @@ public class TableComponent implements LayoutableRenderableEntity @Getter private final Rectangle bounds = new Rectangle(); + @Getter private final List columns = new ArrayList<>(); + @Getter private final List rows = new ArrayList<>(); @Nonnull @@ -158,24 +161,23 @@ public class TableComponent implements LayoutableRenderableEntity this.columns.add(element); } - public void addColumns(@Nonnull final TableElement... elements) + public void setColumns(@Nonnull final TableElement... elements) { - for (TableElement ele : elements) - { - addColumn(ele); - } + this.columns.clear(); + this.columns.addAll(Arrays.asList(elements)); } public void addColumn(@Nonnull final String... cells) { - for (int i = 0; i < cells.length; i++) + for (String cell : cells) { - this.columns.add(TableElement.builder().content(cells[i]).build()); + this.columns.add(TableElement.builder().content(cell).build()); } } - public void addColumns(@Nonnull final String[]... columns) + public void setColumns(@Nonnull final String[]... columns) { + this.columns.clear(); for (String[] col : columns) { addColumn(col); From 38e921c04c30f85bd54feedb846139117d47accc Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:10:12 -0700 Subject: [PATCH 08/19] More fixes! --- .../ui/overlay/components/table/TableComponent.java | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 158b7b82cf..aec2213bd8 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -167,18 +167,15 @@ public class TableComponent implements LayoutableRenderableEntity this.columns.addAll(Arrays.asList(elements)); } - public void addColumn(@Nonnull final String... cells) + public void addColumn(@Nonnull final String col) { - for (String cell : cells) - { - this.columns.add(TableElement.builder().content(cell).build()); - } + this.columns.add(TableElement.builder().content(col).build()); } - public void setColumns(@Nonnull final String[]... columns) + public void setColumns(@Nonnull final String... columns) { this.columns.clear(); - for (String[] col : columns) + for (String col : columns) { addColumn(col); } From e68e402779a3a2c941b1f457ce57ccdc574419ba Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:17:58 -0700 Subject: [PATCH 09/19] Auto add blank columns we adding rows --- .../client/ui/overlay/components/table/TableComponent.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index aec2213bd8..5bbb866cec 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -136,6 +136,11 @@ public class TableComponent implements LayoutableRenderableEntity public void addRow(@Nonnull final String... cells) { + while (cells.length > columns.size()) + { + columns.add(TableElement.builder().build()); + } + final TableElement[] elements = new TableElement[cells.length]; for (int i = 0; i < cells.length; i++) { From 22626abbf797be9f203c8257cd70fc37d74828bd Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:18:48 -0700 Subject: [PATCH 10/19] Move table component test to matching directory --- .../overlay/components/{ => table}/TableComponentTest.java | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) rename runelite-client/src/test/java/net/runelite/client/ui/overlay/components/{ => table}/TableComponentTest.java (95%) diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java similarity index 95% rename from runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java rename to runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java index 404f4f0ff4..19fde8fe35 100644 --- a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/TableComponentTest.java +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java @@ -22,12 +22,11 @@ * (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; +package net.runelite.client.ui.overlay.components.table; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics2D; -import net.runelite.client.ui.overlay.components.TableComponent.TableAlignment; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -37,8 +36,8 @@ 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.when; import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; import org.mockito.runners.MockitoJUnitRunner; @RunWith(MockitoJUnitRunner.class) From d23b126a5e5fc8150280a7bf26cbf65cdbd63b36 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:22:09 -0700 Subject: [PATCH 11/19] Update TableComponent.java --- .../client/ui/overlay/components/table/TableComponent.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 5bbb866cec..7d9b7a90dd 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -140,7 +140,7 @@ public class TableComponent implements LayoutableRenderableEntity { columns.add(TableElement.builder().build()); } - + final TableElement[] elements = new TableElement[cells.length]; for (int i = 0; i < cells.length; i++) { From f50abdf1b192b7fe354808578b3aebbb6e1a00a1 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:26:26 -0700 Subject: [PATCH 12/19] Set column alignments...will this ever stop --- .../overlay/components/table/TableComponent.java | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 7d9b7a90dd..ab13eeb6cd 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -120,17 +120,25 @@ public class TableComponent implements LayoutableRenderableEntity columns.get(col).setColor(color); } + public void setColumnColors(@Nonnull final Color... colors) + { + for (int i = 0; i < colors.length; i++) + { + setColumnColor(i, colors[i]); + } + } + public void setColumnAlignment(final int col, final TableAlignment alignment) { assert columns.size() > col; columns.get(col).setAlignment(alignment); } - public void setColumnColors(@Nonnull final Color... colors) + public void setColumnAlignments(@Nonnull final TableAlignment... alignments) { - for (int i = 0; i < colors.length; i++) + for (int i = 0; i < alignments.length; i++) { - setColumnColor(i, colors[i]); + setColumnAlignment(i, alignments[i]); } } From e01acaa3617e93aefee425234a4d243a2455b28a Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:32:45 -0700 Subject: [PATCH 13/19] Add copyright --- .../components/table/TableAlignment.java | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java index d7fd5ed87e..d55080a3e0 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java @@ -1,3 +1,27 @@ +/* +* Copyright (c) 2019, TheStonedTurtle +* 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.table; public enum TableAlignment From f7da72d6b9a5a1dcdc05bdb1ec2f37722b5908b3 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Wed, 1 May 2019 00:37:58 -0700 Subject: [PATCH 14/19] Ensure columns exist when calling necessary functions --- .../overlay/components/table/TableComponent.java | 15 +++++++++++---- 1 file changed, 11 insertions(+), 4 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index ab13eeb6cd..7aab87a9ee 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -114,6 +114,14 @@ public class TableComponent implements LayoutableRenderableEntity return dimension; } + private void ensureColumnSize(final int size) + { + while (size > columns.size()) + { + columns.add(TableElement.builder().build()); + } + } + public void setColumnColor(final int col, final Color color) { assert columns.size() > col; @@ -122,6 +130,7 @@ public class TableComponent implements LayoutableRenderableEntity public void setColumnColors(@Nonnull final Color... colors) { + ensureColumnSize(colors.length); for (int i = 0; i < colors.length; i++) { setColumnColor(i, colors[i]); @@ -136,6 +145,7 @@ public class TableComponent implements LayoutableRenderableEntity public void setColumnAlignments(@Nonnull final TableAlignment... alignments) { + ensureColumnSize(alignments.length); for (int i = 0; i < alignments.length; i++) { setColumnAlignment(i, alignments[i]); @@ -144,10 +154,7 @@ public class TableComponent implements LayoutableRenderableEntity public void addRow(@Nonnull final String... cells) { - while (cells.length > columns.size()) - { - columns.add(TableElement.builder().build()); - } + ensureColumnSize(cells.length); final TableElement[] elements = new TableElement[cells.length]; for (int i = 0; i < cells.length; i++) From eaae5b406701ec742a2ee8c96611c1c14940a19a Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Sat, 11 May 2019 09:39:53 -0700 Subject: [PATCH 15/19] Code cleanup --- .../components/table/TableComponent.java | 326 ++++++++---------- .../ui/overlay/components/table/TableRow.java | 3 +- .../components/table/TableComponentTest.java | 7 +- 3 files changed, 153 insertions(+), 183 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 7aab87a9ee..3e9b838ce5 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -37,6 +37,7 @@ import java.util.List; import javax.annotation.Nonnull; import javax.annotation.Nullable; import lombok.Getter; +import lombok.NonNull; import lombok.Setter; import net.runelite.client.ui.overlay.components.ComponentConstants; import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity; @@ -45,211 +46,111 @@ import net.runelite.client.ui.overlay.components.TextComponent; @Setter public class TableComponent implements LayoutableRenderableEntity { - private static final TableRow EMPTY_ROW = TableRow.builder().build(); private static final TableElement EMPTY_ELEMENT = TableElement.builder().build(); - @Getter - private final Rectangle bounds = new Rectangle(); - @Getter private final List columns = new ArrayList<>(); @Getter private final List rows = new ArrayList<>(); - @Nonnull + @Getter + private final Rectangle bounds = new Rectangle(); + private TableAlignment defaultAlignment = TableAlignment.LEFT; - @Nonnull private Color defaultColor = Color.WHITE; - @Nonnull private Dimension gutter = new Dimension(3, 0); - @Nonnull private Point preferredLocation = new Point(); - @Nonnull private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); @Override public Dimension render(final Graphics2D graphics) { final FontMetrics metrics = graphics.getFontMetrics(); - final int[] columnWidths = getColumnWidths(metrics); - int height = 0; + final TableRow colRow = TableRow.builder().elements(this.columns).build(); + final int[] columnWidths = getColumnWidths(metrics, colRow); graphics.translate(preferredLocation.x, preferredLocation.y); - final int numRows = rows.size(); - final int numCols = columns.size(); + // Display the columns first + int height = displayRow(graphics, colRow, 0, columnWidths, metrics); - for (int row = 0; row < numRows; row++) + for (TableRow row : this.rows) { - int x = 0; - int startingRowHeight = height; - for (int col = 0; col < numCols; col++) - { - int y = startingRowHeight; - final String[] lines = lineBreakText(getCellText(col, row), columnWidths[col], metrics); - for (String line : lines) - { - final TableAlignment alignment = getCellAlignment(row, col); - final int alignmentOffset = getAlignedPosition(line, alignment, columnWidths[col], metrics); - final TextComponent leftLineComponent = new TextComponent(); - y += metrics.getHeight(); - - final Color lineColor = getCellColor(row, col); - - leftLineComponent.setPosition(new Point(x + alignmentOffset, y)); - leftLineComponent.setText(line); - leftLineComponent.setColor(lineColor); - leftLineComponent.render(graphics); - } - height = Math.max(height, y); - x += columnWidths[col] + gutter.width; - } - height += gutter.height; + height += displayRow(graphics, row, height, columnWidths, metrics); } graphics.translate(-preferredLocation.x, -preferredLocation.y); + final Dimension dimension = new Dimension(preferredSize.width, height); bounds.setLocation(preferredLocation); bounds.setSize(dimension); + return dimension; } - private void ensureColumnSize(final int size) + private int displayRow(Graphics2D graphics, TableRow row, int height, int[] columnWidths, FontMetrics metrics) { - while (size > columns.size()) + int x = 0; + int startingRowHeight = height; + + final List elements = row.getElements(); + for (int i = 0; i < elements.size(); i++) { - columns.add(TableElement.builder().build()); - } - } + int y = startingRowHeight; + final TableElement cell = elements.get(i); - public void setColumnColor(final int col, final Color color) - { - assert columns.size() > col; - columns.get(col).setColor(color); - } + final String[] lines = lineBreakText(cell.getContent(), columnWidths[i], metrics); + final TableAlignment alignment = getCellAlignment(row, i); + final Color color = getCellColor(row, i); - public void setColumnColors(@Nonnull final Color... colors) - { - ensureColumnSize(colors.length); - for (int i = 0; i < colors.length; i++) - { - setColumnColor(i, colors[i]); - } - } + for (String line : lines) + { + final int alignmentOffset = getAlignedPosition(line, alignment, columnWidths[i], metrics); + final TextComponent leftLineComponent = new TextComponent(); + y += metrics.getHeight(); - public void setColumnAlignment(final int col, final TableAlignment alignment) - { - assert columns.size() > col; - columns.get(col).setAlignment(alignment); - } - - public void setColumnAlignments(@Nonnull final TableAlignment... alignments) - { - ensureColumnSize(alignments.length); - for (int i = 0; i < alignments.length; i++) - { - setColumnAlignment(i, alignments[i]); - } - } - - public void addRow(@Nonnull final String... cells) - { - ensureColumnSize(cells.length); - - final TableElement[] elements = new TableElement[cells.length]; - for (int i = 0; i < cells.length; i++) - { - elements[i] = TableElement.builder().content(cells[i]).build(); + leftLineComponent.setPosition(new Point(x + alignmentOffset, y)); + leftLineComponent.setText(line); + leftLineComponent.setColor(color); + leftLineComponent.render(graphics); + } + height = Math.max(height, y); + x += columnWidths[i] + gutter.width; } - final TableRow row = TableRow.builder().build(); - row.setElements(elements); - - this.rows.add(row); + return height + gutter.height; } - public void addRows(@Nonnull final String[]... rows) + /** + * Returns the width that each column should take up + * Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width + * @param metrics + * @return int[] of column width + */ + private int[] getColumnWidths(final FontMetrics metrics, final TableRow columnRow) { - for (String[] row : rows) + int numCols = columns.size(); + for (final TableRow r : rows) { - addRow(row); - } - } - - public void addColumn(@Nonnull TableElement element) - { - this.columns.add(element); - } - - public void setColumns(@Nonnull final TableElement... elements) - { - this.columns.clear(); - this.columns.addAll(Arrays.asList(elements)); - } - - public void addColumn(@Nonnull final String col) - { - this.columns.add(TableElement.builder().content(col).build()); - } - - public void setColumns(@Nonnull final String... columns) - { - this.columns.clear(); - for (String col : columns) - { - addColumn(col); - } - } - - public void addRow(@Nonnull TableRow row) - { - this.rows.add(row); - } - - public void addRows(@Nonnull final TableRow... rows) - { - for (TableRow row : rows) - { - addRow(row); - } - } - - private String getCellText(final int col, final int row) - { - assert col < columns.size() && row < rows.size(); - - if (row == -1) - { - return columns.get(col).getContent(); + numCols = Math.max(r.getElements().size(), numCols); } - TableElement[] elements = rows.get(row).getElements(); - if (col >= elements.length) - { - return ""; - } - - final String result = elements[col].content; - return result != null ? result : ""; - } - - private int[] getColumnWidths(final FontMetrics metrics) - { - final int numRows = rows.size(); - final int numCols = columns.size(); - - // Based on https://stackoverflow.com/questions/22206825/algorithm-for-calculating-variable-column-widths-for-set-table-width int[] maxtextw = new int[numCols]; // max text width over all rows int[] maxwordw = new int[numCols]; // max width of longest word boolean[] flex = new boolean[numCols]; // is column flexible? boolean[] wrap = new boolean[numCols]; // can column be wrapped? int[] finalcolw = new int[numCols]; // final width of columns - for (int col = 0; col < numCols; col++) + final List rows = new ArrayList<>(this.rows); + rows.add(columnRow); + + for (final TableRow r : rows) { - for (int row = 0; row < numRows; row++) + final List elements = r.getElements(); + for (int col = 0; col < elements.size(); col++) { - final String cell = getCellText(col, row); + final TableElement ele = elements.get(col); + final String cell = ele.getContent(); final int cellWidth = getTextWidth(metrics, cell); maxtextw[col] = Math.max(maxtextw[col], cellWidth); @@ -397,43 +298,41 @@ public class TableComponent implements LayoutableRenderableEntity return offset; } - private Color getCellColor(final int row, final int column) + /** + * Returns the color for the specified table element. + * Priority order: cell->row->column->default + * @param row TableRow element + * @param colIndex column index + */ + private Color getCellColor(final TableRow row, final int colIndex) { - assert row < rows.size() && column < columns.size(); + final List rowElements = row.getElements(); + final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT; + final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT; - // Row should be -1 for columns so use a empty TableRow - final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; - final TableElement columnElement = columns.get(column); - final TableElement[] elements = rowEle.getElements(); - - // Some rows may not have every element, even though they should.. - final TableElement ele = column < elements.length ? elements[column] : EMPTY_ELEMENT; - - // Color priorities goes as follow: cell->row->column->default return firstNonNull( - ele.getColor(), - rowEle.getRowColor(), - columnElement.getColor(), + cell.getColor(), + row.getRowColor(), + column.getColor(), defaultColor); } - private TableAlignment getCellAlignment(final int row, final int column) + /** + * Returns the alignment for the specified table element. + * Priority order: cell->row->column->default + * @param row TableRow element + * @param colIndex column index + */ + private TableAlignment getCellAlignment(final TableRow row, final int colIndex) { - assert row < rows.size() && column < columns.size(); + final List rowElements = row.getElements(); + final TableElement cell = colIndex < rowElements.size() ? rowElements.get(colIndex) : EMPTY_ELEMENT; + final TableElement column = colIndex < columns.size() ? columns.get(colIndex) : EMPTY_ELEMENT; - // Row should be -1 for columns so use a empty TableRow - final TableRow rowEle = row != -1 ? rows.get(row) : EMPTY_ROW; - final TableElement columnElement = columns.get(column); - final TableElement[] elements = rowEle.getElements(); - - // Some rows may not have every element, even though they should.. - final TableElement ele = column < elements.length ? elements[column] : EMPTY_ELEMENT; - - // Alignment priorities goes as follow: cell->row->column->default return firstNonNull( - ele.getAlignment(), - rowEle.getRowAlignment(), - columnElement.getAlignment(), + cell.getAlignment(), + row.getRowAlignment(), + column.getAlignment(), defaultAlignment); } @@ -455,4 +354,69 @@ public class TableComponent implements LayoutableRenderableEntity return cur; } + + // Helper functions for cleaner overlay code + public void addRow(@Nonnull final String... cells) + { + final List elements = new ArrayList<>(); + for (final String cell : cells) + { + elements.add(TableElement.builder().content(cell).build()); + } + + final TableRow row = TableRow.builder().build(); + row.setElements(elements); + + this.rows.add(row); + } + + public void addRows(@Nonnull final String[]... rows) + { + for (String[] row : rows) + { + addRow(row); + } + } + + public void addRows(@NonNull final TableRow... rows) + { + this.rows.addAll(Arrays.asList(rows)); + } + + public void setRows(@Nonnull final String[]... elements) + { + this.rows.clear(); + addRows(elements); + } + + public void setRows(@Nonnull final TableRow... elements) + { + this.rows.clear(); + this.rows.addAll(Arrays.asList(elements)); + } + + public void addColumn(@Nonnull final String col) + { + this.columns.add(TableElement.builder().content(col).build()); + } + + public void addColumns(@NonNull final TableElement... columns) + { + this.columns.addAll(Arrays.asList(columns)); + } + + public void setColumns(@Nonnull final TableElement... elements) + { + this.columns.clear(); + this.columns.addAll(Arrays.asList(elements)); + } + + public void setColumns(@Nonnull final String... columns) + { + this.columns.clear(); + for (String col : columns) + { + addColumn(col); + } + } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java index 1f38d7368b..d80c40e4db 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java @@ -25,6 +25,7 @@ package net.runelite.client.ui.overlay.components.table; import java.awt.Color; +import java.util.List; import lombok.Builder; import lombok.Data; @@ -34,5 +35,5 @@ public class TableRow { Color rowColor; TableAlignment rowAlignment; - TableElement[] elements; + List elements; } diff --git a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java index 19fde8fe35..1c7e95d37a 100644 --- a/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java +++ b/runelite-client/src/test/java/net/runelite/client/ui/overlay/components/table/TableComponentTest.java @@ -27,6 +27,7 @@ package net.runelite.client.ui.overlay.components.table; import java.awt.Color; import java.awt.FontMetrics; import java.awt.Graphics2D; +import java.util.List; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; @@ -69,7 +70,11 @@ public class TableComponentTest { TableComponent tableComponent = new TableComponent(); tableComponent.addRow("test", "test", "test", "test", "test"); - tableComponent.setColumnColors(Color.RED, Color.GREEN, Color.BLUE); + tableComponent.setColumns("", "", ""); + List elements = tableComponent.getColumns(); + elements.get(0).setColor(Color.RED); + elements.get(1).setColor(Color.GREEN); + elements.get(2).setColor(Color.BLUE); tableComponent.render(graphics); verify(graphics, atLeastOnce()).setColor(Color.RED); verify(graphics, atLeastOnce()).setColor(Color.GREEN); From 7b45cbe3487dbe3b145758e6d2dbeab37655d4f3 Mon Sep 17 00:00:00 2001 From: TheStonedTurtle Date: Sat, 11 May 2019 10:11:24 -0700 Subject: [PATCH 16/19] More code fixes --- .../overlay/components/table/TableComponent.java | 15 +++++++++++++-- .../ui/overlay/components/table/TableRow.java | 4 +++- 2 files changed, 16 insertions(+), 3 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 3e9b838ce5..5dec2a7ac6 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -76,7 +76,7 @@ public class TableComponent implements LayoutableRenderableEntity for (TableRow row : this.rows) { - height += displayRow(graphics, row, height, columnWidths, metrics); + height = displayRow(graphics, row, height, columnWidths, metrics); } graphics.translate(-preferredLocation.x, -preferredLocation.y); @@ -99,7 +99,13 @@ public class TableComponent implements LayoutableRenderableEntity int y = startingRowHeight; final TableElement cell = elements.get(i); - final String[] lines = lineBreakText(cell.getContent(), columnWidths[i], metrics); + final String content = cell.getContent(); + if (content == null) + { + continue; + } + + final String[] lines = lineBreakText(content, columnWidths[i], metrics); final TableAlignment alignment = getCellAlignment(row, i); final Color color = getCellColor(row, i); @@ -151,6 +157,11 @@ public class TableComponent implements LayoutableRenderableEntity { final TableElement ele = elements.get(col); final String cell = ele.getContent(); + if (cell == null) + { + continue; + } + final int cellWidth = getTextWidth(metrics, cell); maxtextw[col] = Math.max(maxtextw[col], cellWidth); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java index d80c40e4db..8879b08c5e 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java @@ -25,6 +25,7 @@ package net.runelite.client.ui.overlay.components.table; import java.awt.Color; +import java.util.ArrayList; import java.util.List; import lombok.Builder; import lombok.Data; @@ -35,5 +36,6 @@ public class TableRow { Color rowColor; TableAlignment rowAlignment; - List elements; + @Builder.Default + List elements = new ArrayList<>(); } From ec9801eb52d1754a0513cb7fded84eefd3e850c3 Mon Sep 17 00:00:00 2001 From: Scott Burns Date: Fri, 31 May 2019 20:18:55 +0200 Subject: [PATCH 17/19] Table component add empty check --- .../client/ui/overlay/components/table/TableComponent.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 5dec2a7ac6..63e8107aed 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -430,4 +430,9 @@ public class TableComponent implements LayoutableRenderableEntity addColumn(col); } } + + public boolean isEmpty() + { + return columns.size() == 0 || rows.size() == 0; + } } From d36db6f1a041eaaed84f03433f1ced7cb0e3e85a Mon Sep 17 00:00:00 2001 From: Scott Burns Date: Fri, 31 May 2019 22:59:52 +0200 Subject: [PATCH 18/19] Tables everywhere --- .../plugins/agility/LapCounterOverlay.java | 25 +++---- .../barrows/BarrowsBrotherSlainOverlay.java | 23 +++--- .../BlastFurnaceCofferOverlay.java | 13 ++-- .../client/plugins/boosts/BoostsOverlay.java | 27 ++++--- .../plugins/cooking/CookingOverlay.java | 23 +++--- .../plugins/cooking/FermentTimerOverlay.java | 16 ++-- .../plugins/corp/CorpDamageOverlay.java | 24 +++--- .../plugins/coxhelper/VanguardsOverlay.java | 37 +++++---- .../plugins/devtools/CameraOverlay.java | 47 ++++-------- .../plugins/devtools/LocationOverlay.java | 50 +++++-------- .../client/plugins/fightcave/WaveOverlay.java | 21 ++++-- .../plugins/fishing/FishingOverlay.java | 21 +++--- .../client/plugins/mining/MiningOverlay.java | 31 +++----- .../motherlode/MotherlodeGemOverlay.java | 31 ++++---- .../motherlode/MotherlodeOreOverlay.java | 41 ++++------ .../plugins/motherlode/MotherlodeOverlay.java | 31 +++----- .../motherlode/MotherlodeSackOverlay.java | 24 +++--- .../nightmarezone/NightmareZoneOverlay.java | 12 +-- .../opponentinfo/PlayerComparisonOverlay.java | 37 +++++---- .../client/plugins/raids/RaidsOverlay.java | 58 ++++++-------- .../plugins/raids/RaidsPointsOverlay.java | 30 ++++---- .../plugins/smelting/SmeltingOverlay.java | 26 +++---- .../theatre/rooms/nylocas/NyloOverlay.java | 45 +++++------ .../theatre/rooms/xarpus/XarpusCounter.java | 26 ++++--- .../plugins/thieving/ThievingOverlay.java | 24 +++--- .../wintertodt/WintertodtActivity.java | 2 +- .../wintertodt/WintertodtInterruptType.java | 2 +- .../plugins/wintertodt/WintertodtOverlay.java | 52 ++++++++----- .../plugins/wintertodt/WintertodtPlugin.java | 75 ++++--------------- .../woodcutting/WoodcuttingOverlay.java | 21 +++--- .../plugins/xpglobes/XpGlobesOverlay.java | 49 ++++-------- .../components/table/TableAlignment.java | 46 ++++++------ .../components/table/TableComponent.java | 33 ++++++-- .../ui/overlay/components/table/TableRow.java | 3 +- 34 files changed, 467 insertions(+), 559 deletions(-) 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 a53f6bac4e..8b270ccb02 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 @@ -35,8 +35,9 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class LapCounterOverlay extends Overlay { @@ -80,25 +81,23 @@ class LapCounterOverlay extends Overlay } panelComponent.getChildren().clear(); - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Laps:") - .right(Integer.toString(session.getTotalLaps())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Total Laps:", Integer.toString(session.getTotalLaps())); if (config.lapsToLevel() && session.getLapsTillLevel() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Laps until level:") - .right(Integer.toString(session.getLapsTillLevel())) - .build()); + tableComponent.addRow("Laps until level:", Integer.toString(session.getLapsTillLevel())); } if (config.lapsToGoal() && session.getLapsTillGoal() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Laps until goal:") - .right(Integer.toString(session.getLapsTillGoal())) - .build()); + tableComponent.addRow("Laps until goal:", Integer.toString(session.getLapsTillGoal())); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } 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 d851b406fa..f71c37a282 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 @@ -38,8 +38,10 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class BarrowsBrotherSlainOverlay extends Overlay { @@ -75,24 +77,23 @@ public class BarrowsBrotherSlainOverlay extends Overlay } panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); for (BarrowsBrothers brother : BarrowsBrothers.values()) { final boolean brotherSlain = client.getVar(brother.getKilledVarbit()) > 0; String slain = brotherSlain ? "\u2713" : "\u2717"; - panelComponent.getChildren().add(LineComponent.builder() - .left(brother.getName()) - .right(slain) - .rightColor(brotherSlain ? Color.GREEN : Color.RED) - .build()); + tableComponent.addRow(brother.getName(), ColorUtil.prependColorTag(slain, brotherSlain ? Color.RED : Color.GREEN)); } float rewardPercent = client.getVar(Varbits.BARROWS_REWARD_POTENTIAL) / 10.0f; - panelComponent.getChildren().add(LineComponent.builder() - .left("Potential") - .right(rewardPercent != 0 ? rewardPercent + "%" : "0%") - .rightColor(rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW) - .build()); + tableComponent.addRow("Potential", ColorUtil.prependColorTag(rewardPercent != 0 ? rewardPercent + "%" : "0%", rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW)); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } 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 d88c668939..56d108ac45 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 @@ -36,8 +36,8 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.table.TableComponent; import net.runelite.client.util.StackFormatter; class BlastFurnaceCofferOverlay extends Overlay @@ -72,10 +72,13 @@ class BlastFurnaceCofferOverlay extends Overlay { sack.setHidden(true); - panelComponent.getChildren().add(LineComponent.builder() - .left("Coffer:") - .right(StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp") - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("Coffer:", StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp"); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } } return panelComponent.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 113205ecfd..0fbb15cf18 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,8 +36,9 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; import net.runelite.client.util.ColorUtil; class BoostsOverlay extends Overlay @@ -69,24 +70,21 @@ class BoostsOverlay extends Overlay panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + int nextChange = plugin.getChangeDownTicks(); if (nextChange != -1) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Next + restore in") - .right(String.valueOf(plugin.getChangeTime(nextChange))) - .build()); + tableComponent.addRow("Next + restore:", String.valueOf(plugin.getChangeTime(nextChange))); } nextChange = plugin.getChangeUpTicks(); if (nextChange != -1) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Next - restore in") - .right(String.valueOf(plugin.getChangeTime(nextChange))) - .build()); + tableComponent.addRow("Next - restore:", String.valueOf(plugin.getChangeTime(nextChange))); } if (plugin.canShowBoosts()) @@ -119,14 +117,15 @@ class BoostsOverlay extends Overlay + ColorUtil.prependColorTag("/" + base, Color.WHITE); } - panelComponent.getChildren().add(LineComponent.builder() - .left(skill.getName()) - .right(str) - .rightColor(strColor) - .build()); + tableComponent.addRow(skill.getName() + ":", str); } } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java index a5af5309d9..8ad03fc94b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java @@ -42,9 +42,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class CookingOverlay extends Overlay { @@ -53,18 +54,16 @@ class CookingOverlay extends Overlay private final Client client; private final CookingPlugin plugin; - private final CookingConfig config; private final XpTrackerService xpTrackerService; private final PanelComponent panelComponent = new PanelComponent(); @Inject - private CookingOverlay(Client client, CookingPlugin plugin, CookingConfig config, XpTrackerService xpTrackerService) + private CookingOverlay(Client client, CookingPlugin plugin, XpTrackerService xpTrackerService) { super(plugin); setPosition(OverlayPosition.TOP_LEFT); this.client = client; this.plugin = plugin; - this.config = config; this.xpTrackerService = xpTrackerService; getMenuEntries().add(new OverlayMenuEntry(RUNELITE_OVERLAY_CONFIG, OPTION_CONFIGURE, "Cooking overlay")); } @@ -95,15 +94,15 @@ class CookingOverlay extends Overlay .build()); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Cooked:") - .right(session.getCookAmount() + (session.getCookAmount() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.COOKING) + "/hr)" : "")) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Cooked:", session.getCookAmount() + (session.getCookAmount() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.COOKING) + "/hr)" : "")); + tableComponent.addRow("Burnt:", session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")); - panelComponent.getChildren().add(LineComponent.builder() - .left("Burnt:") - .right(session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")) - .build()); + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java index 3ec1783bb0..a76871c5e7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java @@ -38,9 +38,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; @Slf4j class FermentTimerOverlay extends Overlay @@ -78,10 +79,15 @@ class FermentTimerOverlay extends Overlay .text("Making Wine") .color(Color.GREEN) .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Ferments in: ") - .right(String.valueOf(INITIAL_TIME - Duration.between(session.getLastWineMakingAction(), Instant.now()).getSeconds())) - .build()); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Ferments in:", String.valueOf(INITIAL_TIME - Duration.between(session.getLastWineMakingAction(), Instant.now()).getSeconds())); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } } else { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java index abc6d7578e..9dab05f168 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/corp/CorpDamageOverlay.java @@ -43,8 +43,10 @@ import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentConstants; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class CorpDamageOverlay extends Overlay { @@ -91,6 +93,9 @@ class CorpDamageOverlay extends Overlay panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + NPC core = corpPlugin.getCore(); if (core != null) { @@ -114,25 +119,14 @@ class CorpDamageOverlay extends Overlay int textWidth = Math.max(ComponentConstants.STANDARD_WIDTH, fontMetrics.stringWidth(text)); panelComponent.setPreferredSize(new Dimension(textWidth, 0)); - panelComponent.getChildren().add(LineComponent.builder() - .left(text) - .leftColor(Color.RED) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag(text, Color.RED), ""); } } if (config.showDamage()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Your damage") - .right(Integer.toString(myDamage)) - .rightColor(damageForKill > 0 && myDamage >= damageForKill ? Color.GREEN : Color.RED) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Total damage") - .right(Integer.toString(totalDamage)) - .build()); + tableComponent.addRow("Your damage", ColorUtil.prependColorTag(Integer.toString(myDamage), damageForKill > 0 && myDamage >= damageForKill ? Color.GREEN : Color.RED)); + tableComponent.addRow("Total damage:", Integer.toString(totalDamage)); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java index 3bbe48a469..66a333104a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java @@ -28,28 +28,27 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; -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; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class VanguardsOverlay extends Overlay { - private final Client client; private final CoxPlugin plugin; private final CoxConfig config; private final PanelComponent panelComponent = new PanelComponent(); @Inject - VanguardsOverlay(Client client, CoxPlugin plugin, CoxConfig config) + VanguardsOverlay(CoxPlugin plugin, CoxConfig config) { super(plugin); setPosition(OverlayPosition.DYNAMIC); setPosition(OverlayPosition.DETACHED); - this.client = client; this.plugin = plugin; this.config = config; } @@ -67,21 +66,19 @@ public class VanguardsOverlay extends Overlay .text("Vanguards") .color(Color.pink) .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Range") - .right(Integer.toString(plugin.getRangeVangHP())) - .leftColor(Color.green) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Mage") - .right(Integer.toString(plugin.getMageVangHP())) - .leftColor(Color.blue) - .build()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Melee") - .right(Integer.toString(plugin.getMeleeVangHP())) - .leftColor(Color.red) - .build()); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableComponent.addRow(ColorUtil.prependColorTag("Range", Color.GREEN), Integer.toString(plugin.getRangeVangHP())); + tableComponent.addRow(ColorUtil.prependColorTag("Mage", Color.BLUE), Integer.toString(plugin.getMageVangHP())); + tableComponent.addRow(ColorUtil.prependColorTag("Melee", Color.RED), Integer.toString(plugin.getMeleeVangHP())); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java index 7a23ae3003..ee5ee1283b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java @@ -30,9 +30,9 @@ import javax.inject.Inject; 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; -import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class CameraOverlay extends Overlay { @@ -59,39 +59,20 @@ public class CameraOverlay extends Overlay panelComponent.getChildren().clear(); - panelComponent.getChildren().add(TitleComponent.builder() - .text("Camera") - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("X") - .right("" + client.getCameraX()) - .build()); + tableComponent.addRow("X", "" + client.getCameraX()); + tableComponent.addRow("Y", "" + client.getCameraY()); + tableComponent.addRow("Z", "" + client.getCameraZ()); + tableComponent.addRow("Pitch", "" + client.getCameraPitch()); + tableComponent.addRow("Yaw", "" + client.getCameraYaw()); + tableComponent.addRow("Scale", "" + client.getScale()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Y") - .right("" + client.getCameraY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Z") - .right("" + client.getCameraZ()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Pitch") - .right("" + client.getCameraPitch()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Yaw") - .right("" + client.getCameraYaw()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Scale") - .right("" + client.getScale()) - .build()); + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.render(graphics); } 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 7caa1691fb..2a246a6165 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,8 +34,10 @@ 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; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class LocationOverlay extends Overlay { @@ -66,11 +68,12 @@ public class LocationOverlay extends Overlay int regionID = localWorld.getRegionID(); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (client.isInInstancedRegion()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Instance") - .build()); + tableComponent.addRow("Instance", ""); int[][][] instanceTemplateChunks = client.getInstanceTemplateChunks(); int z = client.getPlane(); @@ -80,41 +83,24 @@ public class LocationOverlay extends Overlay int chunkY = (chunkData >> 3 & 0x7FF) * CHUNK_SIZE; int chunkX = (chunkData >> 14 & 0x3FF) * CHUNK_SIZE; - panelComponent.getChildren().add(LineComponent.builder() - .left("Chunk " + localPoint.getSceneX() / CHUNK_SIZE + "," + localPoint.getSceneY() / CHUNK_SIZE) - .right(rotation + " " + chunkX + " " + chunkY) - .build()); + tableComponent.addRow("Chunk " + localPoint.getSceneX() / CHUNK_SIZE + "," + localPoint.getSceneY() / CHUNK_SIZE, rotation + " " + chunkX + " " + chunkY); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Base") - .right(client.getBaseX() + ", " + client.getBaseY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Local") - .right(localPoint.getX() + ", " + localPoint.getY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Scene") - .right(localPoint.getSceneX() + ", " + localPoint.getSceneY()) - .build()); - - panelComponent.getChildren().add(LineComponent.builder() - .left("Tile") - .right(localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane()) - .build()); + tableComponent.addRow("Base", client.getBaseX() + ", " + client.getBaseY()); + tableComponent.addRow("Local", localPoint.getX() + ", " + localPoint.getY()); + tableComponent.addRow("Scene", localPoint.getSceneX() + ", " + localPoint.getSceneY()); + tableComponent.addRow("Tile", localWorld.getX() + ", " + localWorld.getY() + ", " + client.getPlane()); for (int i = 0; i < client.getMapRegions().length; i++) { int region = client.getMapRegions()[i]; - panelComponent.getChildren().add(LineComponent.builder() - .left((i == 0) ? "Map regions" : " ") - .right(String.valueOf(region)) - .rightColor((region == regionID) ? Color.GREEN : Color.WHITE) - .build()); + tableComponent.addRow((i == 0) ? "Map regions" : " ", ColorUtil.prependColorTag(String.valueOf(region), (region == regionID) ? Color.GREEN : Color.WHITE)); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java index 8561919254..70bf83557f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java @@ -35,9 +35,9 @@ import javax.inject.Inject; import net.runelite.client.ui.ColorScheme; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableComponent; class WaveOverlay extends Overlay { @@ -97,25 +97,30 @@ class WaveOverlay extends Overlay .color(HEADER_COLOR) .build()); - for (LineComponent line : buildWaveLines(waveContents)) + TableComponent tableComponent = new TableComponent(); + + for (String line : buildWaveLines(waveContents)) { - panelComponent.getChildren().add(line); + tableComponent.addRow(line); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } } - private static Collection buildWaveLines(final Map wave) + private static Collection buildWaveLines(final Map wave) { final List> monsters = new ArrayList<>(wave.entrySet()); monsters.sort(Map.Entry.comparingByKey()); - final List outputLines = new ArrayList<>(); + final List outputLines = new ArrayList<>(); for (Map.Entry monsterEntry : monsters) { final WaveMonster monster = monsterEntry.getKey(); final int quantity = monsterEntry.getValue(); - final LineComponent line = LineComponent.builder() - .left(FightCavePlugin.formatMonsterQuantity(monster, quantity)) - .build(); + final String line = FightCavePlugin.formatMonsterQuantity(monster, quantity); outputLines.add(line); } 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 b9e66992e8..b519a0f672 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 @@ -36,9 +36,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class FishingOverlay extends Overlay { @@ -91,17 +92,19 @@ class FishingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.FISHING); if (actions > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Caught fish:") - .right(Integer.toString(actions)) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + + tableComponent.addRow("Caught fish:", Integer.toString(actions)); if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Fish/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))) - .build()); + tableComponent.addRow("Fish/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java index fb93301723..2dca549e9d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java @@ -32,22 +32,14 @@ import java.time.Duration; import java.time.Instant; import java.util.Set; import javax.inject.Inject; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BLACK; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_IRON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_RUNE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_STEEL; +import static net.runelite.api.AnimationID.*; 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; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class MiningOverlay extends Overlay { @@ -115,15 +107,16 @@ class MiningOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt mined:") - .right(Integer.toString(session.getTotalMined())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt/hr:") - .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") - .build()); + tableComponent.addRow("Pay-dirt mined:", Integer.toString(session.getTotalMined())); + tableComponent.addRow("Pay-dirt/hr:", session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : ""); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.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 f1f6fa92a3..33db997f5d 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 @@ -34,9 +34,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class MotherlodeGemOverlay extends Overlay { @@ -82,36 +83,32 @@ public class MotherlodeGemOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Gems found").build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (diamondsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Diamonds:") - .right(Integer.toString(diamondsFound)) - .build()); + tableComponent.addRow("Diamonds:", Integer.toString(diamondsFound)); } if (rubiesFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Rubies:") - .right(Integer.toString(rubiesFound)) - .build()); + tableComponent.addRow("Rubies:", Integer.toString(rubiesFound)); } if (emeraldsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Emeralds:") - .right(Integer.toString(emeraldsFound)) - .build()); + tableComponent.addRow("Emeralds:", Integer.toString(emeraldsFound)); } if (sapphiresFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Sapphires:") - .right(Integer.toString(sapphiresFound)) - .build()); + tableComponent.addRow("Sapphires:", Integer.toString(sapphiresFound)); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java index 9f3af1625f..2e8374bb63 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java @@ -29,9 +29,10 @@ import java.awt.Graphics2D; 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; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class MotherlodeOreOverlay extends Overlay { @@ -76,52 +77,42 @@ public class MotherlodeOreOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.getChildren().add(TitleComponent.builder().text("Ores found").build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (nuggetsFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Nuggets:") - .right(Integer.toString(nuggetsFound)) - .build()); + tableComponent.addRow("Nuggets:", Integer.toString(nuggetsFound)); } if (coalFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Coal:") - .right(Integer.toString(coalFound)) - .build()); + tableComponent.addRow("Coal:", Integer.toString(coalFound)); } if (goldFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Gold:") - .right(Integer.toString(goldFound)) - .build()); + tableComponent.addRow("Gold:", Integer.toString(goldFound)); } if (mithrilFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Mithril:") - .right(Integer.toString(mithrilFound)) - .build()); + tableComponent.addRow("Mithril:", Integer.toString(mithrilFound)); } if (adamantiteFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Adamantite:") - .right(Integer.toString(adamantiteFound)) - .build()); + tableComponent.addRow("Adamantite:", Integer.toString(adamantiteFound)); } if (runiteFound > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Runite:") - .right(Integer.toString(runiteFound)) - .build()); + tableComponent.addRow("Runite:", Integer.toString(runiteFound)); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } 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 d1811106c9..97b49b157a 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 @@ -32,22 +32,14 @@ import java.time.Duration; import java.time.Instant; import java.util.Set; import javax.inject.Inject; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_ADAMANT; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BLACK; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_BRONZE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_DRAGON_ORN; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_INFERNAL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_IRON; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_MITHRIL; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_RUNE; -import static net.runelite.api.AnimationID.MINING_MOTHERLODE_STEEL; +import static net.runelite.api.AnimationID.*; 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; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class MotherlodeOverlay extends Overlay { @@ -118,15 +110,16 @@ class MotherlodeOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt mined:") - .right(Integer.toString(session.getTotalMined())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt/hr:") - .right(session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : "") - .build()); + tableComponent.addRow("Pay-dirt mined:", Integer.toString(session.getTotalMined())); + tableComponent.addRow("Pay-dirt/hr:", session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : ""); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } 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 4d2135224c..109336a65a 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 @@ -40,8 +40,10 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.ComponentConstants; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class MotherlodeSackOverlay extends Overlay { @@ -76,6 +78,9 @@ class MotherlodeSackOverlay extends Overlay panelComponent.getChildren().clear(); panelComponent.setBackgroundColor(ComponentConstants.STANDARD_BACKGROUND_COLOR); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (sack != null) { sack.setHidden(true); @@ -87,10 +92,7 @@ class MotherlodeSackOverlay extends Overlay panelComponent.setBackgroundColor(DANGER); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Pay-dirt in sack:") - .right(String.valueOf(client.getVar(Varbits.SACK_NUMBER))) - .build()); + tableComponent.addRow("Pay-dirt in sack:", String.valueOf(client.getVar(Varbits.SACK_NUMBER))); } if (config.showDepositsLeft()) @@ -110,15 +112,15 @@ class MotherlodeSackOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left("Deposits left:") - .leftColor(color) - .right(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft)) - .rightColor(color) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("Deposits left:", color), ColorUtil.prependColorTag(depositsLeft == null ? "N/A" : String.valueOf(depositsLeft), color)); } } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } } 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 88846f02d2..285d80c1f1 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 @@ -30,6 +30,7 @@ import javax.inject.Inject; import net.runelite.api.Client; import net.runelite.api.ItemID; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.VarPlayer; import net.runelite.api.Varbits; import net.runelite.api.widgets.Widget; import net.runelite.api.widgets.WidgetInfo; @@ -39,8 +40,9 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; import net.runelite.client.ui.overlay.infobox.InfoBoxManager; import net.runelite.client.util.StackFormatter; @@ -102,10 +104,10 @@ class NightmareZoneOverlay extends Overlay renderAbsorptionCounter(); panelComponent.getChildren().clear(); - panelComponent.getChildren().add(LineComponent.builder() - .left("Points: ") - .right(StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS))) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + tableComponent.addRow("Points:", StackFormatter.formatNumber(client.getVar(Varbits.NMZ_POINTS))); + tableComponent.addRow("Total:", StackFormatter.formatNumber(client.getVar(VarPlayer.NMZ_REWARD_POINTS) + client.getVar(Varbits.NMZ_POINTS))); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java index 9f3f8afb4c..c7e0ae992a 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java @@ -40,9 +40,11 @@ import net.runelite.client.ui.overlay.OverlayLayer; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.Text; import net.runelite.http.api.hiscore.HiscoreResult; import net.runelite.http.api.hiscore.HiscoreSkill; @@ -74,8 +76,9 @@ class PlayerComparisonOverlay extends Overlay HiscoreSkill.PRAYER }; - private static final String LEFT_COLUMN_HEADER = "Skill"; - private static final String RIGHT_COLUMN_HEADER = "You/Them"; + private static final String SKILL_COLUMN_HEADER = "Skill"; + private static final String PLAYER_COLUMN_HEADER = "You"; + private static final String OPPONENT_COLUMN_HEADER = "Them"; private final Client client; private final OpponentInfoPlugin opponentInfoPlugin; @@ -140,13 +143,12 @@ class PlayerComparisonOverlay extends Overlay .color(HIGHLIGHT_COLOR) .build()); - panelComponent.getChildren().add( - LineComponent.builder() - .left(LEFT_COLUMN_HEADER) - .leftColor(HIGHLIGHT_COLOR) - .right(RIGHT_COLUMN_HEADER) - .rightColor(HIGHLIGHT_COLOR) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.CENTER, TableAlignment.RIGHT); + tableComponent.addRow( + ColorUtil.prependColorTag(SKILL_COLUMN_HEADER, HIGHLIGHT_COLOR), + ColorUtil.prependColorTag(PLAYER_COLUMN_HEADER, HIGHLIGHT_COLOR), + ColorUtil.prependColorTag(OPPONENT_COLUMN_HEADER, HIGHLIGHT_COLOR)); for (int i = 0; i < COMBAT_SKILLS.length; ++i) { @@ -163,12 +165,15 @@ class PlayerComparisonOverlay extends Overlay final int playerSkillLevel = client.getRealSkillLevel(skill); final int opponentSkillLevel = opponentSkill.getLevel(); - panelComponent.getChildren().add( - LineComponent.builder() - .left(hiscoreSkill.getName()) - .right(playerSkillLevel + "/" + opponentSkillLevel) - .rightColor(comparisonStatColor(playerSkillLevel, opponentSkillLevel)) - .build()); + tableComponent.addRow( + hiscoreSkill.getName(), + ColorUtil.prependColorTag(Integer.toString(playerSkillLevel), comparisonStatColor(playerSkillLevel, opponentSkillLevel)), + ColorUtil.prependColorTag(Integer.toString(opponentSkillLevel), comparisonStatColor(opponentSkillLevel, playerSkillLevel))); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } } 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 784b2a9afe..83dd0105a4 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 @@ -51,9 +51,11 @@ import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPriority; import net.runelite.client.ui.overlay.components.ComponentOrientation; import net.runelite.client.ui.overlay.components.ImageComponent; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; import net.runelite.client.util.ImageUtil; import net.runelite.client.util.Text; @@ -245,6 +247,10 @@ public class RaidsOverlay extends Overlay .text(displayLayout) .color(color) .build()); + + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + color = Color.ORANGE; if (sharable || config.alwaysShowWorldAndCC()) { @@ -254,12 +260,8 @@ public class RaidsOverlay extends Overlay clanOwner = "Open CC tab..."; color = Color.RED; } - panelComponent.getChildren().add(LineComponent.builder() - .left("W" + client.getWorld()) - .right("" + clanOwner) - .leftColor(Color.ORANGE) - .rightColor(color) - .build()); + + tableComponent.addRow(ColorUtil.prependColorTag("W" + client.getWorld(), Color.ORANGE), ColorUtil.prependColorTag("" + clanOwner, color)); } int bossMatches = 0; @@ -308,11 +310,7 @@ public class RaidsOverlay extends Overlay } } - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : room.getType().getName()) - .right(bossName) - .rightColor(color) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : room.getType().getName(), ColorUtil.prependColorTag(bossName, color)); break; @@ -336,52 +334,38 @@ public class RaidsOverlay extends Overlay color = config.tightropeColor(); } - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : room.getType().getName()) - .right(puzzleName) - .rightColor(color) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : room.getType().getName(), ColorUtil.prependColorTag(puzzleName, color)); + break; case FARMING: if (config.showScavsFarms()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("") - .right(room.getType().getName()) - .rightColor(new Color(181, 230, 29)) //yellow green - .build()); + tableComponent.addRow("", ColorUtil.prependColorTag(room.getType().getName(), new Color(181, 230, 29))); } break; case SCAVENGERS: if (config.scavsBeforeOlm() && roomCount == lastScavs) { - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : "OlmPrep") - .right("Scavs") - .rightColor(config.scavPrepColor()) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : "OlmPrep", ColorUtil.prependColorTag("Scavs", config.scavPrepColor())); } else if (config.scavsBeforeIce() && scavsBeforeIceRooms.contains(roomCount)) { - panelComponent.getChildren().add(LineComponent.builder() - .left(config.showRecommendedItems() ? "" : "IcePrep") - .right("Scavs") - .rightColor(config.scavPrepColor()) - .build()); + tableComponent.addRow(config.showRecommendedItems() ? "" : "IcePrep", ColorUtil.prependColorTag("Scavs", config.scavPrepColor())); } else if (config.showScavsFarms()) { - panelComponent.getChildren().add(LineComponent.builder() - .left("") - .right("Scavs") - .rightColor(new Color(181, 230, 29)) //yellow green - .build()); + tableComponent.addRow("", ColorUtil.prependColorTag("Scavs", new Color(181, 230, 29))); } break; } roomCount++; } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + Dimension panelDims = panelComponent.render(graphics); width = (int) panelDims.getWidth(); height = (int) panelDims.getHeight(); 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 ba6de9983f..c36ac7a8ee 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 @@ -38,8 +38,9 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class RaidsPointsOverlay extends Overlay { @@ -82,29 +83,19 @@ public class RaidsPointsOverlay extends Overlay double uniqueChance = totalPoints / 867500f; panel.getChildren().clear(); - panel.getChildren().add(LineComponent.builder() - .left("Total:") - .right(POINTS_FORMAT.format(totalPoints)) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panel.getChildren().add(LineComponent.builder() - .left(client.getLocalPlayer().getName() + ":") - .right(POINTS_FORMAT.format(personalPoints)) - .build()); + tableComponent.addRow("Total:", POINTS_FORMAT.format(totalPoints)); + tableComponent.addRow(client.getLocalPlayer().getName() + ":", POINTS_FORMAT.format(personalPoints)); if (partySize > 1) { - panel.getChildren().add(LineComponent.builder() - .left("Party size:") - .right(String.valueOf(partySize)) - .build()); + tableComponent.addRow("Party size:", String.valueOf(partySize)); } - panel.getChildren().add(LineComponent.builder() - .left("Unique:") - .right(UNIQUE_FORMAT.format(uniqueChance)) - .build()); + tableComponent.addRow("Unique:", UNIQUE_FORMAT.format(uniqueChance)); //TODO this is annoyingly bugged, personalpoints returns null for some reason /* if (partySize > 1) @@ -117,6 +108,11 @@ public class RaidsPointsOverlay extends Overlay .build()); }*/ + if (!tableComponent.isEmpty()) + { + panel.getChildren().add(tableComponent); + } + return panel.render(graphics); } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java index 7b140dbd61..51c5267cf0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java @@ -40,9 +40,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class SmeltingOverlay extends Overlay { @@ -94,26 +95,25 @@ class SmeltingOverlay extends Overlay int actions = xpTrackerService.getActions(Skill.SMITHING); if (actions > 0) { + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + if (plugin.getSession().getBarsSmelted() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Bars:") - .right(Integer.toString(session.getBarsSmelted())) - .build()); + tableComponent.addRow("Bars:", Integer.toString(session.getBarsSmelted())); } if (plugin.getSession().getCannonBallsSmelted() > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Cannonballs:") - .right(Integer.toString(session.getCannonBallsSmelted())) - .build()); + tableComponent.addRow("Cannonballs:", Integer.toString(session.getCannonBallsSmelted())); } if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Actions/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.SMITHING))) - .build()); + tableComponent.addRow("Actions/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.SMITHING))); + } + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java index ec56886723..f018108780 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java @@ -24,22 +24,23 @@ */ package net.runelite.client.plugins.theatre.rooms.nylocas; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.api.NPC; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatrePlugin; import net.runelite.client.plugins.theatre.TheatreRoom; import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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 java.awt.*; - -import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class NyloOverlay extends Overlay { @@ -100,25 +101,18 @@ class NyloOverlay extends Overlay } panelComponent.getChildren().clear(); + TableComponent tableComponent = new TableComponent(); + int nyloCount = (hagios + toxobolos + ischyros); if (nylohandler.getWave() < 21) { if (nyloCount > 12) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 12" ) - .rightColor(Color.RED) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 12", Color.RED)); } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 12" ) - .rightColor(Color.GREEN) - .build()); - + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 12", Color.GREEN)); } } @@ -126,22 +120,19 @@ class NyloOverlay extends Overlay { if (nyloCount > 24) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 24" ) - .rightColor(Color.RED) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 24", Color.RED)); } else { - panelComponent.getChildren().add(LineComponent.builder() - .left("Total Nylocas:") - .right(nyloCount + " / 24" ) - .rightColor(Color.GREEN) - .build()); + tableComponent.addRow("Total Nylocas:", ColorUtil.prependColorTag(nyloCount + " / 24", Color.GREEN)); } } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + /** panelComponent.getChildren().add(LineComponent.builder() diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java index 29ccf9c012..8a1c8cd926 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java @@ -1,16 +1,19 @@ package net.runelite.client.plugins.theatre.rooms.xarpus; +import java.awt.Color; +import java.awt.Dimension; +import java.awt.Graphics2D; import net.runelite.api.Client; +import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; import net.runelite.client.plugins.theatre.TheatreConfig; import net.runelite.client.plugins.theatre.TheatrePlugin; -import net.runelite.client.ui.overlay.*; -import net.runelite.client.ui.overlay.components.LineComponent; +import net.runelite.client.ui.overlay.Overlay; +import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.OverlayMenuEntry; +import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.components.PanelComponent; import net.runelite.client.ui.overlay.components.TitleComponent; -import java.awt.*; - -import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; -import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class XarpusCounter extends Overlay { @@ -56,10 +59,13 @@ public class XarpusCounter extends Overlay graphics.getFontMetrics().stringWidth(overlayTitle) + 30, 0 )); - panelComponent.getChildren().add(LineComponent.builder() - .left("Exhumes: ") - .right(String.valueOf(xarpusHandler.getExhumesCount())) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.addRow("Exhumes", String.valueOf(xarpusHandler.getExhumesCount())); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java index 04d3fe55b2..273dfe0efc 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java @@ -31,17 +31,18 @@ import java.awt.Dimension; import java.awt.Graphics2D; import java.text.DecimalFormat; import javax.inject.Inject; -import static net.runelite.api.AnimationID.THIEVING_STALL; -import static net.runelite.api.AnimationID.PICKPOCKET_SUCCESS; import static net.runelite.api.AnimationID.BLOCK_UNARMED; +import static net.runelite.api.AnimationID.PICKPOCKET_SUCCESS; +import static net.runelite.api.AnimationID.THIEVING_STALL; import net.runelite.api.Client; 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; import net.runelite.client.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class ThievingOverlay extends Overlay { @@ -95,15 +96,16 @@ public class ThievingOverlay extends Overlay .build()); } - panelComponent.getChildren().add(LineComponent.builder() - .left("Succeeded:") - .right(session.getSuccessful() + (session.getSuccessful() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.THIEVING) + "/hr)" : "")) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - panelComponent.getChildren().add(LineComponent.builder() - .left("Failed:") - .right(session.getFailed() + (session.getFailed() >= 1 ? " (" + FORMAT.format(session.getSuccessRate()) + "%)" : "")) - .build()); + tableComponent.addRow("Succeeded:", session.getSuccessful() + (session.getSuccessful() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.THIEVING) + "/hr)" : "")); + tableComponent.addRow("Failed:", session.getFailed() + (session.getFailed() >= 1 ? " (" + FORMAT.format(session.getSuccessRate()) + "%)" : "")); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java index 6351dc39b5..dadca4137b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtActivity.java @@ -40,4 +40,4 @@ enum WintertodtActivity LIGHTING_BRAZIER("Lighting"); private final String actionString; -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java index 03f05e76fc..db7fe0d416 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtInterruptType.java @@ -42,4 +42,4 @@ enum WintertodtInterruptType BRAZIER_WENT_OUT("Brazier went out"); private final String interruptSourceString; -} +} \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java index dc73d8ac23..d6049b6459 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java @@ -29,17 +29,26 @@ import java.awt.Color; import java.awt.Dimension; import java.awt.Graphics2D; import javax.inject.Inject; +import net.runelite.api.Client; import static net.runelite.api.MenuAction.RUNELITE_OVERLAY_CONFIG; +import net.runelite.api.Skill; +import static net.runelite.client.plugins.wintertodt.WintertodtPlugin.WINTERTODT_KINDLING_MULTIPLIER; +import static net.runelite.client.plugins.wintertodt.WintertodtPlugin.WINTERTODT_ROOTS_MULTIPLIER; import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; class WintertodtOverlay extends Overlay { + @Inject + private Client client; + private final WintertodtPlugin plugin; private final PanelComponent panelComponent = new PanelComponent(); @@ -61,28 +70,35 @@ class WintertodtOverlay extends Overlay } panelComponent.getChildren().clear(); - panelComponent.setPreferredSize(new Dimension(150, 0)); + panelComponent.setPreferredSize(new Dimension(180, 0)); panelComponent.getChildren().add(TitleComponent.builder() - .text(plugin.getCurrentActivity().getActionString()) - .color(plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN) + .text("Points in inventory") + .color(Color.WHITE) .build()); - String inventoryString = plugin.getNumLogs() > 0 ? plugin.getInventoryScore() + " (" + plugin.getTotalPotentialinventoryScore() + ") pts" : plugin.getInventoryScore() + " pts"; - panelComponent.getChildren().add(LineComponent.builder() - .left("Inventory:") - .leftColor(Color.WHITE) - .right(inventoryString) - .rightColor(plugin.getInventoryScore() > 0 ? Color.GREEN : Color.RED) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - String kindlingString = plugin.getNumLogs() > 0 ? plugin.getNumKindling() + " (" + (plugin.getNumLogs() + plugin.getNumKindling()) + ")" : Integer.toString(plugin.getNumKindling()); - panelComponent.getChildren().add(LineComponent.builder() - .left("Kindling:") - .leftColor(Color.WHITE) - .right(kindlingString) - .rightColor(plugin.getNumKindling() + plugin.getNumLogs() > 0 ? Color.GREEN : Color.RED) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("Status:", Color.WHITE), ColorUtil.prependColorTag(plugin.getCurrentActivity().getActionString(), plugin.getCurrentActivity() == WintertodtActivity.IDLE ? Color.RED : Color.GREEN)); + + int firemakingLvl = client.getRealSkillLevel(Skill.FIREMAKING); + + int rootsScore = plugin.getNumRoots() * WINTERTODT_ROOTS_MULTIPLIER; + int rootsXp = plugin.getNumRoots() * Math.round(2 + (3 * firemakingLvl)); + + tableComponent.addRow(ColorUtil.prependColorTag("Roots:", Color.WHITE), ColorUtil.prependColorTag(rootsScore + " pts (" + rootsXp + " xp)", plugin.getNumRoots() > 0 ? Color.GREEN : Color.RED)); + + int kindlingScore = plugin.getNumKindling() * WINTERTODT_KINDLING_MULTIPLIER; + long kindlingXp = plugin.getNumKindling() * Math.round(3.8 * firemakingLvl); + + tableComponent.addRow(ColorUtil.prependColorTag("Kindling:", Color.WHITE), ColorUtil.prependColorTag(kindlingScore + " pts (" + kindlingXp + " xp)", plugin.getNumKindling() > 0 ? Color.GREEN : Color.RED)); + tableComponent.addRow(ColorUtil.prependColorTag("Total:", Color.WHITE), ColorUtil.prependColorTag((rootsScore + kindlingScore) + " pts (" + (rootsXp + kindlingXp) + " xp)", (rootsScore + kindlingScore > 0) ? Color.GREEN : Color.RED)); + + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java index 2360a68604..0ad69971f7 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtPlugin.java @@ -32,21 +32,7 @@ import javax.inject.Inject; import lombok.AccessLevel; import lombok.Getter; import lombok.extern.slf4j.Slf4j; -import static net.runelite.api.AnimationID.CONSTRUCTION; -import static net.runelite.api.AnimationID.FIREMAKING; -import static net.runelite.api.AnimationID.FLETCHING_BOW_CUTTING; -import static net.runelite.api.AnimationID.IDLE; -import static net.runelite.api.AnimationID.LOOKING_INTO; -import static net.runelite.api.AnimationID.WOODCUTTING_3A_AXE; -import static net.runelite.api.AnimationID.WOODCUTTING_ADAMANT; -import static net.runelite.api.AnimationID.WOODCUTTING_BLACK; -import static net.runelite.api.AnimationID.WOODCUTTING_BRONZE; -import static net.runelite.api.AnimationID.WOODCUTTING_DRAGON; -import static net.runelite.api.AnimationID.WOODCUTTING_INFERNAL; -import static net.runelite.api.AnimationID.WOODCUTTING_IRON; -import static net.runelite.api.AnimationID.WOODCUTTING_MITHRIL; -import static net.runelite.api.AnimationID.WOODCUTTING_RUNE; -import static net.runelite.api.AnimationID.WOODCUTTING_STEEL; +import static net.runelite.api.AnimationID.*; import net.runelite.api.ChatMessageType; import net.runelite.api.Client; import net.runelite.api.InventoryID; @@ -79,6 +65,9 @@ public class WintertodtPlugin extends Plugin { private static final int WINTERTODT_REGION = 6462; + static final int WINTERTODT_ROOTS_MULTIPLIER = 10; + static final int WINTERTODT_KINDLING_MULTIPLIER = 25; + @Inject private Notifier notifier; @@ -101,13 +90,7 @@ public class WintertodtPlugin extends Plugin private WintertodtActivity currentActivity = WintertodtActivity.IDLE; @Getter(AccessLevel.PACKAGE) - private int inventoryScore; - - @Getter(AccessLevel.PACKAGE) - private int totalPotentialinventoryScore; - - @Getter(AccessLevel.PACKAGE) - private int numLogs; + private int numRoots; @Getter(AccessLevel.PACKAGE) private int numKindling; @@ -139,9 +122,7 @@ public class WintertodtPlugin extends Plugin private void reset() { - inventoryScore = 0; - totalPotentialinventoryScore = 0; - numLogs = 0; + numRoots = 0; numKindling = 0; currentActivity = WintertodtActivity.IDLE; lastActionTime = null; @@ -410,20 +391,15 @@ public class WintertodtPlugin extends Plugin final Item[] inv = container.getItems(); - inventoryScore = 0; - totalPotentialinventoryScore = 0; - numLogs = 0; + numRoots = 0; numKindling = 0; for (Item item : inv) { - inventoryScore += getPoints(item.getId()); - totalPotentialinventoryScore += getPotentialPoints(item.getId()); - switch (item.getId()) { case BRUMA_ROOT: - ++numLogs; + ++numRoots; break; case BRUMA_KINDLING: ++numKindling; @@ -431,13 +407,13 @@ public class WintertodtPlugin extends Plugin } } - //If we're currently fletching but there are no more logs, go ahead and abort fletching immediately - if (numLogs == 0 && currentActivity == WintertodtActivity.FLETCHING) + //If we're currently fletching but there are no more roots, go ahead and abort fletching immediately + if (numRoots == 0 && currentActivity == WintertodtActivity.FLETCHING) { currentActivity = WintertodtActivity.IDLE; } - //Otherwise, if we're currently feeding the brazier but we've run out of both logs and kindling, abort the feeding activity - else if (numLogs == 0 && numKindling == 0 && currentActivity == WintertodtActivity.FEEDING_BRAZIER) + //Otherwise, if we're currently feeding the brazier but we've run out of both roots and kindling, abort the feeding activity + else if (numRoots == 0 && numKindling == 0 && currentActivity == WintertodtActivity.FEEDING_BRAZIER) { currentActivity = WintertodtActivity.IDLE; } @@ -448,29 +424,4 @@ public class WintertodtPlugin extends Plugin currentActivity = action; lastActionTime = Instant.now(); } - - private static int getPoints(int id) - { - switch (id) - { - case BRUMA_ROOT: - return 10; - case BRUMA_KINDLING: - return 25; - default: - return 0; - } - } - - private static int getPotentialPoints(int id) - { - switch (id) - { - case BRUMA_ROOT: - case BRUMA_KINDLING: - return 25; - default: - return 0; - } - } -} +} \ No newline at end of file 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 d3cf3f9f36..c509e24f12 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 @@ -36,9 +36,10 @@ import net.runelite.client.ui.overlay.Overlay; import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; 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.ui.overlay.components.TitleComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; class WoodcuttingOverlay extends Overlay { @@ -92,23 +93,25 @@ class WoodcuttingOverlay extends Overlay .build()); } + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); + int actions = xpTrackerService.getActions(Skill.WOODCUTTING); if (actions > 0) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Logs cut:") - .right(Integer.toString(actions)) - .build()); + tableComponent.addRow("Logs cut:", Integer.toString(actions)); if (actions > 2) { - panelComponent.getChildren().add(LineComponent.builder() - .left("Logs/hr:") - .right(Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))) - .build()); + tableComponent.addRow("Logs/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.WOODCUTTING))); } } + if (!tableComponent.isEmpty()) + { + panelComponent.getChildren().add(tableComponent); + } + return panelComponent.render(graphics); } 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 168476b376..c9ec551d94 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 @@ -51,8 +51,10 @@ import static net.runelite.client.ui.overlay.OverlayManager.OPTION_CONFIGURE; import net.runelite.client.ui.overlay.OverlayMenuEntry; import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayUtil; -import net.runelite.client.ui.overlay.components.LineComponent; import net.runelite.client.ui.overlay.components.PanelComponent; +import net.runelite.client.ui.overlay.components.table.TableAlignment; +import net.runelite.client.ui.overlay.components.table.TableComponent; +import net.runelite.client.util.ColorUtil; public class XpGlobesOverlay extends Overlay { @@ -248,16 +250,11 @@ public class XpGlobesOverlay extends Overlay xpTooltip.setPreferredLocation(new java.awt.Point(x, y)); xpTooltip.setPreferredSize(new Dimension(TOOLTIP_RECT_SIZE_X, 0)); - xpTooltip.getChildren().add(LineComponent.builder() - .left(skillName) - .right(skillLevel) - .build()); + TableComponent tableComponent = new TableComponent(); + tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); - xpTooltip.getChildren().add(LineComponent.builder() - .left("Current XP:") - .leftColor(Color.ORANGE) - .right(skillCurrentXp) - .build()); + tableComponent.addRow(skillName, skillLevel); + tableComponent.addRow(ColorUtil.prependColorTag("Current XP:", Color.ORANGE), skillCurrentXp); if (goalXp > mouseOverSkill.getCurrentXp()) { @@ -267,41 +264,25 @@ public class XpGlobesOverlay extends Overlay if (actionsLeft != Integer.MAX_VALUE) { String actionsLeftString = decimalFormat.format(actionsLeft); - xpTooltip.getChildren().add(LineComponent.builder() - .left(xpActionType.getLabel() + " left:") - .leftColor(Color.ORANGE) - .right(actionsLeftString) - .build()); + + tableComponent.addRow(ColorUtil.prependColorTag(xpActionType.getLabel() + " left:", Color.ORANGE), actionsLeftString); } int xpLeft = goalXp - mouseOverSkill.getCurrentXp(); String skillXpToLvl = decimalFormat.format(xpLeft); - xpTooltip.getChildren().add(LineComponent.builder() - .left("XP left:") - .leftColor(Color.ORANGE) - .right(skillXpToLvl) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("XP left:", Color.ORANGE), skillXpToLvl); int xpHr = xpTrackerService.getXpHr(mouseOverSkill.getSkill()); if (xpHr != 0) { String xpHrString = decimalFormat.format(xpHr); - xpTooltip.getChildren().add(LineComponent.builder() - .left("XP per hour:") - .leftColor(Color.ORANGE) - .right(xpHrString) - .build()); + tableComponent.addRow(ColorUtil.prependColorTag("XP per hour:", Color.ORANGE), xpHrString); } + } - if (config.enableTimeToLevel()) - { - String timeLeft = xpTrackerService.getTimeTillGoal(mouseOverSkill.getSkill()); - xpTooltip.getChildren().add(LineComponent.builder() - .left("Time left:") - .leftColor(Color.ORANGE) - .right(timeLeft) - .build()); - } + if (!tableComponent.isEmpty()) + { + xpTooltip.getChildren().add(tableComponent); } xpTooltip.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java index d55080a3e0..32acd39bca 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableAlignment.java @@ -1,27 +1,27 @@ /* -* Copyright (c) 2019, TheStonedTurtle -* 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. -*/ + * Copyright (c) 2019, TheStonedTurtle + * 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.table; public enum TableAlignment diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java index 63e8107aed..6edbca14e8 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableComponent.java @@ -290,6 +290,19 @@ public class TableComponent implements LayoutableRenderableEntity return wrapped.toString().split("\n"); } + public boolean isEmpty() + { + return columns.size() == 0 || rows.size() == 0; + } + + private void ensureColumnSize(final int size) + { + while (size > columns.size()) + { + columns.add(TableElement.builder().build()); + } + } + private static int getAlignedPosition(final String str, final TableAlignment alignment, final int columnWidth, final FontMetrics metrics) { final int stringWidth = getTextWidth(metrics, str); @@ -328,6 +341,21 @@ public class TableComponent implements LayoutableRenderableEntity defaultColor); } + public void setColumnAlignment(final int col, final TableAlignment alignment) + { + assert columns.size() > col; + columns.get(col).setAlignment(alignment); + } + + public void setColumnAlignments(@Nonnull final TableAlignment... alignments) + { + ensureColumnSize(alignments.length); + for (int i = 0; i < alignments.length; i++) + { + setColumnAlignment(i, alignments[i]); + } + } + /** * Returns the alignment for the specified table element. * Priority order: cell->row->column->default @@ -430,9 +458,4 @@ public class TableComponent implements LayoutableRenderableEntity addColumn(col); } } - - public boolean isEmpty() - { - return columns.size() == 0 || rows.size() == 0; - } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java index 8879b08c5e..5ff9eee7f4 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/table/TableRow.java @@ -25,7 +25,6 @@ package net.runelite.client.ui.overlay.components.table; import java.awt.Color; -import java.util.ArrayList; import java.util.List; import lombok.Builder; import lombok.Data; @@ -37,5 +36,5 @@ public class TableRow Color rowColor; TableAlignment rowAlignment; @Builder.Default - List elements = new ArrayList<>(); + List elements; } From 4efaea55f7d2eb82514af833ee3865a531643779 Mon Sep 17 00:00:00 2001 From: Scott Burns Date: Sat, 1 Jun 2019 03:12:23 +0200 Subject: [PATCH 19/19] IsEmpty check moved --- .../runelite/client/plugins/agility/LapCounterOverlay.java | 5 +---- .../client/plugins/barrows/BarrowsBrotherSlainOverlay.java | 5 +---- .../plugins/blastfurnace/BlastFurnaceCofferOverlay.java | 5 +---- .../net/runelite/client/plugins/boosts/BoostsOverlay.java | 5 +---- .../net/runelite/client/plugins/cooking/CookingOverlay.java | 5 +---- .../runelite/client/plugins/cooking/FermentTimerOverlay.java | 5 +---- .../runelite/client/plugins/coxhelper/VanguardsOverlay.java | 5 +---- .../net/runelite/client/plugins/devtools/CameraOverlay.java | 5 +---- .../runelite/client/plugins/devtools/LocationOverlay.java | 5 +---- .../net/runelite/client/plugins/fightcave/WaveOverlay.java | 5 +---- .../net/runelite/client/plugins/fishing/FishingOverlay.java | 5 +---- .../net/runelite/client/plugins/mining/MiningOverlay.java | 5 +---- .../client/plugins/motherlode/MotherlodeGemOverlay.java | 5 +---- .../client/plugins/motherlode/MotherlodeOreOverlay.java | 5 +---- .../client/plugins/motherlode/MotherlodeOverlay.java | 5 +---- .../client/plugins/motherlode/MotherlodeSackOverlay.java | 5 +---- .../client/plugins/opponentinfo/PlayerComparisonOverlay.java | 5 +---- .../java/net/runelite/client/plugins/raids/RaidsOverlay.java | 5 +---- .../runelite/client/plugins/raids/RaidsPointsOverlay.java | 5 +---- .../runelite/client/plugins/smelting/SmeltingOverlay.java | 5 +---- .../client/plugins/theatre/rooms/nylocas/NyloOverlay.java | 5 +---- .../client/plugins/theatre/rooms/xarpus/XarpusCounter.java | 5 +---- .../runelite/client/plugins/thieving/ThievingOverlay.java | 5 +---- .../client/plugins/wintertodt/WintertodtOverlay.java | 5 +---- .../client/plugins/woodcutting/WoodcuttingOverlay.java | 5 +---- .../runelite/client/plugins/xpglobes/XpGlobesOverlay.java | 5 +---- .../client/ui/overlay/components/PanelComponent.java | 4 ++++ 27 files changed, 30 insertions(+), 104 deletions(-) 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 8b270ccb02..04c60d4430 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 @@ -95,10 +95,7 @@ class LapCounterOverlay extends Overlay tableComponent.addRow("Laps until goal:", Integer.toString(session.getLapsTillGoal())); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); 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 f71c37a282..cdbb8d4626 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 @@ -90,10 +90,7 @@ public class BarrowsBrotherSlainOverlay extends Overlay float rewardPercent = client.getVar(Varbits.BARROWS_REWARD_POTENTIAL) / 10.0f; tableComponent.addRow("Potential", ColorUtil.prependColorTag(rewardPercent != 0 ? rewardPercent + "%" : "0%", rewardPercent >= 73.0f && rewardPercent <= 88.0f ? Color.GREEN : rewardPercent < 65.6f ? Color.WHITE : Color.YELLOW)); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); 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 56d108ac45..47b335e5b4 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 @@ -75,10 +75,7 @@ class BlastFurnaceCofferOverlay extends Overlay TableComponent tableComponent = new TableComponent(); tableComponent.addRow("Coffer:", StackFormatter.quantityToStackSize(client.getVar(BLAST_FURNACE_COFFER)) + " gp"); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } return panelComponent.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 0fbb15cf18..54a4f62b8f 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 @@ -121,10 +121,7 @@ class BoostsOverlay extends Overlay } } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java index 8ad03fc94b..f90b185877 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/CookingOverlay.java @@ -99,10 +99,7 @@ class CookingOverlay extends Overlay tableComponent.addRow("Cooked:", session.getCookAmount() + (session.getCookAmount() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.COOKING) + "/hr)" : "")); tableComponent.addRow("Burnt:", session.getBurnAmount() + (session.getBurnAmount() >= 1 ? " (" + FORMAT.format(session.getBurntPercentage()) + "%)" : "")); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java index a76871c5e7..b38d34d17d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/cooking/FermentTimerOverlay.java @@ -84,10 +84,7 @@ class FermentTimerOverlay extends Overlay tableComponent.setColumnAlignments(TableAlignment.LEFT, TableAlignment.RIGHT); tableComponent.addRow("Ferments in:", String.valueOf(INITIAL_TIME - Duration.between(session.getLastWineMakingAction(), Instant.now()).getSeconds())); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } else { diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java index 66a333104a..97f0ede328 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/coxhelper/VanguardsOverlay.java @@ -74,10 +74,7 @@ public class VanguardsOverlay extends Overlay tableComponent.addRow(ColorUtil.prependColorTag("Mage", Color.BLUE), Integer.toString(plugin.getMageVangHP())); tableComponent.addRow(ColorUtil.prependColorTag("Melee", Color.RED), Integer.toString(plugin.getMeleeVangHP())); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java index ee5ee1283b..4c89f2791f 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/devtools/CameraOverlay.java @@ -69,10 +69,7 @@ public class CameraOverlay extends Overlay tableComponent.addRow("Yaw", "" + client.getCameraYaw()); tableComponent.addRow("Scale", "" + client.getScale()); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } 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 2a246a6165..71d7311b22 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 @@ -98,10 +98,7 @@ public class LocationOverlay extends Overlay tableComponent.addRow((i == 0) ? "Map regions" : " ", ColorUtil.prependColorTag(String.valueOf(region), (region == regionID) ? Color.GREEN : Color.WHITE)); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java index 70bf83557f..9e7631d136 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/fightcave/WaveOverlay.java @@ -104,10 +104,7 @@ class WaveOverlay extends Overlay tableComponent.addRow(line); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } private static Collection buildWaveLines(final Map wave) 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 b519a0f672..78082d052a 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 @@ -102,10 +102,7 @@ class FishingOverlay extends Overlay tableComponent.addRow("Fish/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.FISHING))); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java index 2dca549e9d..04340f0241 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/mining/MiningOverlay.java @@ -113,10 +113,7 @@ class MiningOverlay extends Overlay tableComponent.addRow("Pay-dirt mined:", Integer.toString(session.getTotalMined())); tableComponent.addRow("Pay-dirt/hr:", session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : ""); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.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 33db997f5d..7b95147aeb 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 @@ -106,10 +106,7 @@ public class MotherlodeGemOverlay extends Overlay tableComponent.addRow("Sapphires:", Integer.toString(sapphiresFound)); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java index 2e8374bb63..3533537987 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/motherlode/MotherlodeOreOverlay.java @@ -110,10 +110,7 @@ public class MotherlodeOreOverlay extends Overlay tableComponent.addRow("Runite:", Integer.toString(runiteFound)); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); 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 97b49b157a..47b7c0a770 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 @@ -116,10 +116,7 @@ class MotherlodeOverlay extends Overlay tableComponent.addRow("Pay-dirt mined:", Integer.toString(session.getTotalMined())); tableComponent.addRow("Pay-dirt/hr:", session.getRecentMined() > 2 ? Integer.toString(session.getPerHour()) : ""); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); 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 109336a65a..2b53ff5bee 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 @@ -116,10 +116,7 @@ class MotherlodeSackOverlay extends Overlay } } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java index c7e0ae992a..60a22eb724 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/opponentinfo/PlayerComparisonOverlay.java @@ -171,10 +171,7 @@ class PlayerComparisonOverlay extends Overlay ColorUtil.prependColorTag(Integer.toString(opponentSkillLevel), comparisonStatColor(opponentSkillLevel, playerSkillLevel))); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } private static Color comparisonStatColor(int a, int b) 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 83dd0105a4..6073433e9b 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 @@ -361,10 +361,7 @@ public class RaidsOverlay extends Overlay roomCount++; } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); Dimension panelDims = panelComponent.render(graphics); width = (int) panelDims.getWidth(); 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 c36ac7a8ee..d4d54b50d0 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 @@ -108,10 +108,7 @@ public class RaidsPointsOverlay extends Overlay .build()); }*/ - if (!tableComponent.isEmpty()) - { - panel.getChildren().add(tableComponent); - } + panel.getChildren().add(tableComponent); return panel.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java index 51c5267cf0..3e9cad459d 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/smelting/SmeltingOverlay.java @@ -111,10 +111,7 @@ class SmeltingOverlay extends Overlay tableComponent.addRow("Actions/hr:", Integer.toString(xpTrackerService.getActionsHr(Skill.SMITHING))); } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); } return panelComponent.render(graphics); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java index f018108780..54e568cb7e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/nylocas/NyloOverlay.java @@ -128,10 +128,7 @@ class NyloOverlay extends Overlay } } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); /** diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java index 8a1c8cd926..840902c186 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/theatre/rooms/xarpus/XarpusCounter.java @@ -62,10 +62,7 @@ public class XarpusCounter extends Overlay TableComponent tableComponent = new TableComponent(); tableComponent.addRow("Exhumes", String.valueOf(xarpusHandler.getExhumesCount())); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java index 273dfe0efc..abd408abb4 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/thieving/ThievingOverlay.java @@ -102,10 +102,7 @@ public class ThievingOverlay extends Overlay tableComponent.addRow("Succeeded:", session.getSuccessful() + (session.getSuccessful() >= 1 ? " (" + xpTrackerService.getActionsHr(Skill.THIEVING) + "/hr)" : "")); tableComponent.addRow("Failed:", session.getFailed() + (session.getFailed() >= 1 ? " (" + FORMAT.format(session.getSuccessRate()) + "%)" : "")); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java index d6049b6459..95dc4a7e42 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/wintertodt/WintertodtOverlay.java @@ -95,10 +95,7 @@ class WintertodtOverlay extends Overlay tableComponent.addRow(ColorUtil.prependColorTag("Kindling:", Color.WHITE), ColorUtil.prependColorTag(kindlingScore + " pts (" + kindlingXp + " xp)", plugin.getNumKindling() > 0 ? Color.GREEN : Color.RED)); tableComponent.addRow(ColorUtil.prependColorTag("Total:", Color.WHITE), ColorUtil.prependColorTag((rootsScore + kindlingScore) + " pts (" + (rootsXp + kindlingXp) + " xp)", (rootsScore + kindlingScore > 0) ? Color.GREEN : Color.RED)); - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); 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 c509e24f12..497d9695b4 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 @@ -107,10 +107,7 @@ class WoodcuttingOverlay extends Overlay } } - if (!tableComponent.isEmpty()) - { - panelComponent.getChildren().add(tableComponent); - } + panelComponent.getChildren().add(tableComponent); return panelComponent.render(graphics); } 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 c9ec551d94..304dd3d439 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 @@ -280,10 +280,7 @@ public class XpGlobesOverlay extends Overlay } } - if (!tableComponent.isEmpty()) - { - xpTooltip.getChildren().add(tableComponent); - } + xpTooltip.getChildren().add(tableComponent); xpTooltip.render(graphics); } 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 3eda960450..33e19c9c11 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 @@ -34,6 +34,7 @@ import java.util.List; import javax.annotation.Nullable; import lombok.Getter; import lombok.Setter; +import net.runelite.client.ui.overlay.components.table.TableComponent; public class PanelComponent implements LayoutableRenderableEntity { @@ -74,6 +75,8 @@ public class PanelComponent implements LayoutableRenderableEntity @Override public Dimension render(Graphics2D graphics) { + children.removeIf(child -> child instanceof TableComponent && ((TableComponent) child).isEmpty()); + if (children.isEmpty()) { return null; @@ -114,6 +117,7 @@ public class PanelComponent implements LayoutableRenderableEntity for (int i = 0; i < children.size(); i++) { final LayoutableRenderableEntity child = children.get(i); + child.setPreferredLocation(new Point(x, y)); child.setPreferredSize(childPreferredSize); final Dimension childDimension = child.render(graphics);