From 79cde4cfbda7b6046638f6301884cbe2526fcdda Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Mon, 14 Dec 2020 20:16:03 +0100
Subject: [PATCH] Add new trigger point: 'EOF_STATE'

---
 .../src/main/resources/lang/_de.properties    |  5 ++++-
 .../trigger/PadTriggerDurationListener.java   | 14 +++++++-------
 .../trigger/PadTriggerStatusListener.java     |  8 ++++----
 .../de/tobias/playpad/tigger/Trigger.java     | 14 ++++++++------
 .../tobias/playpad/tigger/TriggerPoint.java   | 19 ++++++++++++++++---
 5 files changed, 39 insertions(+), 21 deletions(-)

diff --git a/PlayWall/src/main/resources/lang/_de.properties b/PlayWall/src/main/resources/lang/_de.properties
index 991f9855..33029a52 100755
--- a/PlayWall/src/main/resources/lang/_de.properties
+++ b/PlayWall/src/main/resources/lang/_de.properties
@@ -209,10 +209,13 @@ UI.Window.Settings.Updates.CurrentVersion={} (Build {})
 TriggerPoint.toString={} ({})
 Trigger.Cart.Name=Kacheln
 Trigger.Volume.Name=Lautst\u00E4rke
+
 # TriggerPoint - Enum
 TriggerPoint.START=Start
 TriggerPoint.STOP=Stop
-TriggerPoint.EOF=Ende (EoF)
+TriggerPoint.EOF=Ende
+TriggerPoint.EOF_STATE=Ende (EoF)
+
 # Drag and Drop Mode
 DnDMode.Replace=Ersetzen
 DnDMode.Duplicate=Duplizieren
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerDurationListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerDurationListener.java
index 5ed71ddb..83412167 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerDurationListener.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerDurationListener.java
@@ -22,22 +22,22 @@ public class PadTriggerDurationListener implements ChangeListener<Duration> {
 	}
 
 	@Override
-	public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration newValue) {
+	public void changed(ObservableValue<? extends Duration> observable, Duration oldValue, Duration currentTime) {
 		PadContent content = pad.getContent();
 		if (content instanceof Durationable) {
 			Duration totalDuration = ((Durationable) content).getDuration();
 			if (totalDuration != null) {
-				Duration leftTime = totalDuration.subtract(newValue);
-
 				IMainViewController mainViewController = PlayPadPlugin.getInstance().getMainViewController();
 				Profile currentProfile = Profile.currentProfile();
 				PadSettings padSettings = pad.getPadSettings();
 
-				// Execute Triggers
-				Trigger startTrigger = padSettings.getTrigger(TriggerPoint.START);
-				startTrigger.handle(pad, newValue, pad.getProject(), mainViewController, currentProfile);
+				// Execute Start Triggers
+				final Trigger startTrigger = padSettings.getTrigger(TriggerPoint.START);
+				startTrigger.handle(pad, currentTime, pad.getProject(), mainViewController, currentProfile);
 
-				Trigger endTrigger = padSettings.getTrigger(TriggerPoint.EOF);
+				// Execute End Trigger
+				final Duration leftTime = totalDuration.subtract(currentTime);
+				final Trigger endTrigger = padSettings.getTrigger(TriggerPoint.EOF);
 				endTrigger.handle(pad, leftTime, pad.getProject(), mainViewController, currentProfile);
 			}
 		}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerStatusListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerStatusListener.java
index f7edfbdf..94459f05 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerStatusListener.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerStatusListener.java
@@ -26,12 +26,12 @@ public class PadTriggerStatusListener implements ChangeListener<PadStatus> {
 			PadSettings padSettings = pad.getPadSettings();
 
 			// Execute Trigger
-			if (newValue == PadStatus.PLAY) { // TRIGGER FÜR START
+			if (newValue == PadStatus.PLAY) {
 				executeTrigger(padSettings.getTriggers().get(TriggerPoint.START));
-			} else if (newValue == PadStatus.STOP) { // TRIGGER FÜR STOP
+			} else if (newValue == PadStatus.STOP) {
 				executeTrigger(padSettings.getTriggers().get(TriggerPoint.STOP));
-			} else if (oldValue == PadStatus.PLAY && newValue == PadStatus.READY && pad.isEof()) { // TRIGGER FÜR EOF
-				executeTrigger(padSettings.getTriggers().get(TriggerPoint.EOF));
+			} else if (oldValue == PadStatus.PLAY && newValue == PadStatus.READY && pad.isEof()) {
+				executeTrigger(padSettings.getTriggers().get(TriggerPoint.EOF_STATE));
 			}
 		} else {
 			pad.setIgnoreTrigger(false);
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java
index fcfb8301..ba284a16 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java
@@ -104,20 +104,22 @@ public class Trigger {
 		return triggerPoint.name() + " (" + items.size() + ")";
 	}
 
-	public void handle(Pad pad, Duration duration, Project project, IMainViewController mainViewController, Profile currentProfile) {
+	public void handle(Pad pad, Duration currentDuration, Project project, IMainViewController mainViewController, Profile currentProfile) {
 		for (TriggerItem item : items) {
 			if (triggerPoint == TriggerPoint.START) {
-				handleStartPoint(pad, duration, project, mainViewController, currentProfile, item);
+				handleStartPoint(pad, currentDuration, project, mainViewController, currentProfile, item);
 			} else if (triggerPoint == TriggerPoint.STOP) {
-				handleEndPoint(pad, duration, project, mainViewController, currentProfile, item);
+				handleEndPoint(pad, currentDuration, project, mainViewController, currentProfile, item);
 			} else if (triggerPoint == TriggerPoint.EOF) {
-				handleEndPoint(pad, duration, project, mainViewController, currentProfile, item);
+				handleEndPoint(pad, currentDuration, project, mainViewController, currentProfile, item);
+			} else if (triggerPoint == TriggerPoint.EOF_STATE) {
+				item.performAction(pad, project, mainViewController, currentProfile);
 			}
 		}
 	}
 
 	private void handleEndPoint(Pad pad, Duration duration, Project project, IMainViewController mainViewController, Profile currentProfile, TriggerItem item) {
-		// Wenn Trigger noch nicht gespiel wurde (null) und Zeit größer ist als gesetzte Zeit (oder 0)
+		// Wenn Trigger noch nicht gespielt wurde (null) und Zeit größer ist als gesetzte Zeit (oder 0)
 		if (item.getPerformedAt() == null && (item.getDurationFromPoint().greaterThan(duration) || duration.equals(Duration.ZERO))) {
 			item.performAction(pad, project, mainViewController, currentProfile);
 			item.setPerformedAt(duration);
@@ -128,7 +130,7 @@ public class Trigger {
 
 	private void handleStartPoint(Pad pad, Duration duration, Project project, IMainViewController mainViewController, Profile currentProfile, TriggerItem item) {
 		if (pad.getStatus() == PadStatus.PLAY) {
-			// Mitten drin, wenn die Zeit die gespiel wurde größer ist als die gesetzte und noch der Trigger noch nicht ausgeführt
+			// Mitten drin, wenn die Zeit die gespielt wurde größer ist als die gesetzte und noch der Trigger noch nicht ausgeführt
 			// wurde (null)
 			if ((item.getPerformedAt() == null && item.getDurationFromPoint().lessThan(duration))
 					// Wenn der Trigger am Anfang ist
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java
index c25fb939..4f1390d9 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java
@@ -2,8 +2,21 @@ package de.tobias.playpad.tigger;
 
 public enum TriggerPoint {
 
-	START,
-	STOP,
-	EOF
+	START(true),
+	STOP(false),
+	EOF(true),
+	EOF_STATE(false);
 
+	/**
+	 * Defines if a trigger can be run after, before a certain event.
+	 */
+	private final boolean timeAppendable;
+
+	TriggerPoint(boolean timeAppendable) {
+		this.timeAppendable = timeAppendable;
+	}
+
+	public boolean isTimeAppendable() {
+		return timeAppendable;
+	}
 }
-- 
GitLab