From 31450f2c292e7e8224ab6a5da3bf400769ec7a62 Mon Sep 17 00:00:00 2001 From: tobias <thinkdifferent055@gmail.com> Date: Sun, 29 Nov 2020 11:58:42 +0100 Subject: [PATCH] Show current playing playlist item in pad --- .../content/pad/ContentPlayerPadContent.scala | 35 ++++----- .../pad/ContentPlayerPadContentFactory.scala | 3 +- .../content/pad/ContentPlayerPadPreview.scala | 71 +++++++++++++++++++ 3 files changed, 91 insertions(+), 18 deletions(-) create mode 100644 PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadPreview.scala 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 a637ae6d..8c0fe4bc 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 @@ -11,7 +11,7 @@ import de.tobias.playpad.plugin.content.ContentPluginMain import de.tobias.playpad.plugin.content.settings.PlayerInstance import de.tobias.playpad.volume.VolumeManager import javafx.application.Platform -import javafx.beans.property.{ReadOnlyObjectProperty, SimpleObjectProperty} +import javafx.beans.property._ import javafx.scene.media.{Media, MediaPlayer} import javafx.util.Duration @@ -24,13 +24,12 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte def play(): Unit = { _durationProperty.bind(mediaPlayer.totalDurationProperty()) _positionProperty.bind(mediaPlayer.currentTimeProperty()) - - mediaPlayer.seek(Duration.ZERO) - ContentPluginMain.playerViewController.showMediaPlayer(getPad.getPadIndex, mediaPlayer, getSelectedZones) + mediaPlayer.seek(Duration.ZERO) mediaPlayer.play() - currentRunningIndex = mediaPlayers.indexOf(this) + + currentRunningIndexProperty.set(mediaPlayers.indexOf(this)) val controller = getPad.getController if (controller != null) { @@ -49,9 +48,11 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte def next(): Unit = { stop() - currentRunningIndex = mediaPlayers.indexOf(this) - if (currentRunningIndex + 1 < mediaPlayers.length) { - mediaPlayers(currentRunningIndex + 1).play() + val index = mediaPlayers.indexOf(this) + currentRunningIndexProperty.set(index) + + if (index + 1 < mediaPlayers.length) { + mediaPlayers(index + 1).play() } else if (getPad.getPadSettings.isLoop) { mediaPlayers.head.play() } else { @@ -73,7 +74,7 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte } private var mediaPlayers: ListBuffer[MediaPlayerContainer] = ListBuffer.empty - private var currentRunningIndex: Int = -1 + private val currentRunningIndexProperty: IntegerProperty = new SimpleIntegerProperty(-1) private val _durationProperty = new SimpleObjectProperty[Duration] private val _positionProperty = new SimpleObjectProperty[Duration] @@ -83,11 +84,13 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte override def getType: String = `type` - override def currentPlayingMediaIndex(): Int = currentRunningIndex + override def currentPlayingMediaIndex: Int = currentRunningIndexProperty.get() + + def currentPlayingMediaIndexProperty(): ReadOnlyIntegerProperty = currentRunningIndexProperty override def play(): Unit = { if (isPause) { - mediaPlayers(currentRunningIndex).resume() + mediaPlayers(currentPlayingMediaIndex).resume() } else { ContentPluginMain.playerViewController.addActivePadToList(getPad.getPadIndex) @@ -100,17 +103,17 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte override def pause(): Unit = { isPause = true - mediaPlayers(currentRunningIndex).pause() + mediaPlayers(currentPlayingMediaIndex).pause() } override def next(): Unit = { - mediaPlayers(currentRunningIndex).next() + mediaPlayers(currentPlayingMediaIndex).next() } override def stop(): Boolean = { isPause = false - mediaPlayers(currentRunningIndex).stop() - currentRunningIndex = -1 + mediaPlayers(currentPlayingMediaIndex).stop() + currentRunningIndexProperty.set(-1) ContentPluginMain.playerViewController.removeActivePadFromList(getPad.getPadIndex) @@ -132,7 +135,7 @@ class ContentPlayerPadContent(val pad: Pad, val `type`: String) extends PadConte showingLastFrame = false if (getPad.isEof) { - mediaPlayers(currentRunningIndex).next() + mediaPlayers(currentPlayingMediaIndex).next() return } diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala index 2842c0fe..774ac584 100644 --- a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadContentFactory.scala @@ -3,7 +3,6 @@ package de.tobias.playpad.plugin.content.pad import de.thecodelabs.utils.ui.icon.{FontIcon, MaterialDesignIcon} import de.tobias.playpad.pad.Pad import de.tobias.playpad.pad.content.{PadContent, PadContentFactory} -import de.tobias.playpad.pad.preview.PadTextPreview import de.tobias.playpad.pad.view.IPadContentView import de.tobias.playpad.viewcontroller.PadSettingsTabViewController import javafx.scene.Node @@ -13,7 +12,7 @@ class ContentPlayerPadContentFactory(val `type`: String) extends PadContentFacto override def newInstance(pad: Pad): PadContent = new ContentPlayerPadContent(pad, getType) - override def getPadContentPreview(pad: Pad, parentNode: Pane): IPadContentView = new PadTextPreview(pad, parentNode) + override def getPadContentPreview(pad: Pad, parentNode: Pane): IPadContentView = new ContentPlayerPadPreview(pad, parentNode) override def getSettingsViewController(pad: Pad): PadSettingsTabViewController = new ContentPlayerPadContentSettingsViewController(pad) diff --git a/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadPreview.scala b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadPreview.scala new file mode 100644 index 00000000..747e237b --- /dev/null +++ b/PlayWallPlugins/PlayWallPluginContentPlayer/src/main/scala/de/tobias/playpad/plugin/content/pad/ContentPlayerPadPreview.scala @@ -0,0 +1,71 @@ +package de.tobias.playpad.plugin.content.pad + +import de.tobias.playpad.pad.Pad +import de.tobias.playpad.pad.view.IPadContentView +import javafx.beans.binding.Bindings +import javafx.collections.ListChangeListener +import javafx.geometry.{Insets, Pos} +import javafx.scene.Node +import javafx.scene.control.Label +import javafx.scene.layout.{Pane, Priority, VBox} +import javafx.scene.text.TextAlignment + +class ContentPlayerPadPreview(pad: Pad, parent: Pane) extends VBox with IPadContentView { + + val nameLabel: Label = new Label() + val subTitleLabel: Label = new Label() + + setupLabel(nameLabel) + setupLabel(subTitleLabel) + + getChildren.addAll(nameLabel, subTitleLabel) + setSpacing(3) + setPadding(new Insets(7)) + + getStyleClass.addListener(new ListChangeListener[String] { + override def onChanged(c: ListChangeListener.Change[_ <: String]): Unit = { + while (c.next()) { + if (c.wasRemoved()) { + nameLabel.getStyleClass.removeAll(c.getRemoved) + subTitleLabel.getStyleClass.removeAll(c.getRemoved) + } + + if (c.wasAdded()) { + nameLabel.getStyleClass.addAll(c.getAddedSubList) + subTitleLabel.getStyleClass.addAll(c.getAddedSubList) + } + } + } + }) + + nameLabel.textProperty.bind(pad.nameProperty) + pad.getContent match { + case content: ContentPlayerPadContent => + subTitleLabel.textProperty().bind(Bindings.createStringBinding(() => { + if (content.currentPlayingMediaIndex < 0) { + "" + } else { + pad.getPaths.get(content.currentPlayingMediaIndex).getFileName + } + }, content.currentPlayingMediaIndexProperty())) + case _ => + } + + private def setupLabel(label: Label): Unit = { + label.setWrapText(true) + label.setAlignment(Pos.CENTER) + label.setTextAlignment(TextAlignment.CENTER) + + label.prefWidthProperty.bind(parent.widthProperty) + label.setMaxHeight(Double.MaxValue) + + VBox.setVgrow(label, Priority.ALWAYS) + } + + override def getNode: Node = this + + override def deInit(): Unit = { + nameLabel.textProperty().unbind() + subTitleLabel.textProperty().unbind() + } +} -- GitLab