Parcourir la source

Split preferences into multiple tabs

Sebastian Stenzel il y a 6 ans
Parent
commit
e7f7321393

+ 2 - 2
main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java

@@ -5,8 +5,8 @@ public enum FxmlFile {
 	ADDVAULT_WELCOME("/fxml/addvault_welcome.fxml"), //
 	ADDVAULT_EXISTING("/fxml/addvault_existing.fxml"), //
 	ADDVAULT_NEW_NAME("/fxml/addvault_new_name.fxml"), //
-	ADDVAULT_NEW_LOCATION("/fxml/addvault_new_location.fxml"),
-	ADDVAULT_NEW_PASSWORD("/fxml/addvault_new_password.fxml"),
+	ADDVAULT_NEW_LOCATION("/fxml/addvault_new_location.fxml"), //
+	ADDVAULT_NEW_PASSWORD("/fxml/addvault_new_password.fxml"), //
 	PREFERENCES("/fxml/preferences.fxml"), //
 	UNLOCK("/fxml/unlock2.fxml"), // TODO rename
 	UNLOCK_SUCCESS("/fxml/unlock_success.fxml");

+ 125 - 0
main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java

@@ -0,0 +1,125 @@
+package org.cryptomator.ui.preferences;
+
+import javafx.beans.binding.Bindings;
+import javafx.beans.binding.BooleanBinding;
+import javafx.scene.control.Button;
+import javafx.scene.control.CheckBox;
+import javafx.scene.control.ChoiceBox;
+import javafx.scene.control.TextField;
+import javafx.util.StringConverter;
+import org.cryptomator.common.settings.Settings;
+import org.cryptomator.common.settings.UiTheme;
+import org.cryptomator.common.settings.VolumeImpl;
+import org.cryptomator.common.settings.WebDavUrlScheme;
+import org.cryptomator.common.vaults.Volume;
+import org.cryptomator.ui.common.FxController;
+
+import javax.inject.Inject;
+
+@PreferencesScoped
+public class GeneralPreferencesController implements FxController {
+
+	private final Settings settings;
+	private final BooleanBinding showWebDavSettings;
+	public ChoiceBox<UiTheme> themeChoiceBox;
+	public CheckBox startHiddenCheckbox;
+	public CheckBox debugModeCheckbox;
+	public ChoiceBox<VolumeImpl> volumeTypeChoicBox;
+	public TextField webDavPortField;
+	public Button changeWebDavPortButton;
+	public ChoiceBox<WebDavUrlScheme> webDavUrlSchemeChoiceBox;
+
+	@Inject
+	GeneralPreferencesController(Settings settings) {
+		this.settings = settings;
+		this.showWebDavSettings = Bindings.equal(settings.preferredVolumeImpl(), VolumeImpl.WEBDAV);
+	}
+
+	public void initialize() {
+		themeChoiceBox.getItems().addAll(UiTheme.values());
+		themeChoiceBox.valueProperty().bindBidirectional(settings.theme());
+		themeChoiceBox.setConverter(new UiThemeConverter());
+
+		startHiddenCheckbox.selectedProperty().bindBidirectional(settings.startHidden());
+
+		debugModeCheckbox.selectedProperty().bindBidirectional(settings.debugMode());
+
+		volumeTypeChoicBox.getItems().addAll(Volume.getCurrentSupportedAdapters());
+		volumeTypeChoicBox.valueProperty().bindBidirectional(settings.preferredVolumeImpl());
+		volumeTypeChoicBox.setConverter(new VolumeImplConverter());
+
+		webDavPortField.setText(String.valueOf(settings.port().get()));
+		changeWebDavPortButton.visibleProperty().bind(settings.port().asString().isNotEqualTo(webDavPortField.textProperty()));
+		changeWebDavPortButton.disableProperty().bind(Bindings.createBooleanBinding(this::validateWebDavPort, webDavPortField.textProperty()).not());
+
+		webDavUrlSchemeChoiceBox.getItems().addAll(WebDavUrlScheme.values());
+		webDavUrlSchemeChoiceBox.valueProperty().bindBidirectional(settings.preferredGvfsScheme());
+		webDavUrlSchemeChoiceBox.setConverter(new WebDavUrlSchemeConverter());
+	}
+
+	private boolean validateWebDavPort() {
+		try {
+			int port = Integer.parseInt(webDavPortField.getText());
+			return port == 0 // choose port automatically
+					|| port >= Settings.MIN_PORT && port <= Settings.MAX_PORT; // port within range
+		} catch (NumberFormatException e) {
+			return false;
+		}
+	}
+
+	public void doChangeWebDavPort() {
+		settings.port().set(Integer.parseInt(webDavPortField.getText()));
+	}
+
+	/* Property Getters */
+
+	public BooleanBinding showWebDavSettingsProperty() {
+		return showWebDavSettings;
+	}
+
+	public Boolean getShowWebDavSettings() {
+		return showWebDavSettings.get();
+	}
+
+	/* Helper classes */
+
+	private static class UiThemeConverter extends StringConverter<UiTheme> {
+
+		@Override
+		public String toString(UiTheme impl) {
+			return impl.getDisplayName();
+		}
+
+		@Override
+		public UiTheme fromString(String string) {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	private static class WebDavUrlSchemeConverter extends StringConverter<WebDavUrlScheme> {
+
+		@Override
+		public String toString(WebDavUrlScheme scheme) {
+			return scheme.getDisplayName();
+		}
+
+		@Override
+		public WebDavUrlScheme fromString(String string) {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+	private static class VolumeImplConverter extends StringConverter<VolumeImpl> {
+
+		@Override
+		public String toString(VolumeImpl impl) {
+			return impl.getDisplayName();
+		}
+
+		@Override
+		public VolumeImpl fromString(String string) {
+			throw new UnsupportedOperationException();
+		}
+	}
+
+}

+ 1 - 116
main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java

@@ -1,128 +1,13 @@
 package org.cryptomator.ui.preferences;
 
-import javafx.beans.binding.Bindings;
-import javafx.beans.binding.BooleanBinding;
-import javafx.scene.control.Button;
-import javafx.scene.control.CheckBox;
-import javafx.scene.control.ChoiceBox;
-import javafx.scene.control.TextField;
-import javafx.util.StringConverter;
-import org.cryptomator.common.settings.Settings;
-import org.cryptomator.common.settings.UiTheme;
-import org.cryptomator.common.settings.VolumeImpl;
-import org.cryptomator.common.settings.WebDavUrlScheme;
 import org.cryptomator.ui.common.FxController;
-import org.cryptomator.common.vaults.Volume;
 
 import javax.inject.Inject;
 
 @PreferencesScoped
 public class PreferencesController implements FxController {
-	
-	private final Settings settings;
-	private final BooleanBinding showWebDavSettings;
-	public ChoiceBox<UiTheme> themeChoiceBox;
-	public CheckBox startHiddenCheckbox;
-	public CheckBox checkForUpdatesCheckbox;
-	public CheckBox debugModeCheckbox;
-	public ChoiceBox<VolumeImpl> volumeTypeChoicBox;
-	public TextField webDavPortField;
-	public Button changeWebDavPortButton;
-	public ChoiceBox<WebDavUrlScheme> webDavUrlSchemeChoiceBox;
 
 	@Inject
-	PreferencesController(Settings settings) {
-		this.settings = settings;
-		this.showWebDavSettings = Bindings.equal(settings.preferredVolumeImpl(), VolumeImpl.WEBDAV);
-	}
-
-	public void initialize() {
-		themeChoiceBox.getItems().addAll(UiTheme.values());
-		themeChoiceBox.valueProperty().bindBidirectional(settings.theme());
-		themeChoiceBox.setConverter(new UiThemeConverter());
-
-		startHiddenCheckbox.selectedProperty().bindBidirectional(settings.startHidden());
-
-		checkForUpdatesCheckbox.selectedProperty().bindBidirectional(settings.checkForUpdates());
-
-		debugModeCheckbox.selectedProperty().bindBidirectional(settings.debugMode());
-
-		volumeTypeChoicBox.getItems().addAll(Volume.getCurrentSupportedAdapters());
-		volumeTypeChoicBox.valueProperty().bindBidirectional(settings.preferredVolumeImpl());
-		volumeTypeChoicBox.setConverter(new VolumeImplConverter());
-
-		webDavPortField.setText(String.valueOf(settings.port().get()));
-		changeWebDavPortButton.visibleProperty().bind(settings.port().asString().isNotEqualTo(webDavPortField.textProperty()));
-		changeWebDavPortButton.disableProperty().bind(Bindings.createBooleanBinding(this::validateWebDavPort, webDavPortField.textProperty()).not());
-
-		webDavUrlSchemeChoiceBox.getItems().addAll(WebDavUrlScheme.values());
-		webDavUrlSchemeChoiceBox.valueProperty().bindBidirectional(settings.preferredGvfsScheme());
-		webDavUrlSchemeChoiceBox.setConverter(new WebDavUrlSchemeConverter());
-	}
-
-	private boolean validateWebDavPort() {
-		try {
-			int port = Integer.parseInt(webDavPortField.getText());
-			return port == 0 // choose port automatically
-					|| port >= Settings.MIN_PORT && port <= Settings.MAX_PORT; // port within range
-		} catch (NumberFormatException e) {
-			return false;
-		}
-	}
-
-	public void doChangeWebDavPort() {
-		settings.port().set(Integer.parseInt(webDavPortField.getText()));
-	}
-
-	/* Property Getters */
-
-	public BooleanBinding showWebDavSettingsProperty() {
-		return showWebDavSettings;
-	}
-
-	public Boolean getShowWebDavSettings() {
-		return showWebDavSettings.get();
-	}
-
-	/* Helper classes */
-
-	private static class UiThemeConverter extends StringConverter<UiTheme> {
-
-		@Override
-		public String toString(UiTheme impl) {
-			return impl.getDisplayName();
-		}
-
-		@Override
-		public UiTheme fromString(String string) {
-			throw new UnsupportedOperationException();
-		}
-	}
-
-	private static class WebDavUrlSchemeConverter extends StringConverter<WebDavUrlScheme> {
-
-		@Override
-		public String toString(WebDavUrlScheme scheme) {
-			return scheme.getDisplayName();
-		}
-
-		@Override
-		public WebDavUrlScheme fromString(String string) {
-			throw new UnsupportedOperationException();
-		}
-	}
-
-	private static class VolumeImplConverter extends StringConverter<VolumeImpl> {
-
-		@Override
-		public String toString(VolumeImpl impl) {
-			return impl.getDisplayName();
-		}
-
-		@Override
-		public VolumeImpl fromString(String string) {
-			throw new UnsupportedOperationException();
-		}
-	}
+	public PreferencesController() {}
 
 }

+ 9 - 1
main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java

@@ -5,7 +5,6 @@ import dagger.Module;
 import dagger.Provides;
 import dagger.multibindings.IntoMap;
 import javafx.scene.Scene;
-import javafx.stage.Modality;
 import javafx.stage.Stage;
 import org.cryptomator.ui.common.FXMLLoaderFactory;
 import org.cryptomator.ui.common.FxController;
@@ -52,5 +51,14 @@ abstract class PreferencesModule {
 	@FxControllerKey(PreferencesController.class)
 	abstract FxController bindPreferencesController(PreferencesController controller);
 
+	@Binds
+	@IntoMap
+	@FxControllerKey(GeneralPreferencesController.class)
+	abstract FxController bindGeneralPreferencesController(GeneralPreferencesController controller);
+
+	@Binds
+	@IntoMap
+	@FxControllerKey(UpdatesPreferencesController.class)
+	abstract FxController bindUpdatesPreferencesController(UpdatesPreferencesController controller);
 
 }

+ 24 - 0
main/ui/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java

@@ -0,0 +1,24 @@
+package org.cryptomator.ui.preferences;
+
+import javafx.scene.control.CheckBox;
+import org.cryptomator.common.settings.Settings;
+import org.cryptomator.ui.common.FxController;
+
+import javax.inject.Inject;
+
+@PreferencesScoped
+public class UpdatesPreferencesController implements FxController {
+
+	private final Settings settings;
+	public CheckBox checkForUpdatesCheckbox;
+
+	@Inject
+	UpdatesPreferencesController(Settings settings) {
+		this.settings = settings;
+	}
+
+	public void initialize() {
+		checkForUpdatesCheckbox.selectedProperty().bindBidirectional(settings.checkForUpdates());
+	}
+
+}

+ 27 - 0
main/ui/src/main/resources/css/dark_theme.css

@@ -90,6 +90,33 @@
 
 }
 
+/*******************************************************************************
+ *                                                                             *
+ * TabPane                                                                     *
+ *                                                                             *
+ ******************************************************************************/
+
+.tab-pane {
+	-fx-tab-min-height: 24;
+}
+.tab-pane > .tab-header-area {
+	-fx-padding: 6px 12px 0 12px;
+	-fx-background-color: CONTROL_BORDER_FOCUSED, MAIN_BG;
+    -fx-background-insets: 0, 0 0 1 0;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab {
+	-fx-text-fill: TEXT_FILL;
+	-fx-alignment: CENTER;
+	-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BORDER_FOCUSED, MAIN_BG;
+	-fx-background-insets: 0, 1px 1px 0 1px, 1px;
+	-fx-background-radius: 4px 4px 0 0;
+	-fx-padding: 0.2em 0.4em 0.2em 0.4em;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab:selected {
+	-fx-background-color: CONTROL_BORDER_FOCUSED, MAIN_BG;
+	-fx-background-insets: 0, 1px 1px 0 1px;
+}
+
 /*******************************************************************************
  *                                                                             *
  * SplitPane                                                                   *

+ 27 - 0
main/ui/src/main/resources/css/light_theme.css

@@ -90,6 +90,33 @@
 
 }
 
+/*******************************************************************************
+ *                                                                             *
+ * TabPane                                                                     *
+ *                                                                             *
+ ******************************************************************************/
+
+.tab-pane {
+	-fx-tab-min-height: 24;
+}
+.tab-pane > .tab-header-area {
+	-fx-padding: 6px 12px 0 12px;
+	-fx-background-color: CONTROL_BORDER_FOCUSED, MAIN_BG;
+    -fx-background-insets: 0, 0 0 1 0;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab {
+	-fx-text-fill: TEXT_FILL;
+	-fx-alignment: CENTER;
+	-fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BORDER_FOCUSED, MAIN_BG;
+	-fx-background-insets: 0, 1px 1px 0 1px, 1px;
+	-fx-background-radius: 4px 4px 0 0;
+	-fx-padding: 0.2em 0.4em 0.2em 0.4em;
+}
+.tab-pane > .tab-header-area > .headers-region > .tab:selected {
+	-fx-background-color: CONTROL_BORDER_FOCUSED, MAIN_BG;
+	-fx-background-insets: 0, 1px 1px 0 1px;
+}
+
 /*******************************************************************************
  *                                                                             *
  * SplitPane                                                                   *

+ 21 - 45
main/ui/src/main/resources/fxml/preferences.fxml

@@ -1,47 +1,23 @@
 <?xml version="1.0" encoding="UTF-8"?>
 
-<?import javafx.geometry.Insets?>
-<?import javafx.scene.control.Button?>
-<?import javafx.scene.control.CheckBox?>
-<?import javafx.scene.control.ChoiceBox?>
-<?import javafx.scene.control.Label?>
-<?import javafx.scene.layout.HBox?>
-<?import javafx.scene.layout.VBox?>
-<?import org.cryptomator.ui.controls.NumericTextField?>
-<VBox xmlns="http://javafx.com/javafx"
-	  xmlns:fx="http://javafx.com/fxml"
-	  fx:controller="org.cryptomator.ui.preferences.PreferencesController"
-	  styleClass="preferences-window"
-	  spacing="6">
-	<padding>
-		<Insets bottom="12" left="12" right="12" top="12"/>
-	</padding>
-	<children>
-		<HBox spacing="6" alignment="BASELINE_LEFT">
-			<Label text="%preferences.theme"/>
-			<ChoiceBox fx:id="themeChoiceBox"/>
-		</HBox>
-
-		<CheckBox fx:id="startHiddenCheckbox" text="%preferences.startHidden"/>
-
-		<CheckBox fx:id="checkForUpdatesCheckbox" text="%preferences.autoUpdateCheck"/>
-
-		<CheckBox fx:id="debugModeCheckbox" text="%preferences.debugLogging"/>
-
-		<HBox spacing="6" alignment="BASELINE_LEFT">
-			<Label text="%preferences.volumeType"/>
-			<ChoiceBox fx:id="volumeTypeChoicBox"/>
-		</HBox>
-
-		<HBox spacing="6" alignment="BASELINE_LEFT" visible="${controller.showWebDavSettings}">
-			<Label text="TODO WebDAV Port"/>
-			<NumericTextField fx:id="webDavPortField"/>
-			<Button text="TODO Apply" fx:id="changeWebDavPortButton" onAction="#doChangeWebDavPort"/>
-		</HBox>
-
-		<HBox spacing="6" alignment="BASELINE_LEFT" visible="${controller.showWebDavSettings}">
-			<Label text="TODO WebDAV Scheme"/>
-			<ChoiceBox fx:id="webDavUrlSchemeChoiceBox" maxWidth="Infinity"/>
-		</HBox>
-	</children>
-</VBox>
+<?import javafx.scene.control.Tab?>
+<?import javafx.scene.control.TabPane?>
+<TabPane xmlns="http://javafx.com/javafx"
+		 xmlns:fx="http://javafx.com/fxml"
+		 fx:controller="org.cryptomator.ui.preferences.PreferencesController"
+		 side="TOP"
+		 tabClosingPolicy="UNAVAILABLE"
+		 tabDragPolicy="FIXED">
+	<tabs>
+		<Tab text="TODO General">
+			<content>
+				<fx:include source="/fxml/preferences_general.fxml"/>
+			</content>
+		</Tab>
+		<Tab text="TODO Updates">
+			<content>
+				<fx:include source="/fxml/preferences_updates.fxml"/>
+			</content>
+		</Tab>
+	</tabs>
+</TabPane>

+ 44 - 0
main/ui/src/main/resources/fxml/preferences_general.fxml

@@ -0,0 +1,44 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.Button?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.control.ChoiceBox?>
+<?import javafx.scene.control.Label?>
+<?import javafx.scene.layout.HBox?>
+<?import javafx.scene.layout.VBox?>
+<?import org.cryptomator.ui.controls.NumericTextField?>
+<VBox xmlns="http://javafx.com/javafx"
+	  xmlns:fx="http://javafx.com/fxml"
+	  fx:controller="org.cryptomator.ui.preferences.GeneralPreferencesController"
+	  spacing="6">
+	<padding>
+		<Insets bottom="12" left="12" right="12" top="12"/>
+	</padding>
+	<children>
+		<HBox spacing="6" alignment="BASELINE_LEFT">
+			<Label text="%preferences.theme"/>
+			<ChoiceBox fx:id="themeChoiceBox"/>
+		</HBox>
+
+		<CheckBox fx:id="startHiddenCheckbox" text="%preferences.startHidden"/>
+
+		<CheckBox fx:id="debugModeCheckbox" text="%preferences.debugLogging"/>
+
+		<HBox spacing="6" alignment="BASELINE_LEFT">
+			<Label text="%preferences.volumeType"/>
+			<ChoiceBox fx:id="volumeTypeChoicBox"/>
+		</HBox>
+
+		<HBox spacing="6" alignment="BASELINE_LEFT" visible="${controller.showWebDavSettings}">
+			<Label text="TODO WebDAV Port"/>
+			<NumericTextField fx:id="webDavPortField"/>
+			<Button text="TODO Apply" fx:id="changeWebDavPortButton" onAction="#doChangeWebDavPort"/>
+		</HBox>
+
+		<HBox spacing="6" alignment="BASELINE_LEFT" visible="${controller.showWebDavSettings}">
+			<Label text="TODO WebDAV Scheme"/>
+			<ChoiceBox fx:id="webDavUrlSchemeChoiceBox" maxWidth="Infinity"/>
+		</HBox>
+	</children>
+</VBox>

+ 16 - 0
main/ui/src/main/resources/fxml/preferences_updates.fxml

@@ -0,0 +1,16 @@
+<?xml version="1.0" encoding="UTF-8"?>
+
+<?import javafx.geometry.Insets?>
+<?import javafx.scene.control.CheckBox?>
+<?import javafx.scene.layout.VBox?>
+<VBox xmlns="http://javafx.com/javafx"
+	  xmlns:fx="http://javafx.com/fxml"
+	  fx:controller="org.cryptomator.ui.preferences.UpdatesPreferencesController"
+	  spacing="6">
+	<padding>
+		<Insets bottom="12" left="12" right="12" top="12"/>
+	</padding>
+	<children>
+		<CheckBox fx:id="checkForUpdatesCheckbox" text="%preferences.autoUpdateCheck"/>
+	</children>
+</VBox>