From a672c1694a2cf2bdebca44cff01fc2797607a803 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Tue, 12 Jun 2018 00:14:59 +0200 Subject: [PATCH] Add support for configurable infobox size Add new configuration option to RuneLite settings for setting infobox size. Signed-off-by: Tomas Slusny --- .../java/net/runelite/client/RuneLite.java | 5 ++ .../client/config/RuneLiteConfig.java | 11 ++++ .../overlay/components/InfoBoxComponent.java | 20 +++--- .../client/ui/overlay/infobox/InfoBox.java | 23 ++----- .../ui/overlay/infobox/InfoBoxManager.java | 63 ++++++++++++++++++- .../ui/overlay/infobox/InfoBoxOverlay.java | 5 +- 6 files changed, 95 insertions(+), 32 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/RuneLite.java b/runelite-client/src/main/java/net/runelite/client/RuneLite.java index dc28b8fbe1..28b253dcd1 100644 --- a/runelite-client/src/main/java/net/runelite/client/RuneLite.java +++ b/runelite-client/src/main/java/net/runelite/client/RuneLite.java @@ -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) { diff --git a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java index d582ad81d8..43081bba9a 100644 --- a/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java +++ b/runelite-client/src/main/java/net/runelite/client/config/RuneLiteConfig.java @@ -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; + } } \ No newline at end of file diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java index fd4eb8990e..ca6c55d3be 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/components/InfoBoxComponent.java @@ -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); } } diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java index d163fa5399..fc498d3635 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBox.java @@ -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; diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java index e07bc84832..0e9919af12 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxManager.java @@ -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 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 diff --git a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java index 11c61b6db0..40f2315380 100644 --- a/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/ui/overlay/infobox/InfoBoxOverlay.java @@ -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);