From 043623d61438c83d877ea787925558e4a79a514d Mon Sep 17 00:00:00 2001
From: tobias <thinkdifferent055@gmail.com>
Date: Sun, 1 Oct 2023 16:16:03 +0200
Subject: [PATCH] #190 - Add option to mark a pad as "play overlay" to exclude
 this pad from the "one-pad-mode" play restriction

---
 .../option/pad/PlayerPadTabViewController.java   |  6 ++++++
 .../src/main/resources/lang/ui_de.properties     |  2 ++
 .../resources/view/option/pad/PlayerTab.fxml     | 16 ++++++++++++++++
 .../java/de/tobias/playpad/pad/PadSettings.java  | 14 ++++++++++++++
 .../playpad/pad/PadSettingsSerializer.java       |  4 ++++
 .../pad/listener/PadStatusControlListener.java   |  3 ++-
 6 files changed, 44 insertions(+), 1 deletion(-)

diff --git a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/pad/PlayerPadTabViewController.java b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/pad/PlayerPadTabViewController.java
index 11d394f6..ed283f8d 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/pad/PlayerPadTabViewController.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/viewcontroller/option/pad/PlayerPadTabViewController.java
@@ -17,6 +17,8 @@ import javafx.util.Duration;
 
 public class PlayerPadTabViewController extends PadSettingsTabViewController {
 
+	@FXML
+	private CheckBox playOverlayEnableCheckBox;
 	@FXML
 	private CheckBox customFadeCheckBox;
 	@FXML
@@ -48,6 +50,8 @@ public class PlayerPadTabViewController extends PadSettingsTabViewController {
 		warningFeedbackViewController = WarningFeedbackViewController.newViewControllerForPad();
 		warningFeedbackContainer.getChildren().add(warningFeedbackViewController.getParent());
 
+		playOverlayEnableCheckBox.selectedProperty().addListener((observable, oldValue, newValue) -> pad.getPadSettings().setPlayOverlay(newValue));
+
 		customFadeCheckBox.selectedProperty().addListener((a, b, c) ->
 		{
 			fadeContainer.setDisable(!c);
@@ -103,6 +107,8 @@ public class PlayerPadTabViewController extends PadSettingsTabViewController {
 	public void loadSettings(Pad pad) {
 		PadSettings padSettings = pad.getPadSettings();
 
+		playOverlayEnableCheckBox.setSelected(padSettings.isPlayOverlay());
+
 		if (padSettings.isCustomFade())
 			fadeViewController.setFadeSettings(padSettings.getFade());
 
diff --git a/PlayWall/src/main/resources/lang/ui_de.properties b/PlayWall/src/main/resources/lang/ui_de.properties
index d90e1e09..062aace8 100755
--- a/PlayWall/src/main/resources/lang/ui_de.properties
+++ b/PlayWall/src/main/resources/lang/ui_de.properties
@@ -132,6 +132,8 @@ padSettings.gen.label.timeDisplay=Zeitanzeige:
 padSettings.gen.checkbox.customSettings=Eigene Einstellungen
 padSettings.label.loop=Wiederholen:
 padSettings.button.finish=Fertig
+padSettings.player.label.playOverlay=Play Overlay:
+padSettings.player.label.playOverlay.description=Mit dieser Einstellung darf diese Kachel zus\u00E4tzlich zu einer bereits laufenden wiedergegeben werden, wenn der Modus "Mehrere Kacheln wiedergaben" deakitiviert ist.
 padSettings.player.label.warning=Warnhinweise:
 padSettings.player.label.cueIn=Intro Dauer (in s):
 padSettings.player.label.fade=Ein-/Ausblenden:
diff --git a/PlayWall/src/main/resources/view/option/pad/PlayerTab.fxml b/PlayWall/src/main/resources/view/option/pad/PlayerTab.fxml
index 9f5771e5..ec40e056 100644
--- a/PlayWall/src/main/resources/view/option/pad/PlayerTab.fxml
+++ b/PlayWall/src/main/resources/view/option/pad/PlayerTab.fxml
@@ -5,6 +5,22 @@
 <?import javafx.scene.layout.*?>
 <VBox spacing="14.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1">
     <children>
+        <VBox spacing="14.0">
+            <children>
+                <HBox layoutX="14.0" layoutY="139.0" spacing="14.0">
+                    <children>
+                        <Label alignment="CENTER_RIGHT" prefWidth="150.0" text="%padSettings.player.label.playOverlay" textAlignment="RIGHT" />
+                        <CheckBox fx:id="playOverlayEnableCheckBox" mnemonicParsing="false" text="%settings.checkbox.activate" />
+                    </children>
+                </HBox>
+            <Label text="%padSettings.player.label.playOverlay.description" wrapText="true">
+               <VBox.margin>
+                  <Insets left="164.0" />
+               </VBox.margin>
+            </Label>
+            </children>
+        </VBox>
+        <Separator prefWidth="200.0" />
         <VBox spacing="14.0">
             <children>
                 <HBox layoutX="14.0" layoutY="253.0" spacing="14.0">
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java
index f857d094..3b3d449b 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java
@@ -30,6 +30,7 @@ public class PadSettings {
 	private DoubleProperty volumeProperty = new SimpleDoubleProperty(1.0);
 	private DoubleProperty speedProperty = new SimpleDoubleProperty(1.0);
 	private BooleanProperty loopProperty = new SimpleBooleanProperty(false);
+	private BooleanProperty playOverlayProperty = new SimpleBooleanProperty(false);
 	private ObjectProperty<TimeMode> timeModeProperty = new SimpleObjectProperty<>();
 	private ObjectProperty<FadeSettings> fadeProperty = new SimpleObjectProperty<>();
 	private ObjectProperty<Duration> warningProperty = new SimpleObjectProperty<>();
@@ -100,6 +101,18 @@ public class PadSettings {
 		return loopProperty;
 	}
 
+	public boolean isPlayOverlay() {
+		return playOverlayProperty.get();
+	}
+
+	public void setPlayOverlay(boolean playOverlay) {
+		playOverlayProperty.set(playOverlay);
+	}
+
+	public BooleanProperty playOverlayProperty() {
+		return playOverlayProperty;
+	}
+
 	public boolean isCustomTimeMode() {
 		return timeModeProperty.isNotNull().get();
 	}
@@ -242,6 +255,7 @@ public class PadSettings {
 
 		clone.volumeProperty = new SimpleDoubleProperty(getVolume());
 		clone.loopProperty = new SimpleBooleanProperty(isLoop());
+		clone.playOverlayProperty = new SimpleBooleanProperty(isPlayOverlay());
 
 		if (isCustomTimeMode())
 			clone.timeModeProperty = new SimpleObjectProperty<>(getTimeMode());
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java
index fdaaff85..adf5c3e4 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java
@@ -21,6 +21,7 @@ public class PadSettingsSerializer {
 
 	private static final String VOLUME_ELEMENT = "Volume";
 	private static final String LOOP_ELEMENT = "Loop";
+	private static final String PLAY_OVERLAY_ELEMENT = "PlayOverlay";
 	private static final String TIME_MODE_ELEMENT = "TimeMode";
 	private static final String FADE_ELEMENT = "Fade";
 	private static final String WARNING_ELEMENT = "Warning";
@@ -47,6 +48,8 @@ public class PadSettingsSerializer {
 			padSettings.setVolume(Double.parseDouble(settingsElement.element(VOLUME_ELEMENT).getStringValue()));
 		if (settingsElement.element(LOOP_ELEMENT) != null)
 			padSettings.setLoop(Boolean.parseBoolean(settingsElement.element(LOOP_ELEMENT).getStringValue()));
+		if (settingsElement.element(PLAY_OVERLAY_ELEMENT) != null)
+			padSettings.setPlayOverlay(Boolean.parseBoolean(settingsElement.element(PLAY_OVERLAY_ELEMENT).getStringValue()));
 		if (settingsElement.element(TIME_MODE_ELEMENT) != null)
 			padSettings.setTimeMode(TimeMode.valueOf(settingsElement.element(TIME_MODE_ELEMENT).getStringValue()));
 		if (settingsElement.element(FADE_ELEMENT) != null)
@@ -108,6 +111,7 @@ public class PadSettingsSerializer {
 
 		settingsElement.addElement(VOLUME_ELEMENT).addText(String.valueOf(padSettings.getVolume()));
 		settingsElement.addElement(LOOP_ELEMENT).addText(String.valueOf(padSettings.isLoop()));
+		settingsElement.addElement(PLAY_OVERLAY_ELEMENT).addText(String.valueOf(padSettings.isPlayOverlay()));
 		if (padSettings.isCustomTimeMode())
 			settingsElement.addElement(TIME_MODE_ELEMENT).addText(String.valueOf(padSettings.getTimeMode()));
 		if (padSettings.isCustomWarning())
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 a791354a..28bb500f 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
@@ -43,7 +43,8 @@ public class PadStatusControlListener implements ChangeListener<PadStatus> {
 				pad.getProject().updateActivePlayerProperty();
 
 				// bei Single Pad Playing wird das alte Pad beendet.
-				if (!profileSettings.isMultiplePlayer()) {
+				// Und wenn das neu abzuspielende Pad nicht im Modus "PlayOverlay" ist.
+				if (!profileSettings.isMultiplePlayer() && !pad.getPadSettings().isPlayOverlay()) {
 					if (currentPlayingPad != null && currentPlayingPad != pad) {
 						if (currentPlayingPad.isPlay() || currentPlayingPad.isPaused()) {
 							currentPlayingPad.stop();
-- 
GitLab