Skip to content

Commit

Permalink
feat: add dismiss screen marker notification
Browse files Browse the repository at this point in the history
  • Loading branch information
adamk33n3r committed Dec 31, 2024
1 parent dcd910e commit f5f7bcf
Show file tree
Hide file tree
Showing 9 changed files with 144 additions and 38 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -100,7 +100,8 @@ private void init() {
.registerSubtype(RequestFocus.class)
.registerSubtype(NotificationEvent.class)
.registerSubtype(ScreenMarker.class)
.registerSubtype(DismissOverlay.class);
.registerSubtype(DismissOverlay.class)
.registerSubtype(DismissScreenMarker.class);
this.gson = this.clientGson.newBuilder()
// .serializeNulls()
.registerTypeAdapterFactory(alertTypeFactory)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ public enum NotificationType {
POPUP("Popup", "Create a popup notification (like collection log or league task)", Popup.class),
SCREEN_MARKER("Screen Marker", "Show a screen marker", ScreenMarker.class),
DISMISS_OVERLAY("Dismiss Overlay", "Dismiss a sticky overlay by ID", DismissOverlay.class),
DISMISS_SCREEN_MARKER("Dismiss Screen Marker", "Dismiss a sticky screen marker by ID", DismissScreenMarker.class),
REQUEST_FOCUS("Request Focus", "Requests focus on the window", RequestFocus.class),
NOTIFICATION_EVENT("Notification Event", "Fire a NotificationFired event so that other plugins may hook into it e.g. RL Tray Notifications", NotificationEvent.class),
;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.adamk33n3r.runelite.watchdog.notifications;

import com.adamk33n3r.runelite.watchdog.WatchdogPlugin;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

@Getter @Setter
@Accessors(chain = true)
public class DismissScreenMarker extends Notification {
private String dismissId;

@Override
protected void fireImpl(String[] triggerValues) {
WatchdogPlugin.getInstance().getScreenMarkerUtil().removeScreenMarkerById(this.dismissId);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -11,12 +11,16 @@
import java.awt.Color;
import java.time.Instant;

@Getter
@Accessors(chain = true)
public class ScreenMarker extends Notification {
@Getter
private net.runelite.client.plugins.screenmarkers.ScreenMarker screenMarker;
@Getter @Setter
@Setter
private int displayTime = 5;
@Setter
private boolean sticky = false;
@Setter
private String id;

@Inject
public ScreenMarker(WatchdogConfig config) {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.adamk33n3r.runelite.watchdog.ui.notifications.panels;

import com.adamk33n3r.runelite.watchdog.LengthLimitFilter;
import com.adamk33n3r.runelite.watchdog.SimpleDocumentListener;
import com.adamk33n3r.runelite.watchdog.notifications.DismissScreenMarker;
import com.adamk33n3r.runelite.watchdog.ui.FlatTextArea;
import com.adamk33n3r.runelite.watchdog.ui.panels.NotificationsPanel;
import com.adamk33n3r.runelite.watchdog.ui.panels.PanelUtils;

import javax.swing.text.AbstractDocument;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;

public class DismissScreenMarkerNotificationPanel extends NotificationPanel {
public DismissScreenMarkerNotificationPanel(DismissScreenMarker notification, NotificationsPanel parentPanel, Runnable onChangeListener, PanelUtils.OnRemove onRemove) {
super(notification, parentPanel, onChangeListener, onRemove);

FlatTextArea flatTextArea = new FlatTextArea("Enter the ID of the screen marker...", true);
flatTextArea.setText(notification.getDismissId());
((AbstractDocument) flatTextArea.getDocument()).setDocumentFilter(new LengthLimitFilter(200));
flatTextArea.getDocument().addDocumentListener((SimpleDocumentListener) ev -> {
notification.setDismissId(flatTextArea.getText());
});
flatTextArea.getTextArea().addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
flatTextArea.getTextArea().selectAll();
}

@Override
public void focusLost(FocusEvent e) {
onChangeListener.run();
}
});
this.settings.add(flatTextArea);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,7 @@
import net.runelite.client.ui.ColorScheme;
import net.runelite.client.ui.components.colorpicker.ColorPickerManager;

import javax.swing.JButton;
import javax.swing.JPanel;
import javax.swing.JSpinner;
import javax.swing.*;
import javax.swing.text.AbstractDocument;
import java.awt.GridLayout;
import java.awt.event.FocusEvent;
Expand All @@ -25,6 +23,9 @@
public class ScreenMarkerNotificationPanel extends NotificationPanel {
private ScreenMarkerOverlay screenMarkerOverlay;
private JButton setMarkerButton;
private JPanel displayTime;
private JPanel stickyId;

public ScreenMarkerNotificationPanel(ScreenMarker notification, NotificationsPanel parentPanel, ColorPickerManager colorPickerManager, Runnable onChangeListener, PanelUtils.OnRemove onRemove) {
super(notification, parentPanel, onChangeListener, onRemove);
// Rebind onRemove to hook into it so that we can delete the screen marker when this notification is deleted
Expand All @@ -40,25 +41,25 @@ public ScreenMarkerNotificationPanel(ScreenMarker notification, NotificationsPan

net.runelite.client.plugins.screenmarkers.ScreenMarker screenMarker = notification.getScreenMarker();

FlatTextArea flatTextArea = new FlatTextArea("Optional marker label...", true);
flatTextArea.setText(screenMarker.getName());
((AbstractDocument) flatTextArea.getDocument()).setDocumentFilter(new LengthLimitFilter(200));
flatTextArea.getDocument().addDocumentListener((SimpleDocumentListener) ev -> {
screenMarker.setName(flatTextArea.getText());
screenMarker.setLabelled(!flatTextArea.getText().isEmpty());
FlatTextArea markerLabel = new FlatTextArea("Optional marker label...", true);
markerLabel.setText(screenMarker.getName());
((AbstractDocument) markerLabel.getDocument()).setDocumentFilter(new LengthLimitFilter(200));
markerLabel.getDocument().addDocumentListener((SimpleDocumentListener) ev -> {
screenMarker.setName(markerLabel.getText());
screenMarker.setLabelled(!markerLabel.getText().isEmpty());
});
flatTextArea.getTextArea().addFocusListener(new FocusListener() {
markerLabel.getTextArea().addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
flatTextArea.getTextArea().selectAll();
markerLabel.getTextArea().selectAll();
}

@Override
public void focusLost(FocusEvent e) {
onChangeListener.run();
}
});
this.settings.add(flatTextArea);
this.settings.add(markerLabel);

this.settings.add(PanelUtils.createColorPicker(
"Border Color",
Expand Down Expand Up @@ -86,6 +87,27 @@ public void focusLost(FocusEvent e) {
onChangeListener.run();
}));

this.setMarkerButton = PanelUtils.createButton("Set Marker", "Set Marker", (btn, modifiers) -> {
ScreenMarkerUtil screenMarkerUtil = WatchdogPlugin.getInstance().getScreenMarkerUtil();
// Done
if (screenMarkerUtil.isCreatingScreenMarker()) {
this.screenMarkerOverlay = screenMarkerUtil.finishCreation(false);
this.setMarkerButton.setText("Set Marker");
this.setMarkerButton.setToolTipText("Set Marker");
// Start
} else {
if (this.screenMarkerOverlay != null) {
screenMarkerUtil.deleteMarker(this.screenMarkerOverlay);
}
screenMarkerUtil.setMouseListenerEnabled(true);
screenMarkerUtil.setCreatingScreenMarker(true);
screenMarkerUtil.setCurrentMarker(notification);
this.setMarkerButton.setText("Finish");
this.setMarkerButton.setToolTipText("Finish");
}
});
this.settings.add(this.setMarkerButton);

JSpinner thickness = PanelUtils.createSpinner(
screenMarker.getBorderThickness(),
0,
Expand All @@ -96,38 +118,55 @@ public void focusLost(FocusEvent e) {
onChangeListener.run();
}
);
JPanel iconComponent1 = PanelUtils.createIconComponent(Icons.BORDER_OUTSIDE, "Border thickness", thickness);

JCheckBox sticky = PanelUtils.createCheckbox("Sticky", "Set the notification to not expire", notification.isSticky(), val -> {
notification.setSticky(val);
if (val) {
this.settings.remove(this.displayTime);
this.settings.add(this.stickyId);
} else {
this.settings.remove(this.stickyId);
this.settings.add(this.displayTime);
}
this.revalidate();
onChangeListener.run();
});

JSpinner displayTime = PanelUtils.createSpinner(notification.getDisplayTime(), 0, 99, 1, val -> {
notification.setDisplayTime(val);
onChangeListener.run();
});
JPanel iconComponent = PanelUtils.createIconComponent(Icons.CLOCK, "Time to display the marker in seconds. If 0, will be sticky and can be dismissed with shift right-click", displayTime);
JPanel borderThickness = PanelUtils.createIconComponent(Icons.BORDER_OUTSIDE, "Border thickness", thickness);
this.displayTime = PanelUtils.createIconComponent(Icons.CLOCK, "Time to display the marker in seconds.", displayTime);
JPanel sub = new JPanel(new GridLayout(1, 2, 3, 3));
sub.add(iconComponent1);
sub.add(iconComponent);
sub.add(borderThickness);
sub.add(sticky);
sub.setBackground(ColorScheme.DARKER_GRAY_COLOR);
this.settings.add(sub);

this.setMarkerButton = PanelUtils.createButton("Set Marker", "Set Marker", (btn, modifiers) -> {
ScreenMarkerUtil screenMarkerUtil = WatchdogPlugin.getInstance().getScreenMarkerUtil();
// Done
if (screenMarkerUtil.isCreatingScreenMarker()) {
this.screenMarkerOverlay = screenMarkerUtil.finishCreation(false);
this.setMarkerButton.setText("Set Marker");
this.setMarkerButton.setToolTipText("Set Marker");
// Start
} else {
if (this.screenMarkerOverlay != null) {
screenMarkerUtil.deleteMarker(this.screenMarkerOverlay);
}
screenMarkerUtil.setMouseListenerEnabled(true);
screenMarkerUtil.setCreatingScreenMarker(true);
screenMarkerUtil.setCurrentMarker(notification);
this.setMarkerButton.setText("Finish");
this.setMarkerButton.setToolTipText("Finish");
FlatTextArea stickyId = new FlatTextArea("ID to use with Dismiss Overlay...", true);
stickyId.setText(notification.getId());
((AbstractDocument) stickyId.getDocument()).setDocumentFilter(new LengthLimitFilter(200));
stickyId.getDocument().addDocumentListener((SimpleDocumentListener) ev -> {
notification.setId(stickyId.getText());
});
stickyId.getTextArea().addFocusListener(new FocusListener() {
@Override
public void focusGained(FocusEvent e) {
stickyId.getTextArea().selectAll();
}

@Override
public void focusLost(FocusEvent e) {
onChangeListener.run();
}
});
this.settings.add(this.setMarkerButton);
this.stickyId = stickyId;

if (notification.isSticky()) {
this.settings.add(this.stickyId);
} else {
this.settings.add(this.displayTime);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -93,7 +93,7 @@ public Dimension render(Graphics2D graphics)
{
net.runelite.client.plugins.screenmarkers.ScreenMarker marker = this.marker.getScreenMarker();

if (this.marker.getDisplayTime() > 0 && this.isExpired()) {
if (!this.marker.isSticky() && this.isExpired()) {
WatchdogPlugin.getInstance().getScreenMarkerUtil().removeScreenMarker(this.marker);
return null;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -172,6 +172,11 @@ public void removeScreenMarker(ScreenMarker screenMarker) {
this.overlayManager.removeIf(overlay -> overlay instanceof ScreenMarkerOverlay && ((ScreenMarkerOverlay) overlay).getMarker() == screenMarker);
}

public void removeScreenMarkerById(String id) {
this.screenMarkers.removeIf(overlay -> overlay.getMarker().getId().equals(id));
this.overlayManager.removeIf(overlay -> overlay instanceof ScreenMarkerOverlay && ((ScreenMarkerOverlay) overlay).getMarker().getId().equals(id));
}

public void removeAllMarkers() {
this.screenMarkers.clear();
this.overlayManager.removeIf(ScreenMarkerOverlay.class::isInstance);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,8 @@ else if (notification instanceof NotificationEvent)
notificationPanel = new MessageNotificationPanel((NotificationEvent) notification, this, this.alertManager::saveAlerts, removeNotification);
else if (notification instanceof DismissOverlay)
notificationPanel = new DismissOverlayNotificationPanel((DismissOverlay) notification, this, this.alertManager::saveAlerts, removeNotification);
else if (notification instanceof DismissScreenMarker)
notificationPanel = new DismissScreenMarkerNotificationPanel((DismissScreenMarker) notification, this, this.alertManager::saveAlerts, removeNotification);
else if (notification instanceof ScreenMarker)
notificationPanel = new ScreenMarkerNotificationPanel((ScreenMarker) notification, this, this.colorPickerManager, this.alertManager::saveAlerts, removeNotification);

Expand Down

0 comments on commit f5f7bcf

Please sign in to comment.