diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java b/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java index 4a9dba7ad..62321277c 100644 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java +++ b/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultModule.java @@ -45,9 +45,8 @@ public abstract class AddVaultModule { @Provides @AddVaultWizardWindow @AddVaultWizardScoped - static Stage provideStage(StageFactory factory, @PrimaryStage Stage primaryStage, ResourceBundle resourceBundle) { + static Stage provideStage(StageFactory factory, @PrimaryStage Stage primaryStage) { Stage stage = factory.create(); - stage.setTitle(resourceBundle.getString("addvaultwizard.title")); stage.setResizable(false); stage.initModality(Modality.WINDOW_MODAL); stage.initOwner(primaryStage); @@ -90,13 +89,6 @@ public abstract class AddVaultModule { // ------------------ - @Provides - @FxmlScene(FxmlFile.ADDVAULT_WELCOME) - @AddVaultWizardScoped - static Scene provideWelcomeScene(@AddVaultWizardWindow FxmlLoaderFactory fxmlLoaders) { - return fxmlLoaders.createScene(FxmlFile.ADDVAULT_WELCOME); - } - @Provides @FxmlScene(FxmlFile.ADDVAULT_EXISTING) @AddVaultWizardScoped @@ -148,11 +140,6 @@ public abstract class AddVaultModule { // ------------------ - @Binds - @IntoMap - @FxControllerKey(AddVaultWelcomeController.class) - abstract FxController bindWelcomeController(AddVaultWelcomeController controller); - @Binds @IntoMap @FxControllerKey(ChooseExistingVaultController.class) diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java deleted file mode 100644 index 3c13aeb75..000000000 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWelcomeController.java +++ /dev/null @@ -1,38 +0,0 @@ -package org.cryptomator.ui.addvaultwizard; - -import dagger.Lazy; -import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.common.FxmlFile; -import org.cryptomator.ui.common.FxmlScene; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import javax.inject.Inject; -import javafx.scene.Scene; -import javafx.stage.Stage; - -@AddVaultWizardScoped -public class AddVaultWelcomeController implements FxController { - - private static final Logger LOG = LoggerFactory.getLogger(AddVaultWelcomeController.class); - private final Stage window; - private final Lazy chooseExistingVaultScene; - private final Lazy createNewVaultScene; - - @Inject - AddVaultWelcomeController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_EXISTING) Lazy chooseExistingVaultScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_NAME) Lazy createNewVaultScene) { - this.window = window; - this.chooseExistingVaultScene = chooseExistingVaultScene; - this.createNewVaultScene = createNewVaultScene; - } - - public void createNewVault() { - LOG.debug("AddVaultWelcomeController.createNewVault()"); - window.setScene(createNewVaultScene.get()); - } - - public void chooseExistingVault() { - LOG.debug("AddVaultWelcomeController.chooseExistingVault()"); - window.setScene(chooseExistingVaultScene.get()); - } -} diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java b/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java index 1253d8347..c67f999e8 100644 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java +++ b/src/main/java/org/cryptomator/ui/addvaultwizard/AddVaultWizardComponent.java @@ -12,6 +12,7 @@ import org.cryptomator.ui.common.FxmlScene; import javafx.scene.Scene; import javafx.stage.Stage; +import java.util.ResourceBundle; @AddVaultWizardScoped @Subcomponent(modules = {AddVaultModule.class}) @@ -20,12 +21,23 @@ public interface AddVaultWizardComponent { @AddVaultWizardWindow Stage window(); - @FxmlScene(FxmlFile.ADDVAULT_WELCOME) - Lazy scene(); + @FxmlScene(FxmlFile.ADDVAULT_NEW_NAME) + Lazy sceneNew(); + @FxmlScene(FxmlFile.ADDVAULT_EXISTING) + Lazy sceneExisting(); - default void showAddVaultWizard() { + default void showAddNewVaultWizard(ResourceBundle resourceBundle) { Stage stage = window(); - stage.setScene(scene().get()); + stage.setScene(sceneNew().get()); + stage.setTitle(resourceBundle.getString("addvaultwizard.new.title")); + stage.sizeToScene(); + stage.show(); + } + + default void showAddExistingVaultWizard(ResourceBundle resourceBundle) { + Stage stage = window(); + stage.setScene(sceneExisting().get()); + stage.setTitle(resourceBundle.getString("addvaultwizard.existing.title")); stage.sizeToScene(); stage.show(); } diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java index fe4ac3bd1..be9ea15c7 100644 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java +++ b/src/main/java/org/cryptomator/ui/addvaultwizard/ChooseExistingVaultController.java @@ -35,7 +35,6 @@ public class ChooseExistingVaultController implements FxController { private static final Logger LOG = LoggerFactory.getLogger(ChooseExistingVaultController.class); private final Stage window; - private final Lazy welcomeScene; private final Lazy successScene; private final FxApplicationWindows appWindows; private final ObjectProperty vaultPath; @@ -45,9 +44,15 @@ public class ChooseExistingVaultController implements FxController { private final ObservableValue screenshot; @Inject - ChooseExistingVaultController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_WELCOME) Lazy welcomeScene, @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy successScene, FxApplicationWindows appWindows, ObjectProperty vaultPath, @AddVaultWizardWindow ObjectProperty vault, VaultListManager vaultListManager, ResourceBundle resourceBundle, FxApplicationStyle applicationStyle) { + ChooseExistingVaultController(@AddVaultWizardWindow Stage window, // + @FxmlScene(FxmlFile.ADDVAULT_SUCCESS) Lazy successScene, // + FxApplicationWindows appWindows, // + ObjectProperty vaultPath, // + @AddVaultWizardWindow ObjectProperty vault, // + VaultListManager vaultListManager, // + ResourceBundle resourceBundle, // + FxApplicationStyle applicationStyle) { this.window = window; - this.welcomeScene = welcomeScene; this.successScene = successScene; this.appWindows = appWindows; this.vaultPath = vaultPath; @@ -70,11 +75,6 @@ public class ChooseExistingVaultController implements FxController { return new Image((Objects.requireNonNull(getClass().getResource(imageResourcePath)).toString())); } - @FXML - public void back() { - window.setScene(welcomeScene.get()); - } - @FXML public void chooseFileAndNext() { FileChooser fileChooser = new FileChooser(); diff --git a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultNameController.java b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultNameController.java index 2ca73e172..a80baef50 100644 --- a/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultNameController.java +++ b/src/main/java/org/cryptomator/ui/addvaultwizard/CreateNewVaultNameController.java @@ -17,7 +17,6 @@ import javafx.scene.Scene; import javafx.scene.control.TextField; import javafx.stage.Stage; import java.nio.file.Path; -import java.util.ResourceBundle; import java.util.regex.Pattern; @AddVaultWizardScoped @@ -27,16 +26,17 @@ public class CreateNewVaultNameController implements FxController { public TextField textField; private final Stage window; - private final Lazy welcomeScene; private final Lazy chooseLocationScene; private final ObjectProperty vaultPath; private final StringProperty vaultName; private final BooleanBinding validVaultName; @Inject - CreateNewVaultNameController(@AddVaultWizardWindow Stage window, @FxmlScene(FxmlFile.ADDVAULT_WELCOME) Lazy welcomeScene, @FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy chooseLocationScene, ObjectProperty vaultPath, @Named("vaultName") StringProperty vaultName, ResourceBundle resourceBundle) { + CreateNewVaultNameController(@AddVaultWizardWindow Stage window, // + @FxmlScene(FxmlFile.ADDVAULT_NEW_LOCATION) Lazy chooseLocationScene, // + ObjectProperty vaultPath, // + @Named("vaultName") StringProperty vaultName) { this.window = window; - this.welcomeScene = welcomeScene; this.chooseLocationScene = chooseLocationScene; this.vaultPath = vaultPath; this.vaultName = vaultName; @@ -58,11 +58,6 @@ public class CreateNewVaultNameController implements FxController { } } - @FXML - public void back() { - window.setScene(welcomeScene.get()); - } - @FXML public void next() { window.setScene(chooseLocationScene.get()); diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index cefd424ff..678795662 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -8,7 +8,6 @@ public enum FxmlFile { ADDVAULT_NEW_PASSWORD("/fxml/addvault_new_password.fxml"), // ADDVAULT_NEW_RECOVERYKEY("/fxml/addvault_new_recoverykey.fxml"), // ADDVAULT_SUCCESS("/fxml/addvault_success.fxml"), // - ADDVAULT_WELCOME("/fxml/addvault_welcome.fxml"), // CHANGEPASSWORD("/fxml/changepassword.fxml"), // CONVERTVAULT_HUBTOPASSWORD_START("/fxml/convertvault_hubtopassword_start.fxml"), // CONVERTVAULT_HUBTOPASSWORD_CONVERT("/fxml/convertvault_hubtopassword_convert.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowSceneFactory.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowSceneFactory.java index f93f4109d..d78192186 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowSceneFactory.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowSceneFactory.java @@ -16,6 +16,7 @@ import javafx.stage.Stage; public class MainWindowSceneFactory extends DefaultSceneFactory { protected static final KeyCodeCombination SHORTCUT_N = new KeyCodeCombination(KeyCode.N, KeyCombination.SHORTCUT_DOWN); + protected static final KeyCodeCombination SHORTCUT_O = new KeyCodeCombination(KeyCode.O, KeyCombination.SHORTCUT_DOWN); private final Lazy mainWindowTitleController; private final Lazy vaultListController; @@ -34,6 +35,7 @@ public class MainWindowSceneFactory extends DefaultSceneFactory { } else { scene.getAccelerators().put(SHORTCUT_W, mainWindowTitleController.get()::close); } - scene.getAccelerators().put(SHORTCUT_N, vaultListController.get()::didClickAddVault); + scene.getAccelerators().put(SHORTCUT_N, vaultListController.get()::didClickAddNewVault); + scene.getAccelerators().put(SHORTCUT_O, vaultListController.get()::didClickAddExistingVault); } } diff --git a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index f0aadfdfc..357222b33 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -20,7 +20,9 @@ import javafx.beans.property.SimpleBooleanProperty; import javafx.beans.value.ObservableValue; import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; +import javafx.event.Event; import javafx.fxml.FXML; +import javafx.scene.control.Button; import javafx.scene.control.ListView; import javafx.scene.input.ContextMenuEvent; import javafx.scene.input.DragEvent; @@ -34,6 +36,7 @@ import java.io.File; import java.io.IOException; import java.nio.file.Path; import java.util.EnumSet; +import java.util.ResourceBundle; import java.util.Set; import java.util.stream.Collectors; @@ -59,12 +62,21 @@ public class VaultListController implements FxController { private final RemoveVaultComponent.Builder removeVaultDialogue; private final VaultListManager vaultListManager; private final BooleanProperty draggingVaultOver = new SimpleBooleanProperty(); + private final ResourceBundle resourceBundle; public ListView vaultList; public StackPane root; + public Button addVaultBtn; @Inject - VaultListController(@MainWindow Stage mainWindow, ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVaultDialogue, VaultListManager vaultListManager) { + VaultListController(@MainWindow Stage mainWindow, // + ObservableList vaults, // + ObjectProperty selectedVault, // + VaultListCellFactory cellFactory, // + AddVaultWizardComponent.Builder addVaultWizard, // + RemoveVaultComponent.Builder removeVaultDialogue, // + VaultListManager vaultListManager, // + ResourceBundle resourceBundle) { this.mainWindow = mainWindow; this.vaults = vaults; this.selectedVault = selectedVault; @@ -72,6 +84,7 @@ public class VaultListController implements FxController { this.addVaultWizard = addVaultWizard; this.removeVaultDialogue = removeVaultDialogue; this.vaultListManager = vaultListManager; + this.resourceBundle = resourceBundle; this.emptyVaultList = Bindings.isEmpty(vaults); @@ -127,6 +140,15 @@ public class VaultListController implements FxController { root.setOnDragOver(this::handleDragEvent); root.setOnDragDropped(this::handleDragEvent); root.setOnDragExited(this::handleDragEvent); + + addVaultBtn.addEventFilter(ContextMenuEvent.CONTEXT_MENU_REQUESTED, Event::consume); + } + + @FXML + private void showMenu() { + double screenX = addVaultBtn.localToScreen(addVaultBtn.getBoundsInLocal()).getMinX(); + double screenY = addVaultBtn.localToScreen(addVaultBtn.getBoundsInLocal()).getMaxY(); + addVaultBtn.getContextMenu().show(addVaultBtn, screenX, screenY); } private void deselect(MouseEvent released) { @@ -144,8 +166,13 @@ public class VaultListController implements FxController { } @FXML - public void didClickAddVault() { - addVaultWizard.build().showAddVaultWizard(); + public void didClickAddNewVault() { + addVaultWizard.build().showAddNewVaultWizard(resourceBundle); + } + + @FXML + public void didClickAddExistingVault() { + addVaultWizard.build().showAddExistingVaultWizard(resourceBundle); } private void pressedShortcutToRemoveVault() { diff --git a/src/main/resources/css/dark_theme.css b/src/main/resources/css/dark_theme.css index 45cadba93..beb50f6bc 100644 --- a/src/main/resources/css/dark_theme.css +++ b/src/main/resources/css/dark_theme.css @@ -795,6 +795,16 @@ -fx-scale-shape: false; } +/******************************************************************************* + * * + * Add Vault - MenuItem * + * * + ******************************************************************************/ + +.add-vault-menu-item { + -fx-padding: 4px 8px; +} + /******************************************************************************* * * * ProgressBar * diff --git a/src/main/resources/css/light_theme.css b/src/main/resources/css/light_theme.css index c3c0faaa9..a494269b7 100644 --- a/src/main/resources/css/light_theme.css +++ b/src/main/resources/css/light_theme.css @@ -794,6 +794,16 @@ -fx-scale-shape: false; } +/******************************************************************************* + * * + * Add Vault - MenuItem * + * * + ******************************************************************************/ + +.add-vault-menu-item { + -fx-padding: 4px 8px; +} + /******************************************************************************* * * * ProgressBar * diff --git a/src/main/resources/fxml/addvault_existing.fxml b/src/main/resources/fxml/addvault_existing.fxml index c46ad6355..200eae4f9 100644 --- a/src/main/resources/fxml/addvault_existing.fxml +++ b/src/main/resources/fxml/addvault_existing.fxml @@ -24,9 +24,8 @@ - + - - - - - - - diff --git a/src/main/resources/fxml/vault_list.fxml b/src/main/resources/fxml/vault_list.fxml index 80f29f2f7..146fa877c 100644 --- a/src/main/resources/fxml/vault_list.fxml +++ b/src/main/resources/fxml/vault_list.fxml @@ -8,6 +8,8 @@ + + - diff --git a/src/main/resources/i18n/strings.properties b/src/main/resources/i18n/strings.properties index b558691bb..bba386cee 100644 --- a/src/main/resources/i18n/strings.properties +++ b/src/main/resources/i18n/strings.properties @@ -41,10 +41,8 @@ traymenu.vault.reveal=Reveal # Add Vault Wizard addvaultwizard.title=Add Vault -## Welcome -addvaultwizard.welcome.newButton=Create New Vault -addvaultwizard.welcome.existingButton=Open Existing Vault ## New +addvaultwizard.new.title=Add New Vault ### Name addvaultwizard.new.nameInstruction=Choose a name for the vault addvaultwizard.new.namePrompt=Vault Name @@ -94,6 +92,7 @@ addvault.new.readme.accessLocation.2=This is your vault's access location. addvault.new.readme.accessLocation.3=Any files added to this volume will be encrypted by Cryptomator. You can work on it like on any other drive/folder. This is only a decrypted view of its content, your files stay encrypted on your hard drive all the time. addvault.new.readme.accessLocation.4=Feel free to remove this file. ## Existing +addvaultwizard.existing.title=Add Existing Vault addvaultwizard.existing.instruction=Choose the "vault.cryptomator" file of your existing vault. If only a file named "masterkey.cryptomator" exists, select that instead. addvaultwizard.existing.chooseBtn=Choose… addvaultwizard.existing.filePickerTitle=Select Vault File @@ -367,7 +366,9 @@ main.vaultlist.contextMenu.unlock=Unlock… main.vaultlist.contextMenu.unlockNow=Unlock Now main.vaultlist.contextMenu.vaultoptions=Show Vault Options main.vaultlist.contextMenu.reveal=Reveal Drive -main.vaultlist.addVaultBtn=Add Vault +main.vaultlist.addVaultBtn=Add +main.vaultlist.addVaultBtn.menuItemNew=New Vault... +main.vaultlist.addVaultBtn.menuItemExisting=Existing Vault... ## Vault Detail ### Welcome main.vaultDetail.welcomeOnboarding=Thanks for choosing Cryptomator to protect your files. If you need any assistance, check out our getting started guides: