Add support for configurable infobox size

Add new configuration option to RuneLite settings for setting infobox
size.

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-06-12 00:14:59 +02:00
parent 274b0f235c
commit a672c1694a
6 changed files with 95 additions and 32 deletions

View File

@@ -56,6 +56,7 @@ import net.runelite.client.ui.ClientUI;
import net.runelite.client.ui.DrawManager;
import net.runelite.client.ui.TitleToolbar;
import net.runelite.client.ui.overlay.OverlayRenderer;
import net.runelite.client.ui.overlay.infobox.InfoBoxManager;
import org.slf4j.LoggerFactory;
import org.slf4j.MDC;
@@ -120,6 +121,9 @@ public class RuneLite
@Inject
private ClanManager clanManager;
@Inject
private InfoBoxManager infoBoxManager;
Client client;
public static void main(String[] args) throws Exception
@@ -214,6 +218,7 @@ public class RuneLite
eventBus.register(commandManager);
eventBus.register(pluginManager);
eventBus.register(clanManager);
eventBus.register(infoBoxManager);
if (this.client != null)
{

View File

@@ -221,4 +221,15 @@ public interface RuneLiteConfig extends Config
{
return 4;
}
@ConfigItem(
keyName = "infoBoxSize",
name = "Infobox size (px)",
description = "Configures the size of each infobox in pixels",
position = 34
)
default int infoBoxSize()
{
return 35;
}
}

View File

@@ -33,11 +33,13 @@ import java.awt.Point;
import java.awt.Rectangle;
import lombok.Getter;
import lombok.Setter;
import net.runelite.client.ui.FontManager;
@Setter
public class InfoBoxComponent implements LayoutableRenderableEntity
{
private static final int SEPARATOR = 3;
private static final int DEFAULT_SIZE = 32;
@Getter
private String tooltip;
@@ -45,6 +47,9 @@ public class InfoBoxComponent implements LayoutableRenderableEntity
@Getter
private Point preferredLocation = new Point();
@Setter
private Dimension preferredSize = new Dimension(DEFAULT_SIZE, DEFAULT_SIZE);
private String text;
private Color color = Color.WHITE;
private Color backgroundColor = ComponentConstants.STANDARD_BACKGROUND_COLOR;
@@ -58,13 +63,12 @@ public class InfoBoxComponent implements LayoutableRenderableEntity
return new Dimension();
}
graphics.setFont(getSize() < DEFAULT_SIZE ? FontManager.getRunescapeSmallFont() : FontManager.getRunescapeFont());
graphics.translate(preferredLocation.x, preferredLocation.y);
// Calculate dimensions
final FontMetrics metrics = graphics.getFontMetrics();
final int w = image.getWidth(null) + SEPARATOR * 2;
final int h = image.getHeight(null) + SEPARATOR * 2;
final int size = Math.max(w, h);
final int size = getSize();
final Rectangle bounds = new Rectangle(size, size);
// Render background
@@ -93,15 +97,11 @@ public class InfoBoxComponent implements LayoutableRenderableEntity
public Dimension getPreferredSize()
{
final int w = image.getWidth(null) + SEPARATOR * 2;
final int h = image.getHeight(null) + SEPARATOR * 2;
final int size = Math.max(w, h);
return new Dimension(size, size);
return new Dimension(getSize(), getSize());
}
@Override
public void setPreferredSize(Dimension dimension)
private int getSize()
{
// Just use infobox dimensions for now
return Math.max(preferredSize.width, preferredSize.height);
}
}

View File

@@ -26,21 +26,23 @@ package net.runelite.client.ui.overlay.infobox;
import java.awt.Color;
import java.awt.Image;
import java.awt.image.BufferedImage;
import lombok.Getter;
import lombok.Setter;
import net.runelite.client.plugins.Plugin;
public abstract class InfoBox
{
private static final int SIZE = 24;
@Getter
private final Plugin plugin;
@Getter
@Setter
private Image image;
@Getter
@Setter
private Image scaledImage;
@Getter
@Setter
private InfoBoxPriority priority;
@@ -60,21 +62,6 @@ public abstract class InfoBox
public abstract Color getTextColor();
public void setImage(final Image image)
{
if (image == null)
{
return;
}
double width = image.getWidth(null);
double height = image.getHeight(null);
double scalex = (double) SIZE / width;
double scaley = (double) SIZE / height;
double scale = Math.min(scalex, scaley);
this.image = image.getScaledInstance((int) (width * scale), (int) (height * scale), BufferedImage.TYPE_INT_ARGB);
}
public boolean render()
{
return true;

View File

@@ -26,13 +26,20 @@ package net.runelite.client.ui.overlay.infobox;
import com.google.common.base.Preconditions;
import com.google.common.collect.ComparisonChain;
import com.google.common.eventbus.Subscribe;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.List;
import java.util.function.Predicate;
import javax.inject.Inject;
import javax.inject.Singleton;
import lombok.extern.slf4j.Slf4j;
import net.runelite.api.events.ConfigChanged;
import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.plugins.PluginDescriptor;
@Singleton
@@ -40,13 +47,30 @@ import net.runelite.client.plugins.PluginDescriptor;
public class InfoBoxManager
{
private final List<InfoBox> infoBoxes = new ArrayList<>();
private final RuneLiteConfig runeLiteConfig;
@Inject
private InfoBoxManager(final RuneLiteConfig runeLiteConfig)
{
this.runeLiteConfig = runeLiteConfig;
}
@Subscribe
public void onConfigChanged(ConfigChanged event)
{
if (event.getGroup().equals("runelite") && event.getKey().equals("infoBoxSize"))
{
infoBoxes.forEach(this::updateInfoBoxImage);
}
}
public void addInfoBox(InfoBox infoBox)
{
Preconditions.checkNotNull(infoBox);
log.debug("Adding InfoBox {}", infoBox);
infoBoxes.add(infoBox);
updateInfoBoxImage(infoBox);
infoBoxes.add(infoBox);
refreshInfoBoxes();
}
@@ -92,6 +116,43 @@ public class InfoBoxManager
}
}
private void updateInfoBoxImage(final InfoBox infoBox)
{
if (infoBox.getImage() == null)
{
return;
}
// Set scaled InfoBox image
final Image image = infoBox.getImage();
Image resultImage = image;
final double width = image.getWidth(null);
final double height = image.getHeight(null);
final double size = Math.max(2, runeLiteConfig.infoBoxSize()); // Limit size to 2 as that is minimum size not causing breakage
if (size < width || size < height)
{
final double scalex = size / width;
final double scaley = size / height;
if (scalex == 1 && scaley == 1)
{
return;
}
final double scale = Math.min(scalex, scaley);
final int newWidth = (int) (width * scale);
final int newHeight = (int) (height * scale);
final BufferedImage scaledImage = new BufferedImage(newWidth, newHeight, BufferedImage.TYPE_INT_ARGB);
final Graphics g = scaledImage.createGraphics();
g.drawImage(image, 0, 0, newWidth, newHeight, null);
g.dispose();
resultImage = scaledImage;
}
infoBox.setScaledImage(resultImage);
}
private void refreshInfoBoxes()
{
Collections.sort(infoBoxes, (b1, b2) -> ComparisonChain

View File

@@ -35,7 +35,6 @@ import javax.inject.Inject;
import javax.inject.Provider;
import net.runelite.api.Client;
import net.runelite.client.config.RuneLiteConfig;
import net.runelite.client.ui.FontManager;
import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayPosition;
import net.runelite.client.ui.overlay.OverlayUtil;
@@ -81,18 +80,18 @@ public class InfoBoxOverlay extends Overlay
return null;
}
graphics.setFont(FontManager.getRunescapeSmallFont());
panelComponent.getChildren().clear();
panelComponent.setWrapping(config.infoBoxWrap());
panelComponent.setOrientation(config.infoBoxVertical()
? PanelComponent.Orientation.VERTICAL
: PanelComponent.Orientation.HORIZONTAL);
panelComponent.setPreferredSize(new Dimension(config.infoBoxSize(), config.infoBoxSize()));
infoBoxes.forEach(box ->
{
final InfoBoxComponent infoBoxComponent = new InfoBoxComponent();
infoBoxComponent.setColor(box.getTextColor());
infoBoxComponent.setImage(box.getImage());
infoBoxComponent.setImage(box.getScaledImage());
infoBoxComponent.setText(box.getText());
infoBoxComponent.setTooltip(box.getTooltip());
panelComponent.getChildren().add(infoBoxComponent);