From 9ba49e4279cc0b971724da459c74c7d0e11e2b54 Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Tue, 19 Sep 2023 19:29:21 +0200
Subject: [PATCH] #187 - Add new name update listener method to pads

---
 .../main/java/de/tobias/playpad/pad/Pad.java  |  9 +++++--
 .../pad/listener/PadNameChangeListener.java   | 25 +++++++++++++++++++
 .../de/tobias/playpad/plugin/PadListener.java |  2 ++
 .../impl/EqualizerPluginImpl.java             |  5 ++++
 .../log/listener/PadPlayLogListener.java      |  5 ++++
 .../playpad/plugin/api/WebApiPlugin.scala     |  4 +--
 ...tusListener.scala => PadApiListener.scala} | 12 ++++++++-
 7 files changed, 57 insertions(+), 5 deletions(-)
 create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadNameChangeListener.java
 rename PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/{PadStatusListener.scala => PadApiListener.scala} (58%)

diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java
index 833e52be..73f60d57 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java
@@ -8,6 +8,7 @@ import de.tobias.playpad.pad.content.Playlistable;
 import de.tobias.playpad.pad.content.play.Pauseable;
 import de.tobias.playpad.pad.fade.listener.PadFadeContentListener;
 import de.tobias.playpad.pad.fade.listener.PadFadeDurationListener;
+import de.tobias.playpad.pad.listener.PadNameChangeListener;
 import de.tobias.playpad.pad.listener.PadStatusControlListener;
 import de.tobias.playpad.pad.listener.PadStatusNotFoundListener;
 import de.tobias.playpad.pad.listener.trigger.PadTriggerContentListener;
@@ -65,6 +66,7 @@ public class Pad implements IPad {
 	 */
 
 	// Global Listener (unabhängig von der UI), für Core Functions wie Play, Pause
+	private transient PadNameChangeListener padNameChangeListener;
 	private transient PadStatusControlListener padStatusControlListener;
 	private transient PadStatusNotFoundListener padStatusNotFoundListener;
 	private transient PadFadeContentListener padFadeContentListener;
@@ -121,6 +123,9 @@ public class Pad implements IPad {
 
 	private void initPadListener() {
 		// Remove old listener from properties
+		if (padNameChangeListener != null && nameProperty != null) {
+			nameProperty.removeListener(padNameChangeListener);
+		}
 		if (padStatusControlListener != null && statusProperty != null) {
 			statusProperty.removeListener(padStatusControlListener);
 		}
@@ -143,18 +148,18 @@ public class Pad implements IPad {
 		}
 
 		// init new listener for properties
+		padNameChangeListener = new PadNameChangeListener(this);
+		nameProperty.addListener(padNameChangeListener);
 		padStatusControlListener = new PadStatusControlListener(this);
 		statusProperty.addListener(padStatusControlListener);
 
 		// Fade
-
 		padFadeDurationListener = new PadFadeDurationListener(this);
 		padFadeContentListener = new PadFadeContentListener(this);
 		contentProperty.addListener(padFadeContentListener);
 		padFadeContentListener.changed(contentProperty, null, getContent());
 
 		// Not found status count
-
 		padStatusNotFoundListener = new PadStatusNotFoundListener(project);
 		statusProperty.addListener(padStatusNotFoundListener);
 
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadNameChangeListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadNameChangeListener.java
new file mode 100644
index 00000000..af19e4f1
--- /dev/null
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadNameChangeListener.java
@@ -0,0 +1,25 @@
+package de.tobias.playpad.pad.listener;
+
+import de.thecodelabs.logger.Logger;
+import de.tobias.playpad.PlayPadPlugin;
+import de.tobias.playpad.pad.Pad;
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
+
+public class PadNameChangeListener implements ChangeListener<String> {
+
+	private final Pad pad;
+
+	public PadNameChangeListener(Pad pad) {
+		this.pad = pad;
+	}
+
+	@Override
+	public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
+		try {
+			PlayPadPlugin.getInstance().getPadListener().forEach(listener -> listener.onNameChanged(pad, oldValue, newValue));
+		} catch (Exception e) {
+			Logger.error(e);
+		}
+	}
+}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java
index 5c9df06f..a81a3e13 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/plugin/PadListener.java
@@ -13,6 +13,8 @@ import javafx.collections.ListChangeListener;
  */
 public interface PadListener {
 
+	void onNameChanged(Pad pad, String oldValue, String newValue);
+
 	/**
 	 * Call then ever the status of a pad will be changed
 	 *
diff --git a/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java b/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java
index f65d2d28..03cacb67 100644
--- a/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java
+++ b/PlayWallPlugins/PlayWallPluginEqualizer/src/main/java/de/tobias/playpad/equalizerplugin/impl/EqualizerPluginImpl.java
@@ -74,6 +74,11 @@ public class EqualizerPluginImpl implements PlayPadPluginStub, PluginArtifact, M
 		});
 	}
 
+	@Override
+	public void onNameChanged(Pad pad, String oldValue, String newValue) {
+		// Nothing to implement
+	}
+
 	@Override
 	public void onStatusChange(Pad pad, PadStatus newValue) {
 		if (newValue == PadStatus.PLAY) {
diff --git a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/log/listener/PadPlayLogListener.java b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/log/listener/PadPlayLogListener.java
index 05ce0b71..7548965d 100644
--- a/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/log/listener/PadPlayLogListener.java
+++ b/PlayWallPlugins/PlayWallPluginPlayoutLog/src/main/java/de/tobias/playpad/plugin/playout/log/listener/PadPlayLogListener.java
@@ -13,6 +13,11 @@ import javafx.collections.ListChangeListener;
 
 public class PadPlayLogListener implements PadListener {
 
+	@Override
+	public void onNameChanged(Pad pad, String oldValue, String newValue) {
+		// Nothing to implement
+	}
+
 	@Override
 	public void onStatusChange(Pad pad, PadStatus newValue) {
 		if (newValue == PadStatus.PLAY) {
diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala
index 376d97de..9953f386 100644
--- a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala
+++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/WebApiPlugin.scala
@@ -15,7 +15,7 @@ import de.tobias.playpad.plugin.api.WebApiPlugin.connectToRemoteInstances
 import de.tobias.playpad.plugin.api.client.WebApiRemoteConnectionStateListener
 import de.tobias.playpad.plugin.api.settings.{WebApiRemoteSettings, WebApiSettings, WebApiSettingsViewController}
 import de.tobias.playpad.plugin.api.websocket.WebSocketHandler
-import de.tobias.playpad.plugin.api.websocket.listener.{PadStatusListener, ProjectListener}
+import de.tobias.playpad.plugin.api.websocket.listener.{PadApiListener, ProjectListener}
 import de.tobias.playpad.plugin.{Module, PlayPadPluginStub}
 import javafx.application.Platform
 import javafx.collections.{FXCollections, ObservableMap}
@@ -36,7 +36,7 @@ class WebApiPlugin extends PlayPadPluginStub with PluginArtifact {
 		module = new Module(descriptor.getName, descriptor.getArtifactId)
 		Localization.addResourceBundle("plugin/webapi/lang/base", getClass.getClassLoader)
 
-		PlayPadPlugin.getInstance().addPadListener(new PadStatusListener)
+		PlayPadPlugin.getInstance().addPadListener(new PadApiListener)
 		PlayPadPlugin.getInstance().addGlobalListener(new ProjectListener)
 
 		Logger.debug("Enable Web API Plugin")
diff --git a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadApiListener.scala
similarity index 58%
rename from PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala
rename to PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadApiListener.scala
index ffd31cb4..efa8bfea 100644
--- a/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadStatusListener.scala
+++ b/PlayWallPlugins/PlayWallPluginWebAPI/src/main/scala/de/tobias/playpad/plugin/api/websocket/listener/PadApiListener.scala
@@ -5,7 +5,17 @@ import de.tobias.playpad.pad.{Pad, PadStatus}
 import de.tobias.playpad.plugin.PadListener
 import de.tobias.playpad.plugin.api.websocket.WebSocketHandler
 
-class PadStatusListener extends PadListener {
+class PadApiListener extends PadListener {
+
+	override def onNameChanged(pad: Pad, oldValue: String, newValue: String): Unit = {
+		val payload = new JsonObject
+
+		payload.addProperty("pad", pad.getUuid.toString)
+		payload.addProperty("oldValue", oldValue)
+		payload.addProperty("newValue", newValue)
+
+		WebSocketHandler.instance.sendUpdate("pad-name-changed", payload)
+	}
 
 	override def onStatusChange(pad: Pad, newValue: PadStatus): Unit = {
 		val payload = new JsonObject
-- 
GitLab