From bc09014c024526fa7efd0ff2cb60bfa232aee35e Mon Sep 17 00:00:00 2001
From: tobias <tobias.ullerich@icloud.com>
Date: Sun, 14 Aug 2016 17:01:42 +0200
Subject: [PATCH] Add TaskView to closing settings view, for Paths

---
 .../DesktopMenuToolbarViewController.java     | 31 --------
 .../global/GlobalSettingsViewController.java  | 42 +++++++++++
 .../option/global/KeysTabViewController.java  | 18 ++++-
 .../profile/AudioTabViewController.java       | 21 ++++--
 .../profile/DesignTabViewController.java      | 24 ++++--
 .../profile/MappingTabViewController.java     | 32 +++++---
 .../option/profile/MidiTabViewController.java |  7 --
 .../profile/PlayerTabViewController.java      |  5 --
 .../ProfileSettingsViewController.java        | 46 ++++++++++++
 .../project/GeneralTabViewController.java     | 75 +++++++++++--------
 .../project/PathsTabViewController.java       | 42 +++++++++--
 .../ProjectSettingsViewController.java        | 50 +++++++++++--
 .../GlobalSettingsTabViewController.java      | 19 +----
 .../option/IGlobalReloadTask.java             | 18 +++++
 .../option/IProfileReloadTask.java            | 19 +++++
 .../option/IProjectReloadTask.java            | 19 +++++
 .../ProfileSettingsTabViewController.java     | 19 +----
 .../ProjectSettingsTabViewController.java     | 19 +----
 18 files changed, 348 insertions(+), 158 deletions(-)
 create mode 100644 PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalReloadTask.java
 create mode 100644 PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProfileReloadTask.java
 create mode 100644 PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProjectReloadTask.java

diff --git a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
index f7d817b5..c12d9a8d 100644
--- a/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
+++ b/PlayWall/src/de/tobias/playpad/layout/desktop/DesktopMenuToolbarViewController.java
@@ -23,7 +23,6 @@ import de.tobias.playpad.project.ProjectNotFoundException;
 import de.tobias.playpad.project.ProjectReference;
 import de.tobias.playpad.registry.NoSuchComponentException;
 import de.tobias.playpad.registry.Registry;
-import de.tobias.playpad.settings.GlobalSettings;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileNotFoundException;
 import de.tobias.playpad.settings.ProfileSettings;
@@ -40,9 +39,6 @@ import de.tobias.playpad.viewcontroller.dialog.ProfileViewController;
 import de.tobias.playpad.viewcontroller.dialog.ProjectManagerDialog;
 import de.tobias.playpad.viewcontroller.main.BasicMenuToolbarViewController;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
-import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController;
-import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
-import de.tobias.playpad.viewcontroller.option.ProjectSettingsTabViewController;
 import de.tobias.playpad.viewcontroller.option.global.GlobalSettingsViewController;
 import de.tobias.playpad.viewcontroller.option.profile.ProfileSettingsViewController;
 import de.tobias.playpad.viewcontroller.option.project.ProjectSettingsViewController;
@@ -475,12 +471,6 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 
 			Runnable onFinish = () ->
 			{
-				for (ProjectSettingsTabViewController controller : projectSettingsViewController.getTabs()) {
-					if (controller.needReload()) {
-						controller.reload(currentProject.getSettings(), currentProject, mainViewController);
-					}
-				}
-
 				projectSettingsViewController = null;
 				mainStage.toFront();
 			};
@@ -513,18 +503,6 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 			{
 				midi.setListener(mainViewController.getMidiHandler());
 
-				boolean change = false;
-				for (ProfileSettingsTabViewController controller : profileSettingsViewController.getTabs()) {
-					if (controller.needReload()) {
-						change = true;
-						controller.reload(Profile.currentProfile(), currentProject, mainViewController);
-					}
-				}
-
-				if (change) {
-					PlayPadMain.getProgramInstance().getSettingsListener().forEach(l -> l.onChange(Profile.currentProfile()));
-				}
-
 				profileSettingsViewController = null;
 				mainStage.toFront();
 			};
@@ -545,15 +523,6 @@ public class DesktopMenuToolbarViewController extends BasicMenuToolbarViewContro
 			Stage mainStage = mainViewController.getStage();
 			Runnable onFinish = () ->
 			{
-				Project currentProject = PlayPadMain.getProgramInstance().getCurrentProject();
-				GlobalSettings globalSettings = PlayPadPlugin.getImplementation().getGlobalSettings();
-
-				for (GlobalSettingsTabViewController controller : globalSettingsViewController.getTabs()) {
-					if (controller.needReload()) {
-						controller.reload(globalSettings, currentProject, mainViewController);
-					}
-				}
-
 				globalSettingsViewController = null;
 				mainStage.toFront();
 			};
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java
index 6534d297..f3e4c210 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/GlobalSettingsViewController.java
@@ -3,17 +3,26 @@ package de.tobias.playpad.viewcontroller.option.global;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.controlsfx.control.TaskProgressView;
+
+import de.tobias.playpad.PlayPadImpl;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.settings.GlobalSettings;
 import de.tobias.playpad.settings.Profile;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController;
+import de.tobias.playpad.viewcontroller.option.IGlobalReloadTask;
 import de.tobias.playpad.viewcontroller.option.IGlobalSettingsViewController;
 import de.tobias.utils.ui.ViewController;
 import de.tobias.utils.util.Localization;
+import de.tobias.utils.util.Worker;
+import javafx.beans.Observable;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
+import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
@@ -118,9 +127,42 @@ public class GlobalSettingsViewController extends ViewController implements IGlo
 		saveTabs();
 		if (onFinish != null)
 			onFinish.run(); // Reload MainViewController Settings
+
+		PlayPadImpl programInstance = PlayPadMain.getProgramInstance();
+		IMainViewController mainController = programInstance.getMainViewController();
+		GlobalSettings settings = programInstance.getGlobalSettings();
+		showProgressDialog(settings, mainController);
+
 		return true;
 	}
 
+	private void showProgressDialog(GlobalSettings settings, IMainViewController mainController) {
+		TaskProgressView<Task<Void>> taskView = new TaskProgressView<>();
+
+		for (GlobalSettingsTabViewController controller : tabs) {
+			if (controller instanceof IGlobalReloadTask) {
+				if (controller.needReload()) {
+					Task<Void> task = ((IGlobalReloadTask) controller).getTask(settings, mainController);
+					taskView.getTasks().add(task);
+					Worker.runLater(task);
+				}
+			}
+		}
+
+		if (!taskView.getTasks().isEmpty()) {
+			Scene scene = new Scene(taskView);
+			Stage stage = new Stage();
+			taskView.getTasks().addListener((Observable observable) ->
+			{
+				if (taskView.getTasks().isEmpty()) {
+					stage.close();
+				}
+			});
+			stage.setScene(scene);
+			stage.showAndWait();
+		}
+	}
+
 	@Override
 	public void addTab(GlobalSettingsTabViewController controller) {
 		tabs.add(controller);
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
index c6132c91..ea2c874f 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/global/KeysTabViewController.java
@@ -3,11 +3,11 @@ package de.tobias.playpad.viewcontroller.option.global;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
-import de.tobias.playpad.project.Project;
 import de.tobias.playpad.settings.GlobalSettings;
 import de.tobias.playpad.settings.keys.Key;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.GlobalSettingsTabViewController;
+import de.tobias.playpad.viewcontroller.option.IGlobalReloadTask;
 import de.tobias.utils.util.Localization;
 import de.tobias.utils.util.OS;
 import javafx.application.Platform;
@@ -15,6 +15,7 @@ import javafx.beans.property.SimpleStringProperty;
 import javafx.collections.FXCollections;
 import javafx.collections.ObservableList;
 import javafx.collections.transformation.FilteredList;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.Scene;
@@ -30,7 +31,7 @@ import javafx.scene.control.TextField;
 import javafx.scene.input.KeyCode;
 import javafx.stage.Stage;
 
-public class KeysTabViewController extends GlobalSettingsTabViewController {
+public class KeysTabViewController extends GlobalSettingsTabViewController implements IGlobalReloadTask {
 
 	@FXML private TextField searchTextField;
 
@@ -168,8 +169,17 @@ public class KeysTabViewController extends GlobalSettingsTabViewController {
 	}
 
 	@Override
-	public void reload(GlobalSettings settings, Project project, IMainViewController controller) {
-		controller.loadKeybinding(settings.getKeyCollection());
+	public Task<Void> getTask(GlobalSettings settings, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				updateProgress(-1, -1);
+
+				controller.loadKeybinding(settings.getKeyCollection());
+				return null;
+			}
+		};
 	}
 
 	@Override
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
index 7faa367a..beb9b84c 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/AudioTabViewController.java
@@ -10,14 +10,15 @@ import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileSettings;
 import de.tobias.playpad.viewcontroller.AudioTypeViewController;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProfileReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.utils.util.Localization;
-import de.tobias.utils.util.Worker;
+import javafx.concurrent.Task;
 import javafx.fxml.FXML;
 import javafx.scene.control.ComboBox;
 import javafx.scene.layout.AnchorPane;
 
-public class AudioTabViewController extends ProfileSettingsTabViewController {
+public class AudioTabViewController extends ProfileSettingsTabViewController implements IProfileReloadTask {
 
 	// Audio
 	@FXML private ComboBox<String> audioTypeComboBox;
@@ -101,11 +102,17 @@ public class AudioTabViewController extends ProfileSettingsTabViewController {
 	}
 
 	@Override
-	public void reload(Profile profile, Project project, IMainViewController controller) {
-		Worker.runLater(() ->
-		{
-			project.loadPadsContent();
-		});
+	public Task<Void> getTask(ProfileSettings settings, Project project, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				updateProgress(-1, -1);
+
+				project.loadPadsContent();
+				return null;
+			}
+		};
 	}
 
 	@Override
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/DesignTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/DesignTabViewController.java
index 3953f127..467fc9a9 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/DesignTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/DesignTabViewController.java
@@ -8,16 +8,19 @@ import de.tobias.playpad.design.DesignConnect;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.registry.NoSuchComponentException;
 import de.tobias.playpad.settings.Profile;
+import de.tobias.playpad.settings.ProfileSettings;
 import de.tobias.playpad.viewcontroller.GlobalDesignViewController;
 import de.tobias.playpad.viewcontroller.cell.DisplayableCell;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProfileReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.utils.util.Localization;
+import javafx.concurrent.Task;
 import javafx.fxml.FXML;
 import javafx.scene.control.ComboBox;
 import javafx.scene.layout.VBox;
 
-public class DesignTabViewController extends ProfileSettingsTabViewController {
+public class DesignTabViewController extends ProfileSettingsTabViewController implements IProfileReloadTask {
 
 	@FXML private VBox layoutContainer;
 	@FXML private ComboBox<DesignConnect> layoutTypeComboBox;
@@ -68,10 +71,12 @@ public class DesignTabViewController extends ProfileSettingsTabViewController {
 	}
 
 	@Override
-	public void loadSettings(Profile profile) {}
+	public void loadSettings(Profile profile) {
+	}
 
 	@Override
-	public void saveSettings(Profile profile) {}
+	public void saveSettings(Profile profile) {
+	}
 
 	@Override
 	public boolean needReload() {
@@ -79,8 +84,17 @@ public class DesignTabViewController extends ProfileSettingsTabViewController {
 	}
 
 	@Override
-	public void reload(Profile profile, Project project, IMainViewController controller) {
-		controller.loadUserCss();
+	public Task<Void> getTask(ProfileSettings settings, Project project, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				updateProgress(-1, -1);
+
+				controller.loadUserCss();
+				return null;
+			}
+		};
 	}
 
 	@Override
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MappingTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MappingTabViewController.java
index 56ad791c..f1fe20a9 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MappingTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MappingTabViewController.java
@@ -16,15 +16,18 @@ import de.tobias.playpad.action.mapper.MapperRegistry;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.registry.NoSuchComponentException;
 import de.tobias.playpad.settings.Profile;
+import de.tobias.playpad.settings.ProfileSettings;
 import de.tobias.playpad.viewcontroller.IMapperOverviewViewController;
 import de.tobias.playpad.viewcontroller.IMappingTabViewController;
 import de.tobias.playpad.viewcontroller.cell.DisplayableCell;
 import de.tobias.playpad.viewcontroller.cell.DisplayableTreeCell;
 import de.tobias.playpad.viewcontroller.dialog.MappingListViewController;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProfileReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.utils.ui.ContentViewController;
 import de.tobias.utils.util.Localization;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
@@ -33,7 +36,7 @@ import javafx.scene.control.TreeItem;
 import javafx.scene.control.TreeView;
 import javafx.scene.layout.VBox;
 
-public class MappingTabViewController extends ProfileSettingsTabViewController implements IMappingTabViewController {
+public class MappingTabViewController extends ProfileSettingsTabViewController implements IMappingTabViewController, IProfileReloadTask {
 
 	@FXML private ComboBox<Mapping> mappingComboBox;
 	@FXML private Button editMappingsButton;
@@ -162,15 +165,24 @@ public class MappingTabViewController extends ProfileSettingsTabViewController i
 	}
 
 	@Override
-	public void reload(Profile profile, Project project, IMainViewController controller) {
-		Project currentProject = PlayPadMain.getProgramInstance().getCurrentProject();
-		Profile.currentProfile().getMappings().getActiveMapping().adjustPadColorToMapper(currentProject);
-
-		Mapping activeMapping = Profile.currentProfile().getMappings().getActiveMapping();
-
-		oldMapping.clearFeedback();
-		activeMapping.showFeedback(project);
-		activeMapping.initFeedback();
+	public Task<Void> getTask(ProfileSettings settings, Project project, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				updateProgress(-1, -1);
+				
+				Project currentProject = PlayPadMain.getProgramInstance().getCurrentProject();
+				Profile.currentProfile().getMappings().getActiveMapping().adjustPadColorToMapper(currentProject);
+
+				Mapping activeMapping = Profile.currentProfile().getMappings().getActiveMapping();
+
+				oldMapping.clearFeedback();
+				activeMapping.showFeedback(project);
+				activeMapping.initFeedback();
+				return null;
+			}
+		};
 	}
 
 	@Override
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MidiTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MidiTabViewController.java
index 5f1b14a0..efedbd16 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MidiTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/MidiTabViewController.java
@@ -6,10 +6,8 @@ import javax.sound.midi.MidiUnavailableException;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.midi.Midi;
-import de.tobias.playpad.project.Project;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileSettings;
-import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.utils.util.Localization;
 import javafx.event.ActionEvent;
@@ -112,11 +110,6 @@ public class MidiTabViewController extends ProfileSettingsTabViewController {
 		return true;
 	}
 
-	@Override
-	public void reload(Profile profile, Project project, IMainViewController controller) {
-
-	}
-
 	@Override
 	public String name() {
 		return Localization.getString(Strings.UI_Window_Settings_Midi_Title);
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/PlayerTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/PlayerTabViewController.java
index 46ac63ee..a903758d 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/PlayerTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/PlayerTabViewController.java
@@ -3,11 +3,9 @@ package de.tobias.playpad.viewcontroller.option.profile;
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.pad.TimeMode;
-import de.tobias.playpad.project.Project;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileSettings;
 import de.tobias.playpad.viewcontroller.cell.EnumCell;
-import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.playpad.viewcontroller.settings.FadeViewController;
 import de.tobias.playpad.viewcontroller.settings.WarningFeedbackViewController;
@@ -74,9 +72,6 @@ public class PlayerTabViewController extends ProfileSettingsTabViewController {
 		return false;
 	}
 
-	@Override
-	public void reload(Profile profile, Project project, IMainViewController controller) {}
-
 	@Override
 	public boolean validSettings() {
 		return true;
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/ProfileSettingsViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/ProfileSettingsViewController.java
index e24d1316..1ab694da 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/ProfileSettingsViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/profile/ProfileSettingsViewController.java
@@ -3,6 +3,8 @@ package de.tobias.playpad.viewcontroller.option.profile;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.controlsfx.control.TaskProgressView;
+
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.PlayPadPlugin;
 import de.tobias.playpad.Strings;
@@ -12,14 +14,21 @@ import de.tobias.playpad.project.Project;
 import de.tobias.playpad.registry.NoSuchComponentException;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.settings.ProfileSettings;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProfileReloadTask;
 import de.tobias.playpad.viewcontroller.option.IProfileSettingsViewController;
+import de.tobias.playpad.viewcontroller.option.IProjectReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProfileSettingsTabViewController;
 import de.tobias.utils.ui.ViewController;
 import de.tobias.utils.ui.icon.FontAwesomeType;
 import de.tobias.utils.ui.icon.FontIcon;
 import de.tobias.utils.util.Localization;
+import de.tobias.utils.util.Worker;
+import javafx.beans.Observable;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
+import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
@@ -159,9 +168,46 @@ public class ProfileSettingsViewController extends ViewController implements IPr
 		saveTabs();
 		if (onFinish != null)
 			onFinish.run(); // Reload MainViewController Settings
+
+		IMainViewController mainController = PlayPadMain.getProgramInstance().getMainViewController();
+		Profile profile = Profile.currentProfile();
+		Project project = PlayPadMain.getProgramInstance().getCurrentProject();
+
+		showProgressDialog(profile.getProfileSettings(), project, mainController);
+
 		return true;
 	}
 
+	private void showProgressDialog(ProfileSettings settings, Project project, IMainViewController mainController) {
+		TaskProgressView<Task<Void>> taskView = new TaskProgressView<>();
+
+		for (ProfileSettingsTabViewController controller : tabs) {
+			if (controller instanceof IProjectReloadTask) {
+				if (controller.needReload()) {
+					Task<Void> task = ((IProfileReloadTask) controller).getTask(settings, project, mainController);
+					taskView.getTasks().add(task);
+					Worker.runLater(task);
+				}
+			}
+		}
+
+		if (!taskView.getTasks().isEmpty()) {
+			// Run Listener
+			PlayPadMain.getProgramInstance().getSettingsListener().forEach(l -> l.onChange(Profile.currentProfile()));
+
+			Scene scene = new Scene(taskView);
+			Stage stage = new Stage();
+			taskView.getTasks().addListener((Observable observable) ->
+			{
+				if (taskView.getTasks().isEmpty()) {
+					stage.close();
+				}
+			});
+			stage.setScene(scene);
+			stage.showAndWait();
+		}
+	}
+
 	/**
 	 * Aktiviert/Deaktiviert den Look Button.
 	 * 
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
index a94a860b..24fe8119 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/GeneralTabViewController.java
@@ -8,20 +8,17 @@ import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectSettings;
 import de.tobias.playpad.settings.Profile;
 import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProjectReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProjectSettingsTabViewController;
 import de.tobias.utils.ui.Alertable;
 import de.tobias.utils.util.Localization;
-import de.tobias.utils.util.Worker;
 import javafx.application.Platform;
+import javafx.concurrent.Task;
 import javafx.fxml.FXML;
-import javafx.scene.control.Alert;
-import javafx.scene.control.Alert.AlertType;
 import javafx.scene.control.TextField;
-import javafx.stage.Modality;
 import javafx.stage.Screen;
-import javafx.stage.Stage;
 
-public class GeneralTabViewController extends ProjectSettingsTabViewController {
+public class GeneralTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask {
 
 	private static final String DIGIT_POSITIV = "^[1-9]\\d*$";
 
@@ -101,7 +98,8 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController {
 
 			if (neededHeight <= height && neededWidth <= width)
 				return true;
-		} catch (NumberFormatException e) {}
+		} catch (NumberFormatException e) {
+		}
 		return false;
 	}
 
@@ -145,30 +143,27 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController {
 		return changeSettings;
 	}
 
-	@Override
-	public void reload(ProjectSettings settings, Project project, IMainViewController controller) {
-		Alert alert = new Alert(AlertType.INFORMATION);
-		alert.setContentText(Localization.getString(Strings.UI_Window_Settings_Gen_Wait));
-
-		alert.getButtonTypes().clear();
-		alert.initOwner(controller.getStage());
-		alert.initModality(Modality.WINDOW_MODAL);
-		Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
-		PlayPadMain.stageIcon.ifPresent(stage.getIcons()::add);
-
-		alert.show();
-
-		Worker.runLater(() ->
-		{
-			Platform.runLater(() ->
-			{
-				controller.getMenuToolbarController().initPageButtons();
-				controller.createPadViews();
-				controller.showPage(controller.getPage());
-				stage.close();
-			});
-		});
-	}
+	// @Override
+	// public void reload(ProjectSettings settings, Project project, IMainViewController controller) {
+	// Alert alert = new Alert(AlertType.INFORMATION);
+	// alert.setContentText(Localization.getString(Strings.UI_Window_Settings_Gen_Wait));
+	//
+	// alert.getButtonTypes().clear();
+	// alert.initOwner(controller.getStage());
+	// alert.initModality(Modality.WINDOW_MODAL);
+	// Stage stage = (Stage) alert.getDialogPane().getScene().getWindow();
+	// PlayPadMain.stageIcon.ifPresent(stage.getIcons()::add);
+	//
+	// alert.show();
+	//
+	// Worker.runLater(() ->
+	// {
+	// Platform.runLater(() ->
+	// {
+	//
+	// });
+	// });
+	// }
 
 	@Override
 	public boolean validSettings() {
@@ -193,4 +188,22 @@ public class GeneralTabViewController extends ProjectSettingsTabViewController {
 		return Localization.getString(Strings.UI_Window_Settings_Gen_Title);
 	}
 
+	@Override
+	public Task<Void> getTask(ProjectSettings settings, Project project, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				updateProgress(-1, -1);
+
+				Platform.runLater(() ->
+				{
+					controller.getMenuToolbarController().initPageButtons();
+					controller.createPadViews();
+					controller.showPage(controller.getPage());
+				});
+				return null;
+			}
+		};
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/PathsTabViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/PathsTabViewController.java
index e857d85a..f4ac4dbf 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/PathsTabViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/PathsTabViewController.java
@@ -5,8 +5,12 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 
 import de.tobias.playpad.PlayPadMain;
+import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectSettings;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import de.tobias.playpad.viewcontroller.option.IProjectReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProjectSettingsTabViewController;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
 import javafx.scene.control.Button;
@@ -14,16 +18,17 @@ import javafx.scene.control.CheckBox;
 import javafx.scene.control.TextField;
 import javafx.stage.DirectoryChooser;
 
-public class PathsTabViewController extends ProjectSettingsTabViewController {
+public class PathsTabViewController extends ProjectSettingsTabViewController implements IProjectReloadTask {
 
 	// Media Path
 	@FXML private TextField mediaPathTextField;
 	@FXML private Button mediaPathChooseButton;
 	@FXML private CheckBox useMediaPath;
 
+	private transient boolean changedMediaPath = false;
+
 	public PathsTabViewController() {
 		super("pathTab.fxml", "de/tobias/playpad/assets/view/option/project/", PlayPadMain.getUiResourceBundle());
-		// TODO Auto-generated constructor stub
 	}
 
 	@FXML
@@ -46,18 +51,18 @@ public class PathsTabViewController extends ProjectSettingsTabViewController {
 
 	@Override
 	public void saveSettings(ProjectSettings settings) {
+		Path newPath = Paths.get(mediaPathTextField.getText());
+		if (!settings.getMediaPath().equals(newPath)) {
+			changedMediaPath = true;
+		}
+
 		if (useMediaPath.isSelected()) {
-			settings.setMediaPath(Paths.get(mediaPathTextField.getText()));
+			settings.setMediaPath(newPath);
 		}
 		settings.setUseMediaPath(useMediaPath.isSelected());
 
 	}
 
-	@Override
-	public boolean needReload() {
-		return false;
-	}
-
 	@Override
 	public boolean validSettings() {
 		return true;
@@ -68,4 +73,25 @@ public class PathsTabViewController extends ProjectSettingsTabViewController {
 		return "Pfade (i18n)"; // TODO
 	}
 
+	// Reload Data
+
+	@Override
+	public boolean needReload() {
+		return changedMediaPath;
+	}
+
+	@Override
+	public Task<Void> getTask(ProjectSettings settings, Project project, IMainViewController controller) {
+		return new Task<Void>() {
+			@Override
+			protected Void call() throws Exception {
+				updateTitle(name());
+				for (int i = 0; i < 100; i++) {
+					Thread.sleep(10);
+					updateProgress(i, 100);
+				}
+				return null;
+			}
+		};
+	}
 }
diff --git a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/ProjectSettingsViewController.java b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/ProjectSettingsViewController.java
index 64b2fe03..8152b54d 100644
--- a/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/ProjectSettingsViewController.java
+++ b/PlayWall/src/de/tobias/playpad/viewcontroller/option/project/ProjectSettingsViewController.java
@@ -3,17 +3,25 @@ package de.tobias.playpad.viewcontroller.option.project;
 import java.util.ArrayList;
 import java.util.List;
 
+import org.controlsfx.control.TaskProgressView;
+
 import de.tobias.playpad.PlayPadMain;
 import de.tobias.playpad.Strings;
 import de.tobias.playpad.project.Project;
 import de.tobias.playpad.project.ProjectSettings;
 import de.tobias.playpad.settings.Profile;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
 import de.tobias.playpad.viewcontroller.option.IProjectSettingsViewController;
+import de.tobias.playpad.viewcontroller.option.IProjectReloadTask;
 import de.tobias.playpad.viewcontroller.option.ProjectSettingsTabViewController;
 import de.tobias.utils.ui.ViewController;
 import de.tobias.utils.util.Localization;
+import de.tobias.utils.util.Worker;
+import javafx.beans.Observable;
+import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
+import javafx.scene.Scene;
 import javafx.scene.control.Button;
 import javafx.scene.control.Tab;
 import javafx.scene.control.TabPane;
@@ -29,23 +37,24 @@ public class ProjectSettingsViewController extends ViewController implements IPr
 	@FXML private Button finishButton;
 
 	protected List<ProjectSettingsTabViewController> tabs = new ArrayList<>();
-	private ProjectSettings settings;
+	private Project project;
 
 	private Runnable onFinish;
 
 	public ProjectSettingsViewController(Screen currentScreen, Window owner, Project project, Runnable onFinish) {
 		super("projectSettingsView", "de/tobias/playpad/assets/view/option/project/", null, PlayPadMain.getUiResourceBundle());
 		this.onFinish = onFinish;
-		this.settings = project.getSettings();
+		this.project = project;
 
-		getStage().initOwner(owner);
 		boolean activePlayer = project.hasPlayedPlayers();
 
 		addTab(new GeneralTabViewController(currentScreen, this, activePlayer));
 		addTab(new PathsTabViewController());
 
+		getStage().initOwner(owner);
+
 		// Show Current Settings
-		loadTabs(settings);
+		loadTabs(project.getSettings());
 	}
 
 	@Override
@@ -109,12 +118,43 @@ public class ProjectSettingsViewController extends ViewController implements IPr
 			}
 		}
 
-		saveTabs(settings);
+		saveTabs(project.getSettings());
 		if (onFinish != null)
 			onFinish.run(); // Reload MainViewController Settings
+
+		IMainViewController mainController = PlayPadMain.getProgramInstance().getMainViewController();
+		showProgressDialog(project.getSettings(), project, mainController);
+
 		return true;
 	}
 
+	private void showProgressDialog(ProjectSettings settings, Project project, IMainViewController mainController) {
+		TaskProgressView<Task<Void>> taskView = new TaskProgressView<>();
+
+		for (ProjectSettingsTabViewController controller : tabs) {
+			if (controller instanceof IProjectReloadTask) {
+				if (controller.needReload()) {
+					Task<Void> task = ((IProjectReloadTask) controller).getTask(settings, project, mainController);
+					taskView.getTasks().add(task);
+					Worker.runLater(task);
+				}
+			}
+		}
+
+		if (!taskView.getTasks().isEmpty()) {
+			Scene scene = new Scene(taskView);
+			Stage stage = new Stage();
+			taskView.getTasks().addListener((Observable observable) ->
+			{
+				if (taskView.getTasks().isEmpty()) {
+					stage.close();
+				}
+			});
+			stage.setScene(scene);
+			stage.showAndWait();
+		}
+	}
+
 	@Override
 	public void addTab(ProjectSettingsTabViewController controller) {
 		tabs.add(controller);
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java
index d6850193..daff746b 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/GlobalSettingsTabViewController.java
@@ -41,27 +41,16 @@ public abstract class GlobalSettingsTabViewController extends ContentViewControl
 	public abstract void saveSettings(GlobalSettings settings);
 
 	/**
-	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird in
-	 * {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
+	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird
+	 * in {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
 	 * 
 	 * @return <code>true</code> Benötigt Reload
 	 */
 	public abstract boolean needReload();
 
 	/**
-	 * Lädt gestimmte Einstellungen für die GUI neu.
-	 * 
-	 * @param settings
-	 *            Aktuelles GlobalSettings
-	 * @param project
-	 *            Aktuelles Projekt
-	 * @param controller
-	 *            Main View Controller
-	 */
-	public void reload(GlobalSettings settings, Project project, IMainViewController controller) {}
-
-	/**
-	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht geschlossen werden.
+	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht
+	 * geschlossen werden.
 	 * 
 	 * @return <code>true</code> Einstellungen erlaubt. <code>false</code> Einstellungen fehlerhaft.
 	 */
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalReloadTask.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalReloadTask.java
new file mode 100644
index 00000000..1f3cda80
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IGlobalReloadTask.java
@@ -0,0 +1,18 @@
+package de.tobias.playpad.viewcontroller.option;
+
+import de.tobias.playpad.settings.GlobalSettings;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import javafx.concurrent.Task;
+
+/**
+ * * Schnittstelle, um das ein Task zum Laden der Einstellungen angezeigt werden kann.
+ * 
+ * @author tobias
+ *
+ * @since 5.1.0
+ * 
+ */
+public interface IGlobalReloadTask {
+
+	public Task<Void> getTask(GlobalSettings settings, IMainViewController controller);
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProfileReloadTask.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProfileReloadTask.java
new file mode 100644
index 00000000..8506a37a
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProfileReloadTask.java
@@ -0,0 +1,19 @@
+package de.tobias.playpad.viewcontroller.option;
+
+import de.tobias.playpad.project.Project;
+import de.tobias.playpad.settings.ProfileSettings;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import javafx.concurrent.Task;
+
+/**
+ * * Schnittstelle, um das ein Task zum Laden der Einstellungen angezeigt werden kann.
+ * 
+ * @author tobias
+ *
+ * @since 5.1.0
+ * 
+ */
+public interface IProfileReloadTask {
+
+	public Task<Void> getTask(ProfileSettings settings, Project project, IMainViewController controller);
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProjectReloadTask.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProjectReloadTask.java
new file mode 100644
index 00000000..880c93e1
--- /dev/null
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/IProjectReloadTask.java
@@ -0,0 +1,19 @@
+package de.tobias.playpad.viewcontroller.option;
+
+import de.tobias.playpad.project.Project;
+import de.tobias.playpad.project.ProjectSettings;
+import de.tobias.playpad.viewcontroller.main.IMainViewController;
+import javafx.concurrent.Task;
+
+/**
+ * * Schnittstelle, um das ein Task zum Laden der Einstellungen angezeigt werden kann.
+ * 
+ * @author tobias
+ *
+ * @since 5.1.0
+ * 
+ */
+public interface IProjectReloadTask {
+
+	public Task<Void> getTask(ProjectSettings settings, Project project, IMainViewController controller);
+}
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProfileSettingsTabViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProfileSettingsTabViewController.java
index 345e903f..36ac6c87 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProfileSettingsTabViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProfileSettingsTabViewController.java
@@ -48,27 +48,16 @@ public abstract class ProfileSettingsTabViewController extends ContentViewContro
 	public abstract void saveSettings(Profile profile);
 
 	/**
-	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird in
-	 * {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
+	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird
+	 * in {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
 	 * 
 	 * @return <code>true</code> Benötigt Reload
 	 */
 	public abstract boolean needReload();
 
 	/**
-	 * Lädt gestimmte Einstellungen für die GUI neu.
-	 * 
-	 * @param profile
-	 *            Aktuelles Profile
-	 * @param project
-	 *            Aktuelles Projekt
-	 * @param controller
-	 *            Main View Controller
-	 */
-	public void reload(Profile profile, Project project, IMainViewController controller) {}
-
-	/**
-	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht geschlossen werden.
+	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht
+	 * geschlossen werden.
 	 * 
 	 * @return <code>true</code> Einstellungen erlaubt. <code>false</code> Einstellungen fehlerhaft.
 	 */
diff --git a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProjectSettingsTabViewController.java b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProjectSettingsTabViewController.java
index c8db54b8..0f4b33e9 100644
--- a/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProjectSettingsTabViewController.java
+++ b/PlayWallCore/src/de/tobias/playpad/viewcontroller/option/ProjectSettingsTabViewController.java
@@ -50,27 +50,16 @@ public abstract class ProjectSettingsTabViewController extends ContentViewContro
 	public abstract void saveSettings(ProjectSettings settings);
 
 	/**
-	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird in
-	 * {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
+	 * Gibt <code>true</code> zurück, wenn im Hauptprogramm etwas neu geladen werden muss. Der eigentliche Reload wird
+	 * in {@link #reload(Profile, Project, IMainViewController)} ausgeführt.
 	 * 
 	 * @return <code>true</code> Benötigt Reload
 	 */
 	public abstract boolean needReload();
 
 	/**
-	 * Lädt gestimmte Einstellungen für die GUI neu.
-	 * 
-	 * @param settings
-	 *            Aktuelles Project Settings
-	 * @param project
-	 *            Aktuelles Projekt
-	 * @param controller
-	 *            Main View Controller
-	 */
-	public void reload(ProjectSettings settings, Project project, IMainViewController controller) {}
-
-	/**
-	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht geschlossen werden.
+	 * Prüft ob die eingetragen Einstellungen erlaubt sind. Bei falschen Eingaben können die Einstellungen nicht
+	 * geschlossen werden.
 	 * 
 	 * @return <code>true</code> Einstellungen erlaubt. <code>false</code> Einstellungen fehlerhaft.
 	 */
-- 
GitLab