From a63abe880db674f308d8c9ffc913bfc704dcf41f Mon Sep 17 00:00:00 2001
From: Robert Goldmann <deadlocker@gmx.de>
Date: Wed, 1 Dec 2021 22:28:14 +0100
Subject: [PATCH] #157 - added builder pattern for ModernCartDesign

---
 .../playpad/project/ProjectJsonReader.java    |   6 +-
 .../design/modern/model/ModernCartDesign.java | 135 +++++++++++++++---
 .../ModernCartDesignSerializer.java           |  38 ++++-
 .../de/tobias/playpad/pad/PadSettings.java    |   2 +-
 .../playpad/pad/PadSettingsSerializer.java    |   6 +-
 .../settings/design/DesignAddListener.java    |   8 +-
 6 files changed, 165 insertions(+), 30 deletions(-)

diff --git a/PlayWall/src/main/java/de/tobias/playpad/project/ProjectJsonReader.java b/PlayWall/src/main/java/de/tobias/playpad/project/ProjectJsonReader.java
index 6f33e38a..89c39e3e 100644
--- a/PlayWall/src/main/java/de/tobias/playpad/project/ProjectJsonReader.java
+++ b/PlayWall/src/main/java/de/tobias/playpad/project/ProjectJsonReader.java
@@ -101,7 +101,11 @@ public class ProjectJsonReader {
 			ModernColor backgroundColor = ModernColor.valueOf(object.getString("background_color"));
 			ModernColor playColor = ModernColor.valueOf(object.getString("play_color"));
 
-			return new ModernCartDesign(pad, id, backgroundColor, playColor, ModernColor.RED2); // TODO Fix Cue In Color
+			return new ModernCartDesign.ModernCartDesignBuilder(pad, id)
+					.withBackgroundColor(backgroundColor, false)
+					.withPlayColor(playColor, false)
+					.withCueInColor(ModernColor.RED2, false)
+					.build(); // TODO Fix Cue In Color
 		}
 		return null;
 	}
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/model/ModernCartDesign.java b/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/model/ModernCartDesign.java
index b727faca..d69ac256 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/model/ModernCartDesign.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/model/ModernCartDesign.java
@@ -6,40 +6,96 @@ import de.tobias.playpad.pad.Pad;
 import de.tobias.playpad.server.sync.command.CommandManager;
 import de.tobias.playpad.server.sync.command.Commands;
 import de.tobias.playpad.server.sync.listener.upstream.DesignUpdateListener;
+import javafx.beans.property.BooleanProperty;
 import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleBooleanProperty;
 import javafx.beans.property.SimpleObjectProperty;
 import javafx.scene.paint.Color;
 
 import java.util.UUID;
 
 public class ModernCartDesign implements FeedbackDesignColorSuggester {
+	public static class ModernCartDesignBuilder {
+		private final Pad pad;
+		private	final UUID id;
+
+		private ModernColor backgroundColor = DEFAULT_COLOR_BACKGROUND;
+		private Boolean enableCustomBackgroundColor = false;
+
+		private ModernColor playColor = DEFAULT_COLOR_PLAY;
+		private Boolean enableCustomPlayColor = false;
+
+		private ModernColor cueInColor = DEFAULT_COLOR_CUE_IN;
+		private Boolean enableCustomCueInColor = false;
+
+		public ModernCartDesignBuilder(Pad pad) {
+			this.pad = pad;
+			this.id =UUID.randomUUID();
+		}
+
+		public ModernCartDesignBuilder(Pad pad, UUID id) {
+			this.pad = pad;
+			this.id = id;
+		}
+
+		public ModernCartDesignBuilder withBackgroundColor(ModernColor backgroundColor, Boolean enable) {
+			this.backgroundColor = backgroundColor;
+			this.enableCustomBackgroundColor = enable;
+			return this;
+		}
+
+		public ModernCartDesignBuilder withPlayColor(ModernColor playColor, Boolean enable) {
+			this.playColor = playColor;
+			this.enableCustomPlayColor = enable;
+			return this;
+		}
+
+		public ModernCartDesignBuilder withCueInColor(ModernColor cueInColor, Boolean enable) {
+			this.cueInColor = cueInColor;
+			this.enableCustomCueInColor = enable;
+			return this;
+		}
+
+		public ModernCartDesign build() {
+			return new ModernCartDesign(pad, id,
+					backgroundColor, enableCustomBackgroundColor,
+					playColor, enableCustomPlayColor,
+					cueInColor, enableCustomCueInColor);
+		}
+	}
 
 	public static final ModernColor DEFAULT_COLOR_BACKGROUND = ModernColor.GRAY1;
 	public static final ModernColor DEFAULT_COLOR_PLAY = ModernColor.RED3;
 	public static final ModernColor DEFAULT_COLOR_CUE_IN = ModernColor.RED2;
 
 	private UUID uuid;
+
+	private BooleanProperty enableCustomBackgroundColor;
 	private ObjectProperty<ModernColor> backgroundColor;
+
+	private BooleanProperty enableCustomPlayColor;
 	private ObjectProperty<ModernColor> playColor;
+
+	private BooleanProperty enableCustomCueInColor;
 	private ObjectProperty<ModernColor> cueInColor;
 
 	private Pad pad;
 	private DesignUpdateListener syncListener;
 
-	public ModernCartDesign(Pad pad) {
-		this(pad, UUID.randomUUID());
-	}
-
-	public ModernCartDesign(Pad pad, UUID uuid) {
-		this(pad, uuid, ModernColor.GRAY1, ModernColor.RED3, ModernColor.RED2);
-	}
-
-	public ModernCartDesign(Pad pad, UUID id, ModernColor backgroundColor, ModernColor playColor, ModernColor cueInColor) {
+	private ModernCartDesign(Pad pad, UUID id,
+							ModernColor backgroundColor, Boolean enableCustomBackgroundColor,
+							ModernColor playColor, Boolean enableCustomPlayColor,
+							ModernColor cueInColor, Boolean enableCustomCueInColor) {
 		this.uuid = id;
 		this.pad = pad;
 
+		this.enableCustomBackgroundColor = new SimpleBooleanProperty(enableCustomBackgroundColor);
 		this.backgroundColor = new SimpleObjectProperty<>(backgroundColor);
+
+		this.enableCustomPlayColor = new SimpleBooleanProperty(enableCustomPlayColor);
 		this.playColor = new SimpleObjectProperty<>(playColor);
+
+		this.enableCustomCueInColor = new SimpleBooleanProperty(enableCustomCueInColor);
 		this.cueInColor = new SimpleObjectProperty<>(cueInColor);
 
 		syncListener = new DesignUpdateListener(this);
@@ -53,6 +109,21 @@ public class ModernCartDesign implements FeedbackDesignColorSuggester {
 		return pad;
 	}
 
+	public boolean isEnableCustomBackgroundColor()
+	{
+		return enableCustomBackgroundColor.get();
+	}
+
+	public void setEnableCustomBackgroundColor(Boolean enableCustomBackgroundColor)
+	{
+		this.enableCustomBackgroundColor.set(enableCustomBackgroundColor);
+	}
+
+	public BooleanProperty enableCustomBackgroundColorProperty()
+	{
+		return enableCustomBackgroundColor;
+	}
+
 	public ModernColor getBackgroundColor() {
 		return backgroundColor.get();
 	}
@@ -65,6 +136,21 @@ public class ModernCartDesign implements FeedbackDesignColorSuggester {
 		return backgroundColor;
 	}
 
+	public boolean isEnableCustomPlayColor()
+	{
+		return enableCustomPlayColor.get();
+	}
+
+	public void setEnableCustomPlayColor(boolean enableCustomPlayColor)
+	{
+		this.enableCustomPlayColor.set(enableCustomPlayColor);
+	}
+
+	public BooleanProperty enableCustomPlayColorProperty()
+	{
+		return enableCustomPlayColor;
+	}
+
 	public ModernColor getPlayColor() {
 		return playColor.get();
 	}
@@ -77,6 +163,21 @@ public class ModernCartDesign implements FeedbackDesignColorSuggester {
 		return playColor;
 	}
 
+	public boolean isEnableCustomCueInColor()
+	{
+		return enableCustomCueInColor.get();
+	}
+
+	public void setEnableCustomCueInColor(boolean enableCustomCueInColor)
+	{
+		this.enableCustomCueInColor.set(enableCustomCueInColor);
+	}
+
+	public BooleanProperty enableCustomCueInColorProperty()
+	{
+		return enableCustomCueInColor;
+	}
+
 	public ModernColor getCueInColor() {
 		return cueInColor.get();
 	}
@@ -115,14 +216,16 @@ public class ModernCartDesign implements FeedbackDesignColorSuggester {
 	}
 
 	public ModernCartDesign copy(Pad pad) {
-		ModernCartDesign clone = new ModernCartDesign(pad);
+		ModernCartDesign clone = new ModernCartDesignBuilder(pad).build();
 
+		clone.enableCustomBackgroundColor = new SimpleBooleanProperty(isEnableCustomBackgroundColor());
 		clone.backgroundColor = new SimpleObjectProperty<>(getBackgroundColor());
+
+		clone.enableCustomPlayColor = new SimpleBooleanProperty(isEnableCustomPlayColor());
 		clone.playColor = new SimpleObjectProperty<>(getPlayColor());
-		clone.cueInColor = new SimpleObjectProperty<>(getCueInColor());
 
-		clone.pad = pad;
-		clone.uuid = UUID.randomUUID();
+		clone.enableCustomCueInColor = new SimpleBooleanProperty(isEnableCustomCueInColor());
+		clone.cueInColor = new SimpleObjectProperty<>(getCueInColor());
 
 		syncListener = new DesignUpdateListener(clone);
 		if (pad.getProject().getProjectReference().isSync()) {
@@ -132,10 +235,4 @@ public class ModernCartDesign implements FeedbackDesignColorSuggester {
 
 		return clone;
 	}
-
-	public void copyGlobalLayout(ModernGlobalDesign globalDesign) {
-		setBackgroundColor(globalDesign.getBackgroundColor());
-		setPlayColor(globalDesign.getPlayColor());
-		setCueInColor(globalDesign.getCueInColor());
-	}
 }
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/serializer/ModernCartDesignSerializer.java b/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/serializer/ModernCartDesignSerializer.java
index ce67905e..321fa814 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/serializer/ModernCartDesignSerializer.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/design/modern/serializer/ModernCartDesignSerializer.java
@@ -14,9 +14,18 @@ public class ModernCartDesignSerializer {
 		ModernCartDesign design;
 		String uuidValue = rootElement.attributeValue("id");
 		if (uuidValue != null) {
-			design = new ModernCartDesign(pad, UUID.fromString(uuidValue));
+			design = new ModernCartDesign.ModernCartDesignBuilder(pad, UUID.fromString(uuidValue)).build();
 		} else {
-			design = new ModernCartDesign(pad);
+			design = new ModernCartDesign.ModernCartDesignBuilder(pad).build();
+		}
+
+		Element enableCustomBackgroundColorElement = rootElement.element("EnableCustomBackgroundColor");
+		if (enableCustomBackgroundColorElement != null) {
+			try {
+				design.setEnableCustomBackgroundColor(Boolean.parseBoolean(enableCustomBackgroundColorElement.getStringValue()));
+			} catch (IllegalArgumentException e) {
+				Logger.error(e);
+			}
 		}
 
 		Element backgroundElement = rootElement.element("BackgroundColor");
@@ -28,6 +37,15 @@ public class ModernCartDesignSerializer {
 			}
 		}
 
+		Element enableCustomPlayColorElement = rootElement.element("EnableCustomPlayColor");
+		if (enableCustomPlayColorElement != null) {
+			try {
+				design.setEnableCustomPlayColor(Boolean.parseBoolean(enableCustomPlayColorElement.getStringValue()));
+			} catch (IllegalArgumentException e) {
+				Logger.error(e);
+			}
+		}
+
 		Element playElement = rootElement.element("PlayColor");
 		if (playElement != null) {
 			try {
@@ -36,6 +54,16 @@ public class ModernCartDesignSerializer {
 				Logger.error(e);
 			}
 		}
+
+		Element enableCustomCueInColorElement = rootElement.element("EnableCustomCueInColor");
+		if (enableCustomCueInColorElement != null) {
+			try {
+				design.setEnableCustomCueInColor(Boolean.parseBoolean(enableCustomCueInColorElement.getStringValue()));
+			} catch (IllegalArgumentException e) {
+				Logger.error(e);
+			}
+		}
+
 		Element cueInElement = rootElement.element("CueInColor");
 		if (cueInElement != null) {
 			try {
@@ -49,8 +77,14 @@ public class ModernCartDesignSerializer {
 
 	public void save(Element rootElement, ModernCartDesign design) {
 		rootElement.addAttribute("id", design.getId().toString());
+
+		rootElement.addElement("EnableCustomBackgroundColor").addText(String.valueOf(design.isEnableCustomBackgroundColor()));
 		rootElement.addElement("BackgroundColor").addText(design.getBackgroundColor().name());
+
+		rootElement.addElement("EnableCustomPlayColor").addText(String.valueOf(design.isEnableCustomBackgroundColor()));
 		rootElement.addElement("PlayColor").addText(design.getPlayColor().name());
+
+		rootElement.addElement("EnableCustomCueInColor").addText(String.valueOf(design.isEnableCustomBackgroundColor()));
 		rootElement.addElement("CueInColor").addText(design.getCueInColor().name());
 	}
 }
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 a935edd4..eadd8e2d 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettings.java
@@ -201,7 +201,7 @@ public class PadSettings {
 
 	public ModernCartDesign getDesign() {
 		if (design == null) {
-			ModernCartDesign newDesign = new ModernCartDesign(pad);
+			ModernCartDesign newDesign = new ModernCartDesign.ModernCartDesignBuilder(pad).build();
 
 			if (pad.getProject().getProjectReference().isSync()) {
 				CommandManager.execute(Commands.DESIGN_ADD, pad.getProject().getProjectReference(), newDesign);
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 82e70e61..73a2f13b 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/pad/PadSettingsSerializer.java
@@ -124,10 +124,8 @@ public class PadSettingsSerializer {
 
 		// Layout
 		Element designElement = settingsElement.addElement(DESIGN_ELEMENT);
-		if (padSettings.isCustomDesign()) {
-			ModernCartDesignSerializer serializer = new ModernCartDesignSerializer();
-			serializer.save(designElement, padSettings.getDesign());
-		}
+		ModernCartDesignSerializer serializer = new ModernCartDesignSerializer();
+		serializer.save(designElement, padSettings.getDesign());
 		designElement.addAttribute(CUSTOM_DESIGN_ELEMENT, String.valueOf(padSettings.isCustomDesign()));
 
 		Element userInfoElement = settingsElement.addElement(CUSTOM_SETTINGS_ELEMENT);
diff --git a/PlayWallCore/src/main/java/de/tobias/playpad/server/sync/listener/downstream/pad/settings/design/DesignAddListener.java b/PlayWallCore/src/main/java/de/tobias/playpad/server/sync/listener/downstream/pad/settings/design/DesignAddListener.java
index d4c9f6a5..9a395331 100644
--- a/PlayWallCore/src/main/java/de/tobias/playpad/server/sync/listener/downstream/pad/settings/design/DesignAddListener.java
+++ b/PlayWallCore/src/main/java/de/tobias/playpad/server/sync/listener/downstream/pad/settings/design/DesignAddListener.java
@@ -31,9 +31,11 @@ public class DesignAddListener implements ServerListener {
 			if (project != null) {
 				Pad pad = project.getPad(padId);
 				if (pad != null) {
-					ModernCartDesign modernCartDesign = new ModernCartDesign(pad, uuid);
-					modernCartDesign.setBackgroundColor(backgroundColor);
-					modernCartDesign.setPlayColor(playColor);
+					ModernCartDesign modernCartDesign = new ModernCartDesign.ModernCartDesignBuilder(pad, uuid)
+							.withBackgroundColor(backgroundColor, true)
+							.withPlayColor(playColor, true)
+							.build();
+
 					pad.getPadSettings().setDesign(modernCartDesign);
 				}
 			}
-- 
GitLab