From c9d6b7edb064651de0797e17e07daae42b07d817 Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Thu, 9 Dec 2021 22:33:21 +0100 Subject: [PATCH] #183 - Add new trigger point: PLAYLIST_NEXT --- .../src/main/resources/lang/_de.properties | 1 + .../main/java/de/tobias/playpad/pad/Pad.java | 14 +++++++++ .../playpad/pad/content/PlaylistListener.java | 8 +++++ .../playpad/pad/content/Playlistable.java | 4 +++ .../listener/PadStatusControlListener.java | 2 +- .../trigger/PadTriggerContentListener.java | 11 ++++++- .../trigger/PadTriggerPlaylistListener.java | 30 +++++++++++++++++++ .../de/tobias/playpad/tigger/Trigger.java | 2 ++ .../tobias/playpad/tigger/TriggerPoint.java | 3 +- .../pad/ContentPlayerMediaContainer.scala | 5 ++-- .../content/pad/ContentPlayerPadContent.scala | 15 ++++++++-- .../playpad/plugin/content/util/package.scala | 2 +- 12 files changed, 88 insertions(+), 9 deletions(-) create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PlaylistListener.java create mode 100644 PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerPlaylistListener.java diff --git a/PlayWall/src/main/resources/lang/_de.properties b/PlayWall/src/main/resources/lang/_de.properties index 36d62169..89375f4c 100755 --- a/PlayWall/src/main/resources/lang/_de.properties +++ b/PlayWall/src/main/resources/lang/_de.properties @@ -215,6 +215,7 @@ Trigger.Volume.Name=Lautst\u00E4rke TriggerPoint.START=Start TriggerPoint.STOP=Stop TriggerPoint.EOF=Ende +TriggerPoint.PLAYLIST_NEXT=Playlist Next # Drag and Drop Mode DnDMode.Replace=Ersetzen 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 8125b058..833e52be 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/Pad.java @@ -4,6 +4,7 @@ import de.thecodelabs.utils.io.PathUtils; import de.tobias.playpad.PlayPadPlugin; import de.tobias.playpad.pad.content.PadContent; import de.tobias.playpad.pad.content.PadContentFactory; +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; @@ -11,6 +12,7 @@ import de.tobias.playpad.pad.listener.PadStatusControlListener; import de.tobias.playpad.pad.listener.PadStatusNotFoundListener; import de.tobias.playpad.pad.listener.trigger.PadTriggerContentListener; import de.tobias.playpad.pad.listener.trigger.PadTriggerDurationListener; +import de.tobias.playpad.pad.listener.trigger.PadTriggerPlaylistListener; import de.tobias.playpad.pad.listener.trigger.PadTriggerStatusListener; import de.tobias.playpad.pad.mediapath.MediaPath; import de.tobias.playpad.pad.viewcontroller.AbstractPadViewController; @@ -74,6 +76,7 @@ public class Pad implements IPad { private transient PadTriggerStatusListener padTriggerStatusListener; private transient PadTriggerDurationListener padTriggerDurationListener; private transient PadTriggerContentListener padTriggerContentListener; + private transient PadTriggerPlaylistListener padTriggerPlaylistListener; private transient boolean ignoreTrigger = false; // Utils @@ -128,6 +131,11 @@ public class Pad implements IPad { contentProperty.removeListener(padTriggerContentListener); padTriggerContentListener.changed(contentProperty, getContent(), null); } + if (padTriggerPlaylistListener != null && contentProperty != null) { + if (getContent() instanceof Playlistable) { + ((Playlistable) getContent()).removePlaylistListener(padTriggerPlaylistListener); + } + } if (padFadeDurationListener != null && contentProperty != null) { contentProperty.removeListener(padFadeContentListener); @@ -161,6 +169,8 @@ public class Pad implements IPad { contentProperty.addListener(padTriggerContentListener); padTriggerContentListener.changed(contentProperty, null, getContent()); + padTriggerPlaylistListener = new PadTriggerPlaylistListener(); + // Pad Listener if (mediaPathUpdateListener != null) { mediaPaths.removeListener(mediaPathUpdateListener); @@ -610,6 +620,10 @@ public class Pad implements IPad { return padTriggerDurationListener; } + public PadTriggerPlaylistListener getPadTriggerPlaylistListener() { + return padTriggerPlaylistListener; + } + public PadFadeDurationListener getPadFadeDurationListener() { return padFadeDurationListener; } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PlaylistListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PlaylistListener.java new file mode 100644 index 00000000..1402fe7a --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/PlaylistListener.java @@ -0,0 +1,8 @@ +package de.tobias.playpad.pad.content; + +import de.tobias.playpad.pad.Pad; + +public interface PlaylistListener { + + void onNextItem(Pad pad, int next, int total); +} diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/Playlistable.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/Playlistable.java index aab735bc..b4b60ea6 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/Playlistable.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/content/Playlistable.java @@ -17,4 +17,8 @@ public interface Playlistable { void next(); boolean isLoaded(MediaPath mediaPath); + + void addPlaylistListener(PlaylistListener listener); + + void removePlaylistListener(PlaylistListener listener); } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java index 3c6b86d4..a791354a 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/PadStatusControlListener.java @@ -17,7 +17,7 @@ import javafx.util.Duration; public class PadStatusControlListener implements ChangeListener<PadStatus> { - private Pad pad; + private final Pad pad; // Utils für Single Pad Playing private static Pad currentPlayingPad; // Nur wenn ProfileSettings.isMultiplePlayer == false diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerContentListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerContentListener.java index 09d08d49..ae9789f2 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerContentListener.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerContentListener.java @@ -2,6 +2,7 @@ package de.tobias.playpad.pad.listener.trigger; import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.content.PadContent; +import de.tobias.playpad.pad.content.Playlistable; import de.tobias.playpad.pad.content.play.Durationable; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; @@ -9,7 +10,7 @@ import javafx.beans.value.ObservableValue; // Fügt Time Listener hinzu für neuen Content public class PadTriggerContentListener implements ChangeListener<PadContent> { - private Pad pad; + private final Pad pad; public PadTriggerContentListener(Pad pad) { this.pad = pad; @@ -21,12 +22,20 @@ public class PadTriggerContentListener implements ChangeListener<PadContent> { if (oldValue instanceof Durationable) { ((Durationable) oldValue).positionProperty().removeListener(pad.getPadTriggerDurationListener()); } + + if (oldValue instanceof Playlistable) { + ((Playlistable) oldValue).removePlaylistListener(pad.getPadTriggerPlaylistListener()); + } } if (newValue != null) { if (newValue instanceof Durationable) { ((Durationable) newValue).positionProperty().addListener(pad.getPadTriggerDurationListener()); } + + if (newValue instanceof Playlistable) { + ((Playlistable) newValue).addPlaylistListener(pad.getPadTriggerPlaylistListener()); + } } } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerPlaylistListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerPlaylistListener.java new file mode 100644 index 00000000..eec30a0f --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/listener/trigger/PadTriggerPlaylistListener.java @@ -0,0 +1,30 @@ +package de.tobias.playpad.pad.listener.trigger; + +import de.tobias.playpad.PlayPadPlugin; +import de.tobias.playpad.pad.Pad; +import de.tobias.playpad.pad.PadSettings; +import de.tobias.playpad.pad.content.PlaylistListener; +import de.tobias.playpad.profile.Profile; +import de.tobias.playpad.tigger.Trigger; +import de.tobias.playpad.tigger.TriggerPoint; +import de.tobias.playpad.viewcontroller.main.IMainViewController; +import javafx.util.Duration; + +public class PadTriggerPlaylistListener implements PlaylistListener { + @Override + public void onNextItem(Pad pad, int next, int total) { + if (!pad.isIgnoreTrigger()) { + PadSettings padSettings = pad.getPadSettings(); + executeTrigger(pad, padSettings.getTriggers().get(TriggerPoint.PLAYLIST_NEXT)); + } else { + pad.setIgnoreTrigger(false); + } + } + + private void executeTrigger(Pad pad, Trigger trigger) { + IMainViewController mainViewController = PlayPadPlugin.getInstance().getMainViewController(); + Profile currentProfile = Profile.currentProfile(); + + trigger.handle(pad, Duration.ZERO, pad.getProject(), mainViewController, currentProfile); + } +} 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 39ece8a9..f6d5fda7 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/Trigger.java @@ -118,6 +118,8 @@ public class Trigger { } else { handleEndPoint(pad, currentDuration, project, mainViewController, currentProfile, item); } + } else if (triggerPoint == TriggerPoint.PLAYLIST_NEXT) { + item.performAction(pad, project, mainViewController, currentProfile); } } } 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 ce08ec84..175f1517 100644 --- a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java +++ b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/TriggerPoint.java @@ -4,7 +4,8 @@ public enum TriggerPoint { START(true), STOP(false), - EOF(true); + EOF(true), + PLAYLIST_NEXT(false); /** * Defines if a trigger can be run after, before a certain event. diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerMediaContainer.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerMediaContainer.scala index 93d34c1c..7ee826dc 100644 --- a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerMediaContainer.scala +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerMediaContainer.scala @@ -49,15 +49,16 @@ class ContentPlayerMediaContainer(val content: ContentPlayerPadContent, private[ } def next(): Unit = { - stop() - val players = content.getMediaContainers val currentIndex = players.indexOf(this) content.currentPlayingMediaIndexProperty().set(currentIndex) + if (currentIndex + 1 < players.length) { + content.listeners.forEach(listener => listener.onNextItem(content.pad, currentIndex + 1, players.length)) players(currentIndex + 1).play(false) } else if (content.getPad.getPadSettings.isLoop) { + content.listeners.forEach(listener => listener.onNextItem(content.pad, 0, players.length)) players.head.play(false) } else { content.getPad.setStatus(PadStatus.STOP) diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContent.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContent.scala index f18c5b62..94524b4c 100644 --- a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContent.scala +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContent.scala @@ -1,8 +1,7 @@ package de.tobias.playpad.plugin.content.pad -import de.thecodelabs.logger.Logger import de.tobias.playpad.pad.content.play.{Durationable, Pauseable} -import de.tobias.playpad.pad.content.{PadContent, Playlistable} +import de.tobias.playpad.pad.content.{PadContent, PlaylistListener, Playlistable} import de.tobias.playpad.pad.fade.{Fadeable, LinearFadeController} import de.tobias.playpad.pad.mediapath.MediaPath import de.tobias.playpad.pad.{Pad, PadStatus} @@ -20,8 +19,8 @@ import nativecontentplayerwindows.ContentPlayer import java.nio.file.Files import java.util -import java.util.{Collections, UUID} import java.util.stream.Collectors +import java.util.{Collections, UUID} import scala.jdk.CollectionConverters._ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadContent(pad) with Pauseable with Durationable with Playlistable with Fadeable { @@ -32,6 +31,8 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte private[content] val _durationProperty = new SimpleObjectProperty[Duration] private[content] val _positionProperty = new SimpleObjectProperty[Duration] + private[content] val listeners: util.Set[PlaylistListener] = new util.HashSet[PlaylistListener]() + private var showingLastFrame: Boolean = false private var isPause: Boolean = false @@ -315,4 +316,12 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte ).asInstanceOf[util.List[UUID]] zoneConfiguration.zones.asScala.filter(zone => selectedZoneIds.contains(zone.id)).toSeq } + + /* + Listener + */ + + override def addPlaylistListener(listener: PlaylistListener): Unit = listeners.add(listener) + + override def removePlaylistListener(listener: PlaylistListener): Unit = listeners.remove(listener) } diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/util/package.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/util/package.scala index a03e9ed9..14526479 100644 --- a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/util/package.scala +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/util/package.scala @@ -17,7 +17,7 @@ package object util { def apply(index: Int): E = list.get(index) - def length: Long = list.size() + def length: Int = list.size() def isNotEmpty: Boolean = !list.isEmpty -- GitLab