Moved volume type settings to custom preferences controller

Added icons to preferences
This commit is contained in:
Sebastian Stenzel
2019-08-14 16:42:06 +02:00
parent 948659f3cd
commit cf91a8b62c
9 changed files with 165 additions and 95 deletions

View File

@@ -1,17 +1,10 @@
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;
@@ -20,19 +13,13 @@ import javax.inject.Inject;
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() {
@@ -43,42 +30,6 @@ public class GeneralPreferencesController implements FxController {
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 */
@@ -96,30 +47,4 @@ public class GeneralPreferencesController implements FxController {
}
}
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();
}
}
}

View File

@@ -69,4 +69,9 @@ abstract class PreferencesModule {
@FxControllerKey(UpdatesPreferencesController.class)
abstract FxController bindUpdatesPreferencesController(UpdatesPreferencesController controller);
@Binds
@IntoMap
@FxControllerKey(VolumePreferencesController.class)
abstract FxController bindVolumePreferencesController(VolumePreferencesController controller);
}

View File

@@ -0,0 +1,99 @@
package org.cryptomator.ui.preferences;
import javafx.beans.binding.Bindings;
import javafx.beans.binding.BooleanBinding;
import javafx.scene.control.Button;
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.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 VolumePreferencesController implements FxController {
private final Settings settings;
private final BooleanBinding showWebDavSettings;
public ChoiceBox<VolumeImpl> volumeTypeChoicBox;
public TextField webDavPortField;
public Button changeWebDavPortButton;
public ChoiceBox<WebDavUrlScheme> webDavUrlSchemeChoiceBox;
@Inject
VolumePreferencesController(Settings settings) {
this.settings = settings;
this.showWebDavSettings = Bindings.equal(settings.preferredVolumeImpl(), VolumeImpl.WEBDAV);
}
public void initialize() {
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 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();
}
}
}

View File

@@ -2,6 +2,7 @@
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<TabPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:id="tabPane"
@@ -11,14 +12,28 @@
tabDragPolicy="FIXED">
<tabs>
<Tab fx:id="generalTab" text="%preferences.general">
<graphic>
<FontAwesomeIconView styleClass="fa-icon" glyphName="COGS"/>
</graphic>
<content>
<fx:include source="/fxml/preferences_general.fxml"/>
</content>
</Tab>
<Tab fx:id="updatesTab" text="%preferences.updates">
<graphic>
<FontAwesomeIconView styleClass="fa-icon" glyphName="REFRESH"/>
</graphic>
<content>
<fx:include source="/fxml/preferences_updates.fxml"/>
</content>
</Tab>
<Tab fx:id="volumeTab" text="%preferences.volume">
<graphic>
<FontAwesomeIconView styleClass="fa-icon" glyphName="HDD_ALT"/>
</graphic>
<content>
<fx:include source="/fxml/preferences_volume.fxml"/>
</content>
</Tab>
</tabs>
</TabPane>

View File

@@ -1,13 +1,11 @@
<?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"
@@ -24,21 +22,5 @@
<CheckBox fx:id="startHiddenCheckbox" text="%preferences.general.startHidden"/>
<CheckBox fx:id="debugModeCheckbox" text="%preferences.general.debugLogging"/>
<HBox spacing="6" alignment="BASELINE_LEFT">
<Label text="%preferences.general.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>

View File

@@ -0,0 +1,34 @@
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.geometry.Insets?>
<?import javafx.scene.control.Button?>
<?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.VolumePreferencesController"
spacing="6">
<padding>
<Insets bottom="12" left="12" right="12" top="12"/>
</padding>
<children>
<HBox spacing="6" alignment="BASELINE_LEFT">
<Label text="%preferences.general.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>

View File

@@ -2,6 +2,7 @@
<?import javafx.scene.control.Tab?>
<?import javafx.scene.control.TabPane?>
<?import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView?>
<TabPane xmlns="http://javafx.com/javafx"
xmlns:fx="http://javafx.com/fxml"
fx:id="tabPane"
@@ -11,11 +12,17 @@
tabDragPolicy="FIXED">
<tabs>
<Tab fx:id="generalTab" text="TODO General">
<graphic>
<FontAwesomeIconView styleClass="fa-icon" glyphName="COGS"/>
</graphic>
<content>
<fx:include source="/fxml/vault_options_general.fxml"/>
</content>
</Tab>
<Tab fx:id="updatesTab" text="TODO Mounting">
<Tab fx:id="mountTab" text="TODO Mounting">
<graphic>
<FontAwesomeIconView styleClass="fa-icon" glyphName="HDD_ALT"/>
</graphic>
<content>
<fx:include source="/fxml/vault_options_mount.fxml"/>
</content>

View File

@@ -53,6 +53,8 @@ preferences.general.volumeType=Volume Type
preferences.updates=Updates
preferences.updates.autoUpdateCheck=Check for updates automatically
preferences.updates.checkNowBtn=Check Now
##Volume
preferences.volume=Virtual Drive
main.closeBtn.tooltip=Close
main.settingsBtn.tooltip=Settings

View File

@@ -11,8 +11,9 @@ preferences.autoUpdateCheck=Check for updates automatically
preferences.debugLogging=Enable debug logging
preferences.startHidden=Hide window when starting Cryptomator
preferences.theme=Look & Feel
preferences.volume=Virtual Drive
preferences.volumeType=Volume type
vaultlist.emptyList.onboardingInstruction=Click here to add a vault
vaultOptions.mount.readonly=Read-Only
vaultOptions.mount.driveName=Drive Name
vaultOptions.mount.customMountFlags=Custom Mount Flags
vaultOptions.mount.customMountFlags=Custom Mount Flags