From f5f7bcf8fd7c80779d6b0a81559078dd5c65deec Mon Sep 17 00:00:00 2001 From: Adam Keenan Date: Tue, 31 Dec 2024 00:44:51 -0500 Subject: [PATCH] feat: add dismiss screen marker notification --- .../runelite/watchdog/AlertManager.java | 3 +- .../runelite/watchdog/NotificationType.java | 1 + .../notifications/DismissScreenMarker.java | 17 +++ .../watchdog/notifications/ScreenMarker.java | 8 +- .../DismissScreenMarkerNotificationPanel.java | 37 ++++++ .../panels/ScreenMarkerNotificationPanel.java | 107 ++++++++++++------ .../screenmarker/ScreenMarkerOverlay.java | 2 +- .../screenmarker/ScreenMarkerUtil.java | 5 + .../ui/panels/NotificationsPanel.java | 2 + 9 files changed, 144 insertions(+), 38 deletions(-) create mode 100644 src/main/java/com/adamk33n3r/runelite/watchdog/notifications/DismissScreenMarker.java create mode 100644 src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/DismissScreenMarkerNotificationPanel.java diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/AlertManager.java b/src/main/java/com/adamk33n3r/runelite/watchdog/AlertManager.java index 2d279f2..28d6fde 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/AlertManager.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/AlertManager.java @@ -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) diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/NotificationType.java b/src/main/java/com/adamk33n3r/runelite/watchdog/NotificationType.java index 4b0a3e7..0354bcf 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/NotificationType.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/NotificationType.java @@ -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), ; diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/DismissScreenMarker.java b/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/DismissScreenMarker.java new file mode 100644 index 0000000..aa23fe6 --- /dev/null +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/DismissScreenMarker.java @@ -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); + } +} diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/ScreenMarker.java b/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/ScreenMarker.java index 2af1180..02e3cdf 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/ScreenMarker.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/notifications/ScreenMarker.java @@ -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) { diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/DismissScreenMarkerNotificationPanel.java b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/DismissScreenMarkerNotificationPanel.java new file mode 100644 index 0000000..70f3152 --- /dev/null +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/DismissScreenMarkerNotificationPanel.java @@ -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); + } +} diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/ScreenMarkerNotificationPanel.java b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/ScreenMarkerNotificationPanel.java index 7f8d7f2..3b6a9f4 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/ScreenMarkerNotificationPanel.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/panels/ScreenMarkerNotificationPanel.java @@ -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; @@ -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 @@ -40,17 +41,17 @@ 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 @@ -58,7 +59,7 @@ public void focusLost(FocusEvent e) { onChangeListener.run(); } }); - this.settings.add(flatTextArea); + this.settings.add(markerLabel); this.settings.add(PanelUtils.createColorPicker( "Border Color", @@ -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, @@ -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); + } } } diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerOverlay.java b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerOverlay.java index 56180b2..80d2385 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerOverlay.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerOverlay.java @@ -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; } diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerUtil.java b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerUtil.java index 7affc29..0236f8a 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerUtil.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/notifications/screenmarker/ScreenMarkerUtil.java @@ -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); diff --git a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/panels/NotificationsPanel.java b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/panels/NotificationsPanel.java index 450bdbe..bdb882b 100644 --- a/src/main/java/com/adamk33n3r/runelite/watchdog/ui/panels/NotificationsPanel.java +++ b/src/main/java/com/adamk33n3r/runelite/watchdog/ui/panels/NotificationsPanel.java @@ -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);