diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java index e7da43938..bc2f2100a 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailLockedController.java @@ -5,6 +5,7 @@ import org.cryptomator.common.keychain.KeychainManager; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.fxapp.FxApplication; +import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab; import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import javax.inject.Inject; @@ -47,7 +48,12 @@ public class VaultDetailLockedController implements FxController { @FXML public void showVaultOptions() { - vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(); + vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(SelectedVaultOptionsTab.ANY); + } + + @FXML + public void showKeyVaultOptions() { + vaultOptionsWindow.vault(vault.get()).build().showVaultOptionsWindow(SelectedVaultOptionsTab.KEY); } /* Getter/Setter */ diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java new file mode 100644 index 000000000..86945374a --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/SelectedVaultOptionsTab.java @@ -0,0 +1,23 @@ +package org.cryptomator.ui.vaultoptions; + +public enum SelectedVaultOptionsTab { + /** + * Let the controller decide which tab to show. + */ + ANY, + + /** + * Show general tab + */ + GENERAL, + + /** + * Show mounting tab + */ + MOUNT, + + /** + * Show password tab + */ + KEY, +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java index 09b362aff..e56c30f5c 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsComponent.java @@ -12,6 +12,7 @@ import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import javafx.beans.property.ObjectProperty; import javafx.scene.Scene; import javafx.stage.Stage; @@ -25,7 +26,10 @@ public interface VaultOptionsComponent { @FxmlScene(FxmlFile.VAULT_OPTIONS) Lazy scene(); - default void showVaultOptionsWindow() { + ObjectProperty selectedTabProperty(); + + default void showVaultOptionsWindow(SelectedVaultOptionsTab selectedTab) { + selectedTabProperty().set(selectedTab); Stage stage = window(); stage.setScene(scene().get()); stage.show(); diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java index ab71d08b7..15879e316 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsController.java @@ -1,13 +1,67 @@ package org.cryptomator.ui.vaultoptions; import org.cryptomator.ui.common.FxController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javafx.beans.property.ObjectProperty; +import javafx.fxml.FXML; +import javafx.scene.control.Tab; +import javafx.scene.control.TabPane; +import javafx.stage.Stage; +import javafx.stage.WindowEvent; @VaultOptionsScoped public class VaultOptionsController implements FxController { + private static final Logger LOG = LoggerFactory.getLogger(VaultOptionsController.class); + + private final Stage window; + private final ObjectProperty selectedTabProperty; + public TabPane tabPane; + public Tab generalTab; + public Tab mountTab; + public Tab keyTab; + @Inject - VaultOptionsController() {} + VaultOptionsController(@VaultOptionsWindow Stage window, ObjectProperty selectedTabProperty) { + this.window = window; + this.selectedTabProperty = selectedTabProperty; + } + + @FXML + public void initialize() { + window.setOnShowing(this::windowWillAppear); + selectedTabProperty.addListener(observable -> this.selectChosenTab()); + tabPane.getSelectionModel().selectedItemProperty().addListener(observable -> this.selectedTabChanged()); + } + + private void selectChosenTab() { + Tab toBeSelected = getTabToSelect(selectedTabProperty.get()); + tabPane.getSelectionModel().select(toBeSelected); + } + + private Tab getTabToSelect(SelectedVaultOptionsTab selectedTab) { + return switch (selectedTab) { + case ANY, GENERAL -> generalTab; + case MOUNT -> mountTab; + case KEY -> keyTab; + }; + } + + private void selectedTabChanged() { + Tab selectedTab = tabPane.getSelectionModel().getSelectedItem(); + try { + SelectedVaultOptionsTab selectedVaultOptionsTab = SelectedVaultOptionsTab.valueOf(selectedTab.getId()); + selectedTabProperty.set(selectedVaultOptionsTab); + } catch (IllegalArgumentException e) { + LOG.error("Unknown vault options tab id: {}", selectedTab.getId()); + } + } + + private void windowWillAppear(@SuppressWarnings("unused") WindowEvent windowEvent) { + selectChosenTab(); + } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java index bf47c294c..fb248f38e 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/vaultoptions/VaultOptionsModule.java @@ -7,16 +7,18 @@ import dagger.multibindings.IntoMap; import org.cryptomator.common.vaults.Vault; import org.cryptomator.ui.changepassword.ChangePasswordComponent; import org.cryptomator.ui.common.DefaultSceneFactory; -import org.cryptomator.ui.common.FxmlLoaderFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxControllerKey; import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlLoaderFactory; import org.cryptomator.ui.common.FxmlScene; import org.cryptomator.ui.common.StageFactory; import org.cryptomator.ui.mainwindow.MainWindow; import org.cryptomator.ui.recoverykey.RecoveryKeyComponent; import javax.inject.Provider; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; @@ -26,6 +28,12 @@ import java.util.ResourceBundle; @Module(subcomponents = {ChangePasswordComponent.class, RecoveryKeyComponent.class}) abstract class VaultOptionsModule { + @Provides + @VaultOptionsScoped + static ObjectProperty provideSelectedTabProperty() { + return new SimpleObjectProperty<>(SelectedVaultOptionsTab.ANY); + } + @Provides @VaultOptionsWindow @VaultOptionsScoped diff --git a/main/ui/src/main/resources/fxml/vault_detail_locked.fxml b/main/ui/src/main/resources/fxml/vault_detail_locked.fxml index aa4f5e855..d4bbc7e4a 100644 --- a/main/ui/src/main/resources/fxml/vault_detail_locked.fxml +++ b/main/ui/src/main/resources/fxml/vault_detail_locked.fxml @@ -3,7 +3,6 @@ - @@ -25,18 +24,20 @@ - + - + + - -