Add support for preferred location to Panel

- Add support for storing preferredLocation in PanelComponent and
translate children based on it.
- Offset children in PanelComponent by metrics.getHeight by default
- Add null check for background in PanelComponent to support panels
without background

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-05-13 13:25:14 +02:00
parent c8d6691d18
commit 3130e0f254
8 changed files with 51 additions and 27 deletions

View File

@@ -27,6 +27,7 @@ package net.runelite.client.plugins.screenmarkers;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.Stroke; import java.awt.Stroke;
import lombok.AccessLevel; import lombok.AccessLevel;
import lombok.Getter; import lombok.Getter;
@@ -36,6 +37,10 @@ import net.runelite.client.ui.overlay.components.LayoutableRenderableEntity;
public class ScreenMarkerRenderable implements LayoutableRenderableEntity public class ScreenMarkerRenderable implements LayoutableRenderableEntity
{ {
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter
private Point preferredLocation;
@Getter(AccessLevel.PACKAGE)
@Setter
private Dimension preferredSize; private Dimension preferredSize;
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
@Setter(AccessLevel.PACKAGE) @Setter(AccessLevel.PACKAGE)
@@ -69,10 +74,4 @@ public class ScreenMarkerRenderable implements LayoutableRenderableEntity
graphics.drawRect(offset, offset, width - thickness, height - thickness); graphics.drawRect(offset, offset, width - thickness, height - thickness);
return preferredSize; return preferredSize;
} }
@Override
public void setPreferredSize(Dimension preferredSize)
{
this.preferredSize = preferredSize;
}
} }

View File

@@ -231,7 +231,7 @@ public class XpGlobesOverlay extends Overlay
String skillCurrentXp = decimalFormat.format(mouseOverSkill.getCurrentXp()); String skillCurrentXp = decimalFormat.format(mouseOverSkill.getCurrentXp());
xpTooltip.getChildren().clear(); xpTooltip.getChildren().clear();
graphics.translate(x, y); xpTooltip.setPreferredLocation(new java.awt.Point(x, y));
xpTooltip.setPreferredSize(new Dimension(TOOLTIP_RECT_SIZE_X, 0)); xpTooltip.setPreferredSize(new Dimension(TOOLTIP_RECT_SIZE_X, 0));
xpTooltip.getChildren().add(LineComponent.builder() xpTooltip.getChildren().add(LineComponent.builder()
@@ -286,6 +286,5 @@ public class XpGlobesOverlay extends Overlay
} }
xpTooltip.render(graphics); xpTooltip.render(graphics);
graphics.translate(-x, -y);
} }
} }

View File

@@ -26,15 +26,17 @@ package net.runelite.client.ui.overlay.components;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Point;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import lombok.AllArgsConstructor; import lombok.RequiredArgsConstructor;
import lombok.Setter; import lombok.Setter;
@AllArgsConstructor @RequiredArgsConstructor
@Setter @Setter
public class ImageComponent implements LayoutableRenderableEntity public class ImageComponent implements LayoutableRenderableEntity
{ {
private BufferedImage image; private final BufferedImage image;
private Point preferredLocation = new Point();
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
@@ -44,7 +46,7 @@ public class ImageComponent implements LayoutableRenderableEntity
return null; return null;
} }
graphics.drawImage(image, 0, -graphics.getFontMetrics().getHeight(), null); graphics.drawImage(image, preferredLocation.x, preferredLocation.y, null);
return new Dimension(image.getWidth(), image.getHeight()); return new Dimension(image.getWidth(), image.getHeight());
} }

View File

@@ -25,9 +25,11 @@
package net.runelite.client.ui.overlay.components; package net.runelite.client.ui.overlay.components;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point;
import net.runelite.client.ui.overlay.RenderableEntity; import net.runelite.client.ui.overlay.RenderableEntity;
public interface LayoutableRenderableEntity extends RenderableEntity public interface LayoutableRenderableEntity extends RenderableEntity
{ {
void setPreferredLocation(Point position);
void setPreferredSize(Dimension dimension); void setPreferredSize(Dimension dimension);
} }

View File

@@ -47,19 +47,23 @@ public class LineComponent implements LayoutableRenderableEntity
@Builder.Default @Builder.Default
private Color rightColor = Color.WHITE; private Color rightColor = Color.WHITE;
@Builder.Default
private Point preferredLocation = new Point();
@Builder.Default @Builder.Default
private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0);
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
graphics.translate(preferredLocation.x, preferredLocation.y);
// Prevent NPEs // Prevent NPEs
final String left = MoreObjects.firstNonNull(this.left, ""); final String left = MoreObjects.firstNonNull(this.left, "");
final String right = MoreObjects.firstNonNull(this.right, ""); final String right = MoreObjects.firstNonNull(this.right, "");
final FontMetrics metrics = graphics.getFontMetrics(); final FontMetrics metrics = graphics.getFontMetrics();
int x = 0; int x = 0;
int y = 0; int y = metrics.getHeight();
final int leftFullWidth = getLineWidth(left, metrics); final int leftFullWidth = getLineWidth(left, metrics);
final int rightFullWidth = getLineWidth(right, metrics); final int rightFullWidth = getLineWidth(right, metrics);
@@ -108,7 +112,8 @@ public class LineComponent implements LayoutableRenderableEntity
y += metrics.getHeight(); y += metrics.getHeight();
} }
return new Dimension(preferredSize.width, y); graphics.translate(-preferredLocation.x, -preferredLocation.y);
return new Dimension(preferredSize.width, y - metrics.getHeight());
} }
final TextComponent leftLineComponent = new TextComponent(); final TextComponent leftLineComponent = new TextComponent();
@@ -124,7 +129,8 @@ public class LineComponent implements LayoutableRenderableEntity
rightLineComponent.render(graphics); rightLineComponent.render(graphics);
y += metrics.getHeight(); y += metrics.getHeight();
return new Dimension(preferredSize.width, y); graphics.translate(-preferredLocation.x, -preferredLocation.y);
return new Dimension(preferredSize.width, y - metrics.getHeight());
} }
private static int getLineWidth(final String line, final FontMetrics metrics) private static int getLineWidth(final String line, final FontMetrics metrics)

View File

@@ -26,12 +26,12 @@ package net.runelite.client.ui.overlay.components;
import java.awt.Color; import java.awt.Color;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.FontMetrics;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle; import java.awt.Rectangle;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import javax.annotation.Nullable;
import lombok.Getter; import lombok.Getter;
import lombok.Setter; import lombok.Setter;
@@ -44,8 +44,12 @@ public class PanelComponent implements LayoutableRenderableEntity
} }
@Setter @Setter
@Nullable
private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR; private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR;
@Setter
private Point preferredLocation = new Point();
@Setter @Setter
private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0);
@@ -78,21 +82,25 @@ public class PanelComponent implements LayoutableRenderableEntity
return null; return null;
} }
final FontMetrics metrics = graphics.getFontMetrics(); graphics.translate(preferredLocation.x, preferredLocation.y);
// Render background // Calculate panel dimension
final Dimension dimension = new Dimension( final Dimension dimension = new Dimension(
border.x + childDimensions.width + border.width, border.x + childDimensions.width + border.width,
border.y + childDimensions.height + border.height); border.y + childDimensions.height + border.height);
final BackgroundComponent backgroundComponent = new BackgroundComponent(); // Render background
backgroundComponent.setRectangle(new Rectangle(dimension)); if (backgroundColor != null)
backgroundComponent.setBackgroundColor(backgroundColor); {
backgroundComponent.render(graphics); final BackgroundComponent backgroundComponent = new BackgroundComponent();
backgroundComponent.setRectangle(new Rectangle(dimension));
backgroundComponent.setBackgroundColor(backgroundColor);
backgroundComponent.render(graphics);
}
// Offset children // Offset children
final int baseX = border.x; final int baseX = border.x;
final int baseY = border.y + metrics.getHeight(); final int baseY = border.y;
int width = 0; int width = 0;
int height = 0; int height = 0;
int x = baseX; int x = baseX;
@@ -111,10 +119,9 @@ public class PanelComponent implements LayoutableRenderableEntity
for (int i = 0; i < children.size(); i ++) for (int i = 0; i < children.size(); i ++)
{ {
final LayoutableRenderableEntity child = children.get(i); final LayoutableRenderableEntity child = children.get(i);
child.setPreferredLocation(new Point(x, y));
child.setPreferredSize(childPreferredSize); child.setPreferredSize(childPreferredSize);
graphics.translate(x, y);
final Dimension childDimension = child.render(graphics); final Dimension childDimension = child.render(graphics);
graphics.translate(-x, -y);
switch (orientation) switch (orientation)
{ {
@@ -167,6 +174,7 @@ public class PanelComponent implements LayoutableRenderableEntity
// Cache children bounds // Cache children bounds
childDimensions.setSize(totalWidth, totalHeight); childDimensions.setSize(totalWidth, totalHeight);
graphics.translate(-preferredLocation.x, -preferredLocation.y);
return dimension; return dimension;
} }
} }

View File

@@ -50,15 +50,17 @@ public class ProgressBarComponent implements LayoutableRenderableEntity
private Color foregroundColor = new Color(82, 161, 82); private Color foregroundColor = new Color(82, 161, 82);
private Color backgroundColor = new Color(255, 255, 255, 127); private Color backgroundColor = new Color(255, 255, 255, 127);
private Color fontColor = Color.WHITE; private Color fontColor = Color.WHITE;
private Point preferredLocation = new Point();
private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 16); private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 16);
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
graphics.translate(preferredLocation.x, preferredLocation.y);
final FontMetrics metrics = graphics.getFontMetrics(); final FontMetrics metrics = graphics.getFontMetrics();
final int barX = 0; final int barX = 0;
final int barY = -metrics.getHeight(); final int barY = 0;
final long span = maximum - minimum; final long span = maximum - minimum;
final double currentValue = value - minimum; final double currentValue = value - minimum;
@@ -92,6 +94,7 @@ public class ProgressBarComponent implements LayoutableRenderableEntity
textComponent.setText(textToWrite); textComponent.setText(textToWrite);
textComponent.render(graphics); textComponent.render(graphics);
graphics.translate(-preferredLocation.x, -preferredLocation.y);
return new Dimension(width, height); return new Dimension(width, height);
} }
} }

View File

@@ -41,18 +41,23 @@ public class TitleComponent implements LayoutableRenderableEntity
@Builder.Default @Builder.Default
private Color color = Color.WHITE; private Color color = Color.WHITE;
@Builder.Default
private Point preferredLocation = new Point();
@Builder.Default @Builder.Default
private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0); private Dimension preferredSize = new Dimension(ComponentConstants.STANDARD_WIDTH, 0);
@Override @Override
public Dimension render(Graphics2D graphics) public Dimension render(Graphics2D graphics)
{ {
graphics.translate(preferredLocation.x, preferredLocation.y);
final FontMetrics metrics = graphics.getFontMetrics(); final FontMetrics metrics = graphics.getFontMetrics();
final TextComponent titleComponent = new TextComponent(); final TextComponent titleComponent = new TextComponent();
titleComponent.setText(text); titleComponent.setText(text);
titleComponent.setColor(color); titleComponent.setColor(color);
titleComponent.setPosition(new Point((preferredSize.width - metrics.stringWidth(text)) / 2, 0)); titleComponent.setPosition(new Point((preferredSize.width - metrics.stringWidth(text)) / 2, metrics.getHeight()));
final Dimension dimension = titleComponent.render(graphics); final Dimension dimension = titleComponent.render(graphics);
graphics.translate(-preferredLocation.x, -preferredLocation.y);
return new Dimension(Math.min(preferredSize.width, dimension.width), dimension.height); return new Dimension(Math.min(preferredSize.width, dimension.width), dimension.height);
} }
} }