diff --git a/PlayWall/src/main/java/de/tobias/playpad/trigger/CartTriggerItem.java b/PlayWall/src/main/java/de/tobias/playpad/trigger/CartTriggerItem.java index 96018fd9e44d571a9841cf184de8cbcdf98db73d..07c7b4ddae9458ad11c1c11ed38a32a72951fb23 100644 --- a/PlayWall/src/main/java/de/tobias/playpad/trigger/CartTriggerItem.java +++ b/PlayWall/src/main/java/de/tobias/playpad/trigger/CartTriggerItem.java @@ -5,6 +5,7 @@ import de.tobias.playpad.pad.Pad; import de.tobias.playpad.pad.PadStatus; import de.tobias.playpad.profile.Profile; import de.tobias.playpad.project.Project; +import de.tobias.playpad.tigger.LocalPadTrigger; import de.tobias.playpad.tigger.TriggerItem; import de.tobias.playpad.viewcontroller.main.IMainViewController; import org.dom4j.Element; @@ -12,7 +13,7 @@ import org.dom4j.Element; import java.util.List; import java.util.UUID; -public class CartTriggerItem extends TriggerItem { +public class CartTriggerItem extends TriggerItem implements LocalPadTrigger { private List<UUID> uuids; private boolean allCarts; @@ -27,6 +28,7 @@ public class CartTriggerItem extends TriggerItem { this.uuids = new UniqList<>(); } + @Override public List<UUID> getCarts() { return uuids; } diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/tigger/LocalPadTrigger.java b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/LocalPadTrigger.java new file mode 100644 index 0000000000000000000000000000000000000000..ab4668911416d81f86e9b3726a43f19a4b57745e --- /dev/null +++ b/PlayWallCore/src/main/java/de/tobias/playpad/tigger/LocalPadTrigger.java @@ -0,0 +1,8 @@ +package de.tobias.playpad.tigger; + +import java.util.List; +import java.util.UUID; + +public interface LocalPadTrigger { + List<UUID> getCarts(); +} 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 63002be0cebe88bca6874645b2334101ce41b590..e524e428994f4150d9f6873461cf6bce10dbbf74 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 @@ -37,7 +37,7 @@ class ContentPlayerMediaContainer(val content: ContentPlayerPadContent, private[ ContentPluginMain.playerViewController.play(this, withFadeIn) content.getPad.setEof(false) - content.currentPlayingMediaIndexProperty().set(content.getMediaPlayers.indexOf(this)) + content.currentPlayingMediaIndexProperty().set(content.getMediaContainers.indexOf(this)) } def resume(withFadeIn: Boolean): Unit = { @@ -51,12 +51,12 @@ class ContentPlayerMediaContainer(val content: ContentPlayerPadContent, private[ def next(): Unit = { stop() - val players = content.getMediaPlayers - val index = players.indexOf(this) - content.currentPlayingMediaIndexProperty().set(index) + val players = content.getMediaContainers + val currentIndex = players.indexOf(this) + content.currentPlayingMediaIndexProperty().set(currentIndex) - if (index + 1 < players.length) { - players(index + 1).play(false) + if (currentIndex + 1 < players.length) { + players(currentIndex + 1).play(false) } else if (content.getPad.getPadSettings.isLoop) { players.head.play(false) } else { 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 215e2d236d725b293a36adf8626b677882f99be5..07ef1279d32a42c9ef7a7a05e90bb8ceefef4a81 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 @@ -10,6 +10,7 @@ import de.tobias.playpad.plugin.content.ContentPluginMain import de.tobias.playpad.plugin.content.settings.{ContentPlayerPluginConfiguration, Zone} import de.tobias.playpad.plugin.content.util._ import de.tobias.playpad.profile.Profile +import de.tobias.playpad.tigger.{LocalPadTrigger, TriggerPoint} import javafx.application.Platform import javafx.beans.binding.{Bindings, ObjectBinding} import javafx.beans.property._ @@ -48,7 +49,7 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte override def currentPlayingMediaIndexProperty(): IntegerProperty = currentRunningIndexProperty - def getMediaPlayers: ObservableList[ContentPlayerMediaContainer] = mediaPlayers + def getMediaContainers: ObservableList[ContentPlayerMediaContainer] = mediaPlayers override def hasNext: Boolean = getCurrentPlayingMediaIndex + 1 < mediaPlayers.length @@ -92,25 +93,42 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte } def onEof(): Unit = { + val hasLocalPadTrigger = getPad.getPadSettings.getTrigger(TriggerPoint.EOF) + .getItems + .stream() + .filter(item => item.isInstanceOf[LocalPadTrigger]) + .map(item => item.asInstanceOf[LocalPadTrigger]) + .filter(item => hasPadTriggerInterferingZones(item)) + .count() > 0 + + val noFurtherItemsInPlaylist = getCurrentPlayingMediaIndex + 1 == mediaPlayers.length + // By default the last frame will be displayed. Only under certain conditions the last frame will be cleared // 1. User settings set to "Clear last frame" // 2. There is no loop // 3. There is no playlist - if (!pad.getPadSettings.isLoop && getCurrentPlayingMediaIndex + 1 == mediaPlayers.length) { - if (!shouldShowLastFrame()) { - ContentPluginMain.playerViewController.clearHold(mediaPlayers(getCurrentPlayingMediaIndex)) - } else { + if (!pad.getPadSettings.isLoop && noFurtherItemsInPlaylist) { + if (shouldShowLastFrame() || hasLocalPadTrigger) { showingLastFrame = true return + } else { + ContentPluginMain.playerViewController.clearHold(mediaPlayers(getCurrentPlayingMediaIndex)) } } showingLastFrame = false + mediaPlayers(getCurrentPlayingMediaIndex).next() + } - if (getPad.isEof) { - mediaPlayers(getCurrentPlayingMediaIndex).next() - return - } + private def hasPadTriggerInterferingZones(item: LocalPadTrigger): Boolean = { + item.getCarts.stream().anyMatch(id => { + val content = pad.getProject.getPad(id).getContent + if (!content.isInstanceOf[ContentPlayerPadContent]) { + return false + } + val targetZones = content.asInstanceOf[ContentPlayerPadContent].getSelectedZones + return targetZones.exists(zone => getSelectedZones.contains(zone)) + }) } /*