Change ScreenMarkers to use OverlayRenderer

Change ScreenMarkers to use OverlayRenderer bounds instead of holding
its own bounds.

Signed-off-by: Tomas Slusny <slusnucky@gmail.com>
This commit is contained in:
Tomas Slusny
2018-05-21 18:57:14 +02:00
committed by Adam
parent f11d6e4680
commit f3bdd4ca18
7 changed files with 64 additions and 57 deletions

View File

@@ -26,7 +26,6 @@
package net.runelite.client.plugins.screenmarkers; package net.runelite.client.plugins.screenmarkers;
import java.awt.Color; import java.awt.Color;
import java.awt.Rectangle;
import lombok.AllArgsConstructor; import lombok.AllArgsConstructor;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor; import lombok.NoArgsConstructor;
@@ -36,7 +35,6 @@ import lombok.NoArgsConstructor;
@AllArgsConstructor @AllArgsConstructor
public class ScreenMarker public class ScreenMarker
{ {
private Rectangle bounds;
private String name; private String name;
private int borderThickness; private int borderThickness;
private Color color; private Color color;

View File

@@ -27,7 +27,6 @@ package net.runelite.client.plugins.screenmarkers;
import java.awt.BasicStroke; import java.awt.BasicStroke;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Stroke; import java.awt.Stroke;
import javax.inject.Inject; import javax.inject.Inject;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
@@ -37,12 +36,13 @@ import net.runelite.client.ui.overlay.OverlayPriority;
public class ScreenMarkerCreationOverlay extends Overlay public class ScreenMarkerCreationOverlay extends Overlay
{ {
@Inject
private ScreenMarkerPlugin plugin; 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); setLayer(OverlayLayer.ALWAYS_ON_TOP);
setPriority(OverlayPriority.HIGH); setPriority(OverlayPriority.HIGH);
} }
@@ -57,17 +57,16 @@ public class ScreenMarkerCreationOverlay extends Overlay
return null; return null;
} }
Rectangle bounds = marker.getBounds();
int thickness = marker.getBorderThickness(); int thickness = marker.getBorderThickness();
int offset = thickness / 2; int offset = thickness / 2;
int width = bounds.width - thickness; int width = getBounds().width - thickness;
int height = bounds.height - thickness; int height = getBounds().height - thickness;
graphics.setStroke(createStripedStroke(thickness)); graphics.setStroke(createStripedStroke(thickness));
graphics.setColor(marker.getColor()); 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) private Stroke createStripedStroke(int thickness)

View File

@@ -38,7 +38,7 @@ public class ScreenMarkerMouseListener extends MouseListener
private final ScreenMarkerPlugin plugin; private final ScreenMarkerPlugin plugin;
private Point lastMousePoint = null; private Point lastMousePoint = null;
public ScreenMarkerMouseListener(ScreenMarkerPlugin plugin) ScreenMarkerMouseListener(ScreenMarkerPlugin plugin)
{ {
this.plugin = plugin; this.plugin = plugin;
} }
@@ -126,7 +126,7 @@ public class ScreenMarkerMouseListener extends MouseListener
} }
} }
plugin.resizeMarker(currentPoint, dx, dy); plugin.resizeMarker(dx, dy);
lastMousePoint = currentPoint; lastMousePoint = currentPoint;
} }

View File

@@ -28,6 +28,7 @@ package net.runelite.client.plugins.screenmarkers;
import java.awt.BasicStroke; import java.awt.BasicStroke;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Graphics2D; import java.awt.Graphics2D;
import lombok.Getter;
import net.runelite.client.ui.overlay.Overlay; import net.runelite.client.ui.overlay.Overlay;
import net.runelite.client.ui.overlay.OverlayLayer; import net.runelite.client.ui.overlay.OverlayLayer;
import net.runelite.client.ui.overlay.OverlayPosition; import net.runelite.client.ui.overlay.OverlayPosition;
@@ -35,23 +36,28 @@ import net.runelite.client.ui.overlay.OverlayPriority;
public class ScreenMarkerOverlay extends Overlay public class ScreenMarkerOverlay extends Overlay
{ {
@Getter
private final ScreenMarker marker; private final ScreenMarker marker;
private final ScreenMarkerRenderable screenMarkerRenderable; private final ScreenMarkerRenderable screenMarkerRenderable;
public ScreenMarkerOverlay(ScreenMarker marker) ScreenMarkerOverlay(ScreenMarker marker)
{ {
this.marker = marker; this.marker = marker;
setPosition(OverlayPosition.DETACHED); setPosition(OverlayPosition.DETACHED);
setLayer(OverlayLayer.ALWAYS_ON_TOP); setLayer(OverlayLayer.ALWAYS_ON_TOP);
setPriority(OverlayPriority.HIGH); setPriority(OverlayPriority.HIGH);
setPreferredLocation(marker.getBounds().getLocation());
screenMarkerRenderable = new ScreenMarkerRenderable(); screenMarkerRenderable = new ScreenMarkerRenderable();
screenMarkerRenderable.setBorderThickness(marker.getBorderThickness()); screenMarkerRenderable.setBorderThickness(marker.getBorderThickness());
screenMarkerRenderable.setColor(marker.getColor()); screenMarkerRenderable.setColor(marker.getColor());
screenMarkerRenderable.setFill(marker.getFill()); screenMarkerRenderable.setFill(marker.getFill());
screenMarkerRenderable.setStroke(new BasicStroke(marker.getBorderThickness())); screenMarkerRenderable.setStroke(new BasicStroke(marker.getBorderThickness()));
screenMarkerRenderable.setPreferredSize(marker.getBounds().getSize()); }
@Override
public String getName()
{
return marker.getName();
} }
@Override @Override
@@ -62,6 +68,7 @@ public class ScreenMarkerOverlay extends Overlay
return null; return null;
} }
screenMarkerRenderable.setPreferredSize(getPreferredSize());
return screenMarkerRenderable.render(graphics); return screenMarkerRenderable.render(graphics);
} }
} }

View File

@@ -32,12 +32,12 @@ import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken; import com.google.gson.reflect.TypeToken;
import java.awt.Dimension; import java.awt.Dimension;
import java.awt.Point; import java.awt.Point;
import java.awt.Rectangle;
import java.awt.image.BufferedImage; import java.awt.image.BufferedImage;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.Collections;
import java.util.List; import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.Stream;
import javax.imageio.ImageIO; import javax.imageio.ImageIO;
import javax.inject.Inject; import javax.inject.Inject;
import lombok.AccessLevel; import lombok.AccessLevel;
@@ -90,7 +90,7 @@ public class ScreenMarkerPlugin extends Plugin
private NavigationButton navigationButton; private NavigationButton navigationButton;
@Getter @Getter
private List<ScreenMarker> screenMarkers = new ArrayList<>(); private final List<ScreenMarkerOverlay> screenMarkers = new ArrayList<>();
@Getter(AccessLevel.PACKAGE) @Getter(AccessLevel.PACKAGE)
private ScreenMarker currentMarker; private ScreenMarker currentMarker;
@@ -101,22 +101,18 @@ public class ScreenMarkerPlugin extends Plugin
@Override @Override
public Collection<Overlay> getOverlays() public Collection<Overlay> getOverlays()
{ {
List<Overlay> overlays = new ArrayList<>(); final List<Overlay> overlays = new ArrayList<>();
overlays.add(overlay); overlays.add(overlay);
overlays.addAll(screenMarkers);
for (ScreenMarker marker : screenMarkers)
{
ScreenMarkerOverlay screenMarkerOverlay = new ScreenMarkerOverlay(marker);
overlays.add(screenMarkerOverlay);
}
return overlays; return overlays;
} }
@Override @Override
protected void startUp() throws Exception 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 = injector.getInstance(ScreenMarkerPluginPanel.class);
pluginPanel.init(); pluginPanel.init();
@@ -156,7 +152,8 @@ public class ScreenMarkerPlugin extends Plugin
{ {
if (screenMarkers.isEmpty() && event.getGroup().equals(CONFIG_GROUP) && event.getKey().equals(CONFIG_KEY)) 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) public void startCreation(Point location)
{ {
currentMarker = new ScreenMarker( currentMarker = new ScreenMarker(
new Rectangle(location, DEFAULT_SIZE), DEFAULT_MARKER_NAME + " " + (screenMarkers.size() + 1),
DEFAULT_MARKER_NAME,
pluginPanel.getSelectedBorderThickness(), pluginPanel.getSelectedBorderThickness(),
pluginPanel.getSelectedColor(), pluginPanel.getSelectedColor(),
pluginPanel.getSelectedFillColor(), pluginPanel.getSelectedFillColor(),
true true
); );
// Set overlay creator bounds to current position and default size
overlay.setPreferredLocation(location);
overlay.setPreferredSize(DEFAULT_SIZE);
creatingScreenMarker = true; creatingScreenMarker = true;
} }
@@ -191,9 +191,15 @@ public class ScreenMarkerPlugin extends Plugin
{ {
setMouseListenerEnabled(false); setMouseListenerEnabled(false);
pluginPanel.setCreationEnabled(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(); pluginPanel.rebuild();
updateConfig(); updateConfig();
overlayRenderer.saveOverlay(screenMarkerOverlay);
overlayRenderer.rebuildOverlays(); overlayRenderer.rebuildOverlays();
} }
@@ -201,19 +207,20 @@ public class ScreenMarkerPlugin extends Plugin
currentMarker = null; currentMarker = null;
} }
public void deleteMarker(ScreenMarker marker) public void deleteMarker(final ScreenMarkerOverlay marker)
{ {
overlayRenderer.resetOverlay(marker);
screenMarkers.remove(marker); screenMarkers.remove(marker);
pluginPanel.rebuild(); pluginPanel.rebuild();
updateConfig(); updateConfig();
overlayRenderer.rebuildOverlays(); overlayRenderer.rebuildOverlays();
} }
public void resizeMarker(Point point, int dx, int dy) public void resizeMarker(int dx, int dy)
{ {
//TODO: Allow resizing below base point // TODO: Allow resizing below base point
Dimension currentSize = currentMarker.getBounds().getSize(); Dimension currentSize = overlay.getPreferredSize();
currentMarker.getBounds().setSize(new Dimension(currentSize.width + dx, currentSize.height + dy)); overlay.setPreferredSize(new Dimension(currentSize.width + dx, currentSize.height + dy));
} }
public void updateConfig() public void updateConfig()
@@ -225,25 +232,23 @@ public class ScreenMarkerPlugin extends Plugin
} }
final Gson gson = new Gson(); 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); configManager.setConfiguration(CONFIG_GROUP, CONFIG_KEY, json);
} }
private List<ScreenMarker> loadConfig(String json) private Stream<ScreenMarkerOverlay> loadConfig(String json)
{ {
if (json == null)
{
json = configManager.getConfiguration(CONFIG_GROUP, CONFIG_KEY);
}
if (Strings.isNullOrEmpty(json)) if (Strings.isNullOrEmpty(json))
{ {
return Collections.emptyList(); return Stream.empty();
} }
final Gson gson = new Gson(); final Gson gson = new Gson();
return gson.fromJson(json, new TypeToken<ArrayList<ScreenMarker>>() final List<ScreenMarker> screenMarkerData = gson.fromJson(json, new TypeToken<ArrayList<ScreenMarker>>()
{ {
}.getType()); }.getType());
return screenMarkerData.stream().map(ScreenMarkerOverlay::new);
} }
} }

View File

@@ -29,22 +29,21 @@ import java.awt.GridLayout;
import javax.swing.JButton; import javax.swing.JButton;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JToggleButton; 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.plugins.screenmarkers.ScreenMarkerPlugin;
import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; 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 DELETE_TEXT = "Delete";
private static final String HIDE_TEXT = "Hide"; private static final String HIDE_TEXT = "Hide";
private static final String SHOW_TEXT = "Show"; private static final String SHOW_TEXT = "Show";
private final ScreenMarkerPlugin plugin; private final ScreenMarkerPlugin plugin;
private final ScreenMarker marker; private final ScreenMarkerOverlay marker;
private JToggleButton visibleToggle; private JToggleButton visibleToggle;
ScreenMarkerPanel(ScreenMarkerPlugin plugin, ScreenMarkerOverlay marker)
public ScreenMarkerPanel(ScreenMarkerPlugin plugin, ScreenMarker marker)
{ {
this.plugin = plugin; this.plugin = plugin;
this.marker = marker; this.marker = marker;
@@ -59,13 +58,13 @@ public class ScreenMarkerPanel extends JPanel
JButton deleteButton = new JButton(DELETE_TEXT); JButton deleteButton = new JButton(DELETE_TEXT);
deleteButton.addActionListener(l -> plugin.deleteMarker(marker)); 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 = new JToggleButton(selected ? SHOW_TEXT : HIDE_TEXT, selected);
visibleToggle.setFocusable(false); visibleToggle.setFocusable(false);
visibleToggle.addActionListener(l -> visibleToggle.addActionListener(l ->
{ {
boolean visible = !visibleToggle.isSelected(); boolean visible = !visibleToggle.isSelected();
marker.setVisible(visible); marker.getMarker().setVisible(false);
visibleToggle.setText(visible ? HIDE_TEXT : SHOW_TEXT); visibleToggle.setText(visible ? HIDE_TEXT : SHOW_TEXT);
plugin.updateConfig(); plugin.updateConfig();
}); });

View File

@@ -42,7 +42,7 @@ import javax.swing.JSpinner;
import javax.swing.SpinnerModel; import javax.swing.SpinnerModel;
import javax.swing.SpinnerNumberModel; import javax.swing.SpinnerNumberModel;
import lombok.Getter; 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.plugins.screenmarkers.ScreenMarkerPlugin;
import net.runelite.client.ui.PluginPanel; import net.runelite.client.ui.PluginPanel;
import net.runelite.client.ui.components.shadowlabel.JShadowedLabel; import net.runelite.client.ui.components.shadowlabel.JShadowedLabel;
@@ -64,7 +64,6 @@ public class ScreenMarkerPluginPanel extends PluginPanel
@Inject @Inject
private ScreenMarkerPlugin plugin; private ScreenMarkerPlugin plugin;
private JPanel markerView;
private JButton markerButton; private JButton markerButton;
@Getter @Getter
@@ -99,9 +98,9 @@ public class ScreenMarkerPluginPanel extends PluginPanel
northPanel.add(markerButton); northPanel.add(markerButton);
JPanel centerPanel = new JPanel(); 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)); markerView.add(new ScreenMarkerPanel(plugin, marker));
} }