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;
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;

View File

@@ -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)

View File

@@ -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;
}

View File

@@ -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);
}
}

View File

@@ -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<ScreenMarker> screenMarkers = new ArrayList<>();
private final List<ScreenMarkerOverlay> screenMarkers = new ArrayList<>();
@Getter(AccessLevel.PACKAGE)
private ScreenMarker currentMarker;
@@ -101,22 +101,18 @@ public class ScreenMarkerPlugin extends Plugin
@Override
public Collection<Overlay> getOverlays()
{
List<Overlay> overlays = new ArrayList<>();
final List<Overlay> 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<ScreenMarker> loadConfig(String json)
private Stream<ScreenMarkerOverlay> 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<ArrayList<ScreenMarker>>()
final List<ScreenMarker> screenMarkerData = gson.fromJson(json, new TypeToken<ArrayList<ScreenMarker>>()
{
}.getType());
return screenMarkerData.stream().map(ScreenMarkerOverlay::new);
}
}

View File

@@ -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();
});

View File

@@ -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));
}