From 57e74c4c6682f7aa1967c0a457285df87096a30e Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Fri, 5 Aug 2016 20:04:14 +0200
Subject: [PATCH] Continue on main view

---
 .../main/LayoutChangedListener.java           |  8 +--
 .../main/MainViewControllerV2.java            | 53 ++++++++++---------
 .../playpad/view/main/MainLayoutHandler.java  | 28 ++++++++++
 .../AudioTypeViewController.java              | 26 ++++++++-
 .../main/IMainViewController.java             |  3 +-
 .../actionsplugin/impl/ActionsPluginImpl.java | 22 ++++----
 .../awakeplugin/impl/AwakePluginImpl.java     | 21 +++++---
 .../main/impl/EqualizerPluginImpl.java        | 13 +++--
 8 files changed, 122 insertions(+), 52 deletions(-)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java

diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/LayoutChangedListener.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/LayoutChangedListener.java
index a170a777..ba475861 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/LayoutChangedListener.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/LayoutChangedListener.java
@@ -2,11 +2,13 @@ package de.tobias.playpad.viewcontroller.main;
 
 import java.util.List;
 
+import de.tobias.playpad.view.main.MainLayoutHandler;
+
 public class LayoutChangedListener {
 
-	public void handle(List<Runnable> runnables) {
-		for (Runnable run : runnables) {
-			run.run();
+	public void handle(List<MainLayoutHandler> runnables, MenuToolbarViewController oldToolbar, MenuToolbarViewController newToolbar) {
+		for (MainLayoutHandler run : runnables) {
+			run.handle(oldToolbar, newToolbar);
 		}
 	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
index 7f9db22c..6e9a67e6 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/main/MainViewControllerV2.java
@@ -27,6 +27,7 @@ import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileListener;
 import de.tobias.playpad.settings.ProfileSettings;
 import de.tobias.playpad.view.main.MainLayoutConnect;
+import de.tobias.playpad.view.main.MainLayoutHandler;
 import de.tobias.playpad.viewcontroller.pad.PadDragListener;
 import de.tobias.utils.ui.BasicControllerSettings;
 import de.tobias.utils.ui.NotificationHandler;
@@ -61,7 +62,6 @@ import javafx.stage.Modality;
 import javafx.stage.Screen;
 import javafx.stage.Stage;
 
-// TODO Extract Color Adjust methodes
 public class MainViewControllerV2 extends ViewController implements IMainViewController, NotificationHandler, ProfileListener {
 
 	private static final int FIRST_PAGE = 0;
@@ -89,7 +89,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	private Color gridColor;
 
 	// Layout
-	private List<Runnable> layoutActions;
+	private List<MainLayoutHandler> layoutActions;
 
 	// Listener
 	private VolumeChangeListener volumeChangeListener;
@@ -116,7 +116,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 		// Wenn sich die Toolbar ändert werden die Button neu erstellt. Das ist hier, weil es nur einmal als Listener da
 		// sein muss. Die
 		// Methode wird aber an unterschiedlichen stellen mehrmals aufgerufen
-		performLayoutDependendAction(() ->
+		performLayoutDependendAction((oldToolbar, newToolbar) ->
 		{
 			if (menuToolbarViewController != null)
 				menuToolbarViewController.initPageButtons();
@@ -187,8 +187,13 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	}
 
 	private void initMainLayout() {
+		ProfileSettings settings = Profile.currentProfile().getProfileSettings();
+
 		if (menuToolbarViewController != null) {
 			menuToolbarViewController.deinit();
+
+			menuToolbarViewController.getVolumeSlider().valueProperty().unbindBidirectional(settings.volumeProperty());
+			menuToolbarViewController.getVolumeSlider().valueProperty().removeListener(volumeChangeListener);
 		}
 
 		removePadsFromView();
@@ -203,9 +208,12 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 			newMenuToolbarViewController.setFullScreenActive(this.menuToolbarViewController.isFullscreenActive());
 		}
 
+		layoutChangedListener.handle(layoutActions, this.menuToolbarViewController, newMenuToolbarViewController);
 		this.menuToolbarViewController = newMenuToolbarViewController;
 
-		layoutChangedListener.handle(layoutActions);
+		menuToolbarViewController.getVolumeSlider().valueProperty().bindBidirectional(settings.volumeProperty());
+		menuToolbarViewController.getVolumeSlider().valueProperty().addListener(volumeChangeListener);
+
 		createPadViews();
 		showPage(currentPageShowing);
 
@@ -462,7 +470,7 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 			// New
 			addPadsToView();
 		}
-		
+
 		if (menuToolbarViewController != null) {
 			menuToolbarViewController.hilightPageButton(page);
 		}
@@ -487,26 +495,23 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 
 	@Override
 	public void showLiveInfo() {
-		if (!shown) {
-			if (menuToolbarViewController != null) {
-				menuToolbarViewController.showLiveLabel(true);
-				shown = true;
-				Worker.runLater(() ->
+		if (!shown && menuToolbarViewController != null) {
+			menuToolbarViewController.showLiveLabel(true);
+			shown = true;
+			Worker.runLater(() ->
+			{
+				try {
+					Thread.sleep(PlayPadMain.displayTimeMillis * 2);
+				} catch (Exception e) {
+				}
+				Platform.runLater(() ->
 				{
-					try {
-						Thread.sleep(PlayPadMain.displayTimeMillis * 2);
-					} catch (Exception e) {
-					}
-					Platform.runLater(() ->
-					{
-						if (menuToolbarViewController != null)
-							menuToolbarViewController.showLiveLabel(false);
-						shown = false;
-					});
+					if (menuToolbarViewController != null)
+						menuToolbarViewController.showLiveLabel(false);
+					shown = false;
 				});
-			}
+			});
 		}
-
 	}
 
 	// Settings
@@ -706,8 +711,8 @@ public class MainViewControllerV2 extends ViewController implements IMainViewCon
 	}
 
 	@Override
-	public void performLayoutDependendAction(Runnable runnable) {
-		runnable.run();
+	public void performLayoutDependendAction(MainLayoutHandler runnable) {
+		runnable.handle(null, menuToolbarViewController);
 		layoutActions.add(runnable);
 	}
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java
new file mode 100644
index 00000000..23d1d5b7
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/view/main/MainLayoutHandler.java
@@ -0,0 +1,28 @@
+package de.tobias.playpad.view.main;
+
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.main.MenuToolbarViewController;
+
+/**
+ * Schnittstelle für das Handle einer neunen Toolbar. Diese Methode wird vom MainView automatisch bei einem neuen Layout
+ * aufgeführt.
+ * 
+ * @author tobias
+ *
+ * @see IMainViewController#performLayoutDependendAction(MainLayoutHandler)
+ * @see MainLayoutConnect
+ */
+@FunctionalInterface
+public interface MainLayoutHandler {
+
+	/**
+	 * Listener Methode für den Wechsel der Toolbar.
+	 * 
+	 * @param oldToolbar
+	 *            Alte Toolbar
+	 * @param newToolbar
+	 *            Neue Toolbar
+	 */
+	public void handle(MenuToolbarViewController oldToolbar, MenuToolbarViewController newToolbar);
+
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/AudioTypeViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/AudioTypeViewController.java
index e1f32c78..ee065a8d 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/AudioTypeViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/AudioTypeViewController.java
@@ -2,14 +2,36 @@ package de.tobias.playpad.viewcontroller;
 
 import java.util.ResourceBundle;
 
+import de.tobias.playpad.audio.AudioHandlerConnect;
 import de.tobias.utils.ui.ContentViewController;
 
-
+/**
+ * Einstellungen ViewController für einen sAudio Handler.
+ * 
+ * @author tobias
+ * 
+ * @see AudioHandlerConnect
+ */
 public abstract class AudioTypeViewController extends ContentViewController {
 
+	/**
+	 * Neuer ViewController.
+	 * 
+	 * @param name
+	 *            Name der FXML
+	 * @param path
+	 *            Path zur FXML (ohne Dateiname)
+	 * @param localization
+	 *            Localization
+	 */
 	public AudioTypeViewController(String name, String path, ResourceBundle localization) {
 		super(name, path, localization);
 	}
-	
+
+	/**
+	 * Prüft ob die Einstellungen geändert wurden.
+	 * 
+	 * @return <code>true</code> Audio Einstellungen für Pads werden automatisch neu geladen
+	 */
 	public abstract boolean isChanged();
 }
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
index b735be99..2d58a59e 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/main/IMainViewController.java
@@ -5,6 +5,7 @@ import java.util.List;
 import de.tobias.playpad.midi.MidiListener;
 import de.tobias.playpad.pad.view.IPadViewV2;
 import de.tobias.playpad.view.main.MainLayoutConnect;
+import de.tobias.playpad.view.main.MainLayoutHandler;
 import de.tobias.utils.ui.NotificationHandler;
 import javafx.event.EventHandler;
 import javafx.event.EventType;
@@ -56,5 +57,5 @@ public interface IMainViewController extends NotificationHandler {
 
 	public void setMainLayout(MainLayoutConnect mainLayoutConnect);
 
-	public void performLayoutDependendAction(Runnable runnable);
+	public void performLayoutDependendAction(MainLayoutHandler runnable);
 }
diff --git a/PlayWallPlugins/actionsplugin/de/tobias/playpad/actionsplugin/impl/ActionsPluginImpl.java b/PlayWallPlugins/actionsplugin/de/tobias/playpad/actionsplugin/impl/ActionsPluginImpl.java
index 3fe6c239..e698c264 100644
--- a/PlayWallPlugins/actionsplugin/de/tobias/playpad/actionsplugin/impl/ActionsPluginImpl.java
+++ b/PlayWallPlugins/actionsplugin/de/tobias/playpad/actionsplugin/impl/ActionsPluginImpl.java
@@ -65,20 +65,24 @@ public class ActionsPluginImpl implements ActionsPlugin, ChangeListener<Boolean>
 				muteHUD.setMinHeight(100);
 			});
 
+			ChangeListener<Boolean> listener = (a, b, c) ->
+			{
+				if (c && volume == -1 && Profile.currentProfile().getProfileSettings().getVolume() != 0) {
+					volume = Profile.currentProfile().getProfileSettings().getVolume();
+				} else {
+					volume = -1;
+				}
+			};
+
 			PlayPadPlugin.getImplementation().addMainViewListener(new WindowListener<IMainViewController>() {
 
 				@Override
 				public void onInit(IMainViewController t) {
-					t.performLayoutDependendAction(() ->
+					t.performLayoutDependendAction((oldToolbar, newToolbar) ->
 					{
-						t.getMenuToolbarController().getVolumeSlider().valueChangingProperty().addListener((a, b, c) ->
-						{
-							if (c && volume == -1 && Profile.currentProfile().getProfileSettings().getVolume() != 0) {
-								volume = Profile.currentProfile().getProfileSettings().getVolume();
-							} else {
-								volume = -1;
-							}
-						});
+						if (oldToolbar != null)
+							oldToolbar.getVolumeSlider().valueChangingProperty().removeListener(listener);
+						newToolbar.getVolumeSlider().valueChangingProperty().addListener(listener);
 					});
 				}
 			});
diff --git a/PlayWallPlugins/awakeplugin/de/tobias/playpad/awakeplugin/impl/AwakePluginImpl.java b/PlayWallPlugins/awakeplugin/de/tobias/playpad/awakeplugin/impl/AwakePluginImpl.java
index 91bd1d0a..7d6d1646 100644
--- a/PlayWallPlugins/awakeplugin/de/tobias/playpad/awakeplugin/impl/AwakePluginImpl.java
+++ b/PlayWallPlugins/awakeplugin/de/tobias/playpad/awakeplugin/impl/AwakePluginImpl.java
@@ -143,19 +143,24 @@ public class AwakePluginImpl implements AwakePlugin, WindowListener<IMainViewCon
 
 	@Override
 	public void onInit(IMainViewController t) {
-		t.performLayoutDependendAction(() ->
+		activeMenu = new CheckMenuItem();
+		activeMenu.setOnAction(this);
+		activeMenu.setText(bundle.getString("menutitle"));
+		activeMenu.setSelected(settings.active);
+
+		t.performLayoutDependendAction((oldToolbar, newToolbar) ->
 		{
-			activeMenu = new CheckMenuItem();
-			activeMenu.setOnAction(this);
-			activeMenu.setText(bundle.getString("menutitle"));
-			activeMenu.setSelected(settings.active);
-			t.getMenuToolbarController().addMenuItem(activeMenu, MenuType.EXTENSION);
+			if (oldToolbar != null)
+				oldToolbar.removeMenuItem(activeMenu);
+			newToolbar.addMenuItem(activeMenu, MenuType.EXTENSION);
 
 			if (iconLabel != null) {
 				if (settings.active) {
-					t.getMenuToolbarController().addToolbarItem(iconLabel);
+					if (oldToolbar != null)
+						oldToolbar.removeToolbarItem(iconLabel);
+					newToolbar.addToolbarItem(iconLabel);
 				} else {
-					t.getMenuToolbarController().removeToolbarItem(iconLabel);
+					newToolbar.removeToolbarItem(iconLabel);
 				}
 			}
 		});
diff --git a/PlayWallPlugins/equalizerplugin/de/tobias/playpad/equalizerplugin/main/impl/EqualizerPluginImpl.java b/PlayWallPlugins/equalizerplugin/de/tobias/playpad/equalizerplugin/main/impl/EqualizerPluginImpl.java
index c8ff9867..92c52557 100644
--- a/PlayWallPlugins/equalizerplugin/de/tobias/playpad/equalizerplugin/main/impl/EqualizerPluginImpl.java
+++ b/PlayWallPlugins/equalizerplugin/de/tobias/playpad/equalizerplugin/main/impl/EqualizerPluginImpl.java
@@ -69,12 +69,15 @@ public class EqualizerPluginImpl implements EqualizerPlugin, WindowListener<IMai
 	public void onInit(IMainViewController t) {
 		mainStage = t.getStage();
 
-		t.performLayoutDependendAction(() ->
+		eqMenuItem = new MenuItem();
+		eqMenuItem.setText(bundle.getString("eq.menuitem.name"));
+		eqMenuItem.setOnAction(this);
+
+		t.performLayoutDependendAction((oldToolbar, newToolbar) ->
 		{
-			eqMenuItem = new MenuItem();
-			eqMenuItem.setText(bundle.getString("eq.menuitem.name"));
-			eqMenuItem.setOnAction(this);
-			t.getMenuToolbarController().addMenuItem(eqMenuItem, MenuType.EXTENSION);
+			if (oldToolbar != null)
+				oldToolbar.removeMenuItem(eqMenuItem);
+			newToolbar.addMenuItem(eqMenuItem, MenuType.EXTENSION);
 		});
 	}
 
-- 
GitLab