diff --git a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java index 5d00b7718..1ec24dcaf 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/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"); diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java new file mode 100644 index 000000000..3b3de258e --- /dev/null +++ b/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 themeChoiceBox; + public CheckBox startHiddenCheckbox; + public CheckBox debugModeCheckbox; + public ChoiceBox volumeTypeChoicBox; + public TextField webDavPortField; + public Button changeWebDavPortButton; + public ChoiceBox 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 { + + @Override + public String toString(UiTheme impl) { + return impl.getDisplayName(); + } + + @Override + public UiTheme fromString(String string) { + throw new UnsupportedOperationException(); + } + } + + private static class WebDavUrlSchemeConverter extends StringConverter { + + @Override + public String toString(WebDavUrlScheme scheme) { + return scheme.getDisplayName(); + } + + @Override + public WebDavUrlScheme fromString(String string) { + throw new UnsupportedOperationException(); + } + } + + private static class VolumeImplConverter extends StringConverter { + + @Override + public String toString(VolumeImpl impl) { + return impl.getDisplayName(); + } + + @Override + public VolumeImpl fromString(String string) { + throw new UnsupportedOperationException(); + } + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java index df5ab2749..f014d9e0a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java +++ b/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 themeChoiceBox; - public CheckBox startHiddenCheckbox; - public CheckBox checkForUpdatesCheckbox; - public CheckBox debugModeCheckbox; - public ChoiceBox volumeTypeChoicBox; - public TextField webDavPortField; - public Button changeWebDavPortButton; - public ChoiceBox 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 { - - @Override - public String toString(UiTheme impl) { - return impl.getDisplayName(); - } - - @Override - public UiTheme fromString(String string) { - throw new UnsupportedOperationException(); - } - } - - private static class WebDavUrlSchemeConverter extends StringConverter { - - @Override - public String toString(WebDavUrlScheme scheme) { - return scheme.getDisplayName(); - } - - @Override - public WebDavUrlScheme fromString(String string) { - throw new UnsupportedOperationException(); - } - } - - private static class VolumeImplConverter extends StringConverter { - - @Override - public String toString(VolumeImpl impl) { - return impl.getDisplayName(); - } - - @Override - public VolumeImpl fromString(String string) { - throw new UnsupportedOperationException(); - } - } + public PreferencesController() {} } diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java index bb34b411c..8aa14d109 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java +++ b/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); } diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/UpdatesPreferencesController.java new file mode 100644 index 000000000..9eaaaf085 --- /dev/null +++ b/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()); + } + +} diff --git a/main/ui/src/main/resources/css/dark_theme.css b/main/ui/src/main/resources/css/dark_theme.css index 5416f9c77..3ba21ba99 100644 --- a/main/ui/src/main/resources/css/dark_theme.css +++ b/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 * diff --git a/main/ui/src/main/resources/css/light_theme.css b/main/ui/src/main/resources/css/light_theme.css index b15e1d719..020b07a1e 100644 --- a/main/ui/src/main/resources/css/light_theme.css +++ b/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 * diff --git a/main/ui/src/main/resources/fxml/preferences.fxml b/main/ui/src/main/resources/fxml/preferences.fxml index 9c9c65564..b61658561 100644 --- a/main/ui/src/main/resources/fxml/preferences.fxml +++ b/main/ui/src/main/resources/fxml/preferences.fxml @@ -1,47 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - -