From f3bdd4ca181c4ca7e70a4a04b363e8e8a091f8b0 Mon Sep 17 00:00:00 2001 From: Tomas Slusny Date: Mon, 21 May 2018 18:57:14 +0200 Subject: [PATCH] Change ScreenMarkers to use OverlayRenderer Change ScreenMarkers to use OverlayRenderer bounds instead of holding its own bounds. Signed-off-by: Tomas Slusny --- .../plugins/screenmarkers/ScreenMarker.java | 2 - .../ScreenMarkerCreationOverlay.java | 17 +++-- .../ScreenMarkerMouseListener.java | 4 +- .../screenmarkers/ScreenMarkerOverlay.java | 13 +++- .../screenmarkers/ScreenMarkerPlugin.java | 65 ++++++++++--------- .../screenmarkers/ui/ScreenMarkerPanel.java | 13 ++-- .../ui/ScreenMarkerPluginPanel.java | 7 +- 7 files changed, 64 insertions(+), 57 deletions(-) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java index 2d94c34073..624567f09e 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarker.java @@ -26,7 +26,6 @@ package net.runelite.client.plugins.screenmarkers; import java.awt.Color; -import java.awt.Rectangle; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -36,7 +35,6 @@ import lombok.NoArgsConstructor; @AllArgsConstructor public class ScreenMarker { - private Rectangle bounds; private String name; private int borderThickness; private Color color; diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java index cf22b1d2b9..f1e0c60bde 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerCreationOverlay.java @@ -27,7 +27,6 @@ package net.runelite.client.plugins.screenmarkers; import java.awt.BasicStroke; import java.awt.Dimension; import java.awt.Graphics2D; -import java.awt.Rectangle; import java.awt.Stroke; import javax.inject.Inject; import net.runelite.client.ui.overlay.Overlay; @@ -37,12 +36,13 @@ import net.runelite.client.ui.overlay.OverlayPriority; public class ScreenMarkerCreationOverlay extends Overlay { - @Inject private ScreenMarkerPlugin plugin; - public ScreenMarkerCreationOverlay() + @Inject + private ScreenMarkerCreationOverlay(final ScreenMarkerPlugin plugin) { - setPosition(OverlayPosition.DYNAMIC); + this.plugin = plugin; + setPosition(OverlayPosition.DETACHED); setLayer(OverlayLayer.ALWAYS_ON_TOP); setPriority(OverlayPriority.HIGH); } @@ -57,17 +57,16 @@ public class ScreenMarkerCreationOverlay extends Overlay return null; } - Rectangle bounds = marker.getBounds(); int thickness = marker.getBorderThickness(); int offset = thickness / 2; - int width = bounds.width - thickness; - int height = bounds.height - thickness; + int width = getBounds().width - thickness; + int height = getBounds().height - thickness; graphics.setStroke(createStripedStroke(thickness)); graphics.setColor(marker.getColor()); - graphics.drawRect(bounds.x + offset, bounds.y + offset, width, height); + graphics.drawRect(offset, offset, width, height); - return bounds.getSize(); + return getBounds().getSize(); } private Stroke createStripedStroke(int thickness) diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java index 0ca8498ac5..611c4390a9 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerMouseListener.java @@ -38,7 +38,7 @@ public class ScreenMarkerMouseListener extends MouseListener private final ScreenMarkerPlugin plugin; private Point lastMousePoint = null; - public ScreenMarkerMouseListener(ScreenMarkerPlugin plugin) + ScreenMarkerMouseListener(ScreenMarkerPlugin plugin) { this.plugin = plugin; } @@ -126,7 +126,7 @@ public class ScreenMarkerMouseListener extends MouseListener } } - plugin.resizeMarker(currentPoint, dx, dy); + plugin.resizeMarker(dx, dy); lastMousePoint = currentPoint; } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java index 03435f1565..10c65d8da0 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerOverlay.java @@ -28,6 +28,7 @@ package net.runelite.client.plugins.screenmarkers; import java.awt.BasicStroke; import java.awt.Dimension; import java.awt.Graphics2D; +import lombok.Getter; import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayPosition; @@ -35,23 +36,28 @@ import net.runelite.client.ui.overlay.OverlayPriority; public class ScreenMarkerOverlay extends Overlay { + @Getter private final ScreenMarker marker; private final ScreenMarkerRenderable screenMarkerRenderable; - public ScreenMarkerOverlay(ScreenMarker marker) + ScreenMarkerOverlay(ScreenMarker marker) { this.marker = marker; setPosition(OverlayPosition.DETACHED); setLayer(OverlayLayer.ALWAYS_ON_TOP); setPriority(OverlayPriority.HIGH); - setPreferredLocation(marker.getBounds().getLocation()); screenMarkerRenderable = new ScreenMarkerRenderable(); screenMarkerRenderable.setBorderThickness(marker.getBorderThickness()); screenMarkerRenderable.setColor(marker.getColor()); screenMarkerRenderable.setFill(marker.getFill()); screenMarkerRenderable.setStroke(new BasicStroke(marker.getBorderThickness())); - screenMarkerRenderable.setPreferredSize(marker.getBounds().getSize()); + } + + @Override + public String getName() + { + return marker.getName(); } @Override @@ -62,6 +68,7 @@ public class ScreenMarkerOverlay extends Overlay return null; } + screenMarkerRenderable.setPreferredSize(getPreferredSize()); return screenMarkerRenderable.render(graphics); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java index 59ff80fcc4..2f5632adee 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ScreenMarkerPlugin.java @@ -32,12 +32,12 @@ import com.google.gson.Gson; import com.google.gson.reflect.TypeToken; import java.awt.Dimension; import java.awt.Point; -import java.awt.Rectangle; import java.awt.image.BufferedImage; import java.util.ArrayList; import java.util.Collection; -import java.util.Collections; import java.util.List; +import java.util.stream.Collectors; +import java.util.stream.Stream; import javax.imageio.ImageIO; import javax.inject.Inject; import lombok.AccessLevel; @@ -90,7 +90,7 @@ public class ScreenMarkerPlugin extends Plugin private NavigationButton navigationButton; @Getter - private List screenMarkers = new ArrayList<>(); + private final List screenMarkers = new ArrayList<>(); @Getter(AccessLevel.PACKAGE) private ScreenMarker currentMarker; @@ -101,22 +101,18 @@ public class ScreenMarkerPlugin extends Plugin @Override public Collection getOverlays() { - List overlays = new ArrayList<>(); + final List overlays = new ArrayList<>(); overlays.add(overlay); - - for (ScreenMarker marker : screenMarkers) - { - ScreenMarkerOverlay screenMarkerOverlay = new ScreenMarkerOverlay(marker); - overlays.add(screenMarkerOverlay); - } - + overlays.addAll(screenMarkers); return overlays; } @Override protected void startUp() throws Exception { - screenMarkers = loadConfig(null); + loadConfig(configManager.getConfiguration(CONFIG_GROUP, CONFIG_KEY)).forEach(screenMarkers::add); + overlayRenderer.rebuildOverlays(); + pluginPanel = injector.getInstance(ScreenMarkerPluginPanel.class); pluginPanel.init(); @@ -156,7 +152,8 @@ public class ScreenMarkerPlugin extends Plugin { if (screenMarkers.isEmpty() && event.getGroup().equals(CONFIG_GROUP) && event.getKey().equals(CONFIG_KEY)) { - screenMarkers = loadConfig(event.getNewValue()); + loadConfig(event.getNewValue()).forEach(screenMarkers::add); + overlayRenderer.rebuildOverlays(); } } @@ -175,13 +172,16 @@ public class ScreenMarkerPlugin extends Plugin public void startCreation(Point location) { currentMarker = new ScreenMarker( - new Rectangle(location, DEFAULT_SIZE), - DEFAULT_MARKER_NAME, + DEFAULT_MARKER_NAME + " " + (screenMarkers.size() + 1), pluginPanel.getSelectedBorderThickness(), pluginPanel.getSelectedColor(), pluginPanel.getSelectedFillColor(), true ); + + // Set overlay creator bounds to current position and default size + overlay.setPreferredLocation(location); + overlay.setPreferredSize(DEFAULT_SIZE); creatingScreenMarker = true; } @@ -191,9 +191,15 @@ public class ScreenMarkerPlugin extends Plugin { setMouseListenerEnabled(false); pluginPanel.setCreationEnabled(false); - screenMarkers.add(currentMarker); + + final ScreenMarkerOverlay screenMarkerOverlay = new ScreenMarkerOverlay(currentMarker); + screenMarkerOverlay.setPreferredLocation(overlay.getBounds().getLocation()); + screenMarkerOverlay.setPreferredSize(overlay.getBounds().getSize()); + + screenMarkers.add(screenMarkerOverlay); pluginPanel.rebuild(); updateConfig(); + overlayRenderer.saveOverlay(screenMarkerOverlay); overlayRenderer.rebuildOverlays(); } @@ -201,19 +207,20 @@ public class ScreenMarkerPlugin extends Plugin currentMarker = null; } - public void deleteMarker(ScreenMarker marker) + public void deleteMarker(final ScreenMarkerOverlay marker) { + overlayRenderer.resetOverlay(marker); screenMarkers.remove(marker); pluginPanel.rebuild(); updateConfig(); overlayRenderer.rebuildOverlays(); } - public void resizeMarker(Point point, int dx, int dy) + public void resizeMarker(int dx, int dy) { - //TODO: Allow resizing below base point - Dimension currentSize = currentMarker.getBounds().getSize(); - currentMarker.getBounds().setSize(new Dimension(currentSize.width + dx, currentSize.height + dy)); + // TODO: Allow resizing below base point + Dimension currentSize = overlay.getPreferredSize(); + overlay.setPreferredSize(new Dimension(currentSize.width + dx, currentSize.height + dy)); } public void updateConfig() @@ -225,25 +232,23 @@ public class ScreenMarkerPlugin extends Plugin } final Gson gson = new Gson(); - String json = gson.toJson(screenMarkers); + final String json = gson + .toJson(screenMarkers.stream().map(ScreenMarkerOverlay::getMarker).collect(Collectors.toList())); configManager.setConfiguration(CONFIG_GROUP, CONFIG_KEY, json); } - private List loadConfig(String json) + private Stream loadConfig(String json) { - if (json == null) - { - json = configManager.getConfiguration(CONFIG_GROUP, CONFIG_KEY); - } - if (Strings.isNullOrEmpty(json)) { - return Collections.emptyList(); + return Stream.empty(); } final Gson gson = new Gson(); - return gson.fromJson(json, new TypeToken>() + final List screenMarkerData = gson.fromJson(json, new TypeToken>() { }.getType()); + + return screenMarkerData.stream().map(ScreenMarkerOverlay::new); } } diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java index 197d8f70b6..3170632fe2 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPanel.java @@ -29,22 +29,21 @@ import java.awt.GridLayout; import javax.swing.JButton; import javax.swing.JPanel; import javax.swing.JToggleButton; -import net.runelite.client.plugins.screenmarkers.ScreenMarker; +import net.runelite.client.plugins.screenmarkers.ScreenMarkerOverlay; import net.runelite.client.plugins.screenmarkers.ScreenMarkerPlugin; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; -public class ScreenMarkerPanel extends JPanel +class ScreenMarkerPanel extends JPanel { private static final String DELETE_TEXT = "Delete"; private static final String HIDE_TEXT = "Hide"; private static final String SHOW_TEXT = "Show"; private final ScreenMarkerPlugin plugin; - private final ScreenMarker marker; + private final ScreenMarkerOverlay marker; private JToggleButton visibleToggle; - - public ScreenMarkerPanel(ScreenMarkerPlugin plugin, ScreenMarker marker) + ScreenMarkerPanel(ScreenMarkerPlugin plugin, ScreenMarkerOverlay marker) { this.plugin = plugin; this.marker = marker; @@ -59,13 +58,13 @@ public class ScreenMarkerPanel extends JPanel JButton deleteButton = new JButton(DELETE_TEXT); deleteButton.addActionListener(l -> plugin.deleteMarker(marker)); - boolean selected = !marker.isVisible(); + boolean selected = !marker.getMarker().isVisible(); visibleToggle = new JToggleButton(selected ? SHOW_TEXT : HIDE_TEXT, selected); visibleToggle.setFocusable(false); visibleToggle.addActionListener(l -> { boolean visible = !visibleToggle.isSelected(); - marker.setVisible(visible); + marker.getMarker().setVisible(false); visibleToggle.setText(visible ? HIDE_TEXT : SHOW_TEXT); plugin.updateConfig(); }); diff --git a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java index 142e2b39c3..eb844e3f4b 100644 --- a/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java +++ b/runelite-client/src/main/java/net/runelite/client/plugins/screenmarkers/ui/ScreenMarkerPluginPanel.java @@ -42,7 +42,7 @@ import javax.swing.JSpinner; import javax.swing.SpinnerModel; import javax.swing.SpinnerNumberModel; import lombok.Getter; -import net.runelite.client.plugins.screenmarkers.ScreenMarker; +import net.runelite.client.plugins.screenmarkers.ScreenMarkerOverlay; import net.runelite.client.plugins.screenmarkers.ScreenMarkerPlugin; import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; @@ -64,7 +64,6 @@ public class ScreenMarkerPluginPanel extends PluginPanel @Inject private ScreenMarkerPlugin plugin; - private JPanel markerView; private JButton markerButton; @Getter @@ -99,9 +98,9 @@ public class ScreenMarkerPluginPanel extends PluginPanel northPanel.add(markerButton); JPanel centerPanel = new JPanel(); - markerView = new JPanel(new GridLayout(0, 1, 0, 3)); + JPanel markerView = new JPanel(new GridLayout(0, 1, 0, 3)); - for (ScreenMarker marker : plugin.getScreenMarkers()) + for (final ScreenMarkerOverlay marker : plugin.getScreenMarkers()) { markerView.add(new ScreenMarkerPanel(plugin, marker)); }