diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java index 106d118e8..dbe858a55 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java @@ -1,9 +1,11 @@ package org.cryptomator.ui.mainwindow; +import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultListManager; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.removevault.RemoveVaultComponent; import javax.inject.Inject; import javafx.beans.binding.Bindings; @@ -15,9 +17,16 @@ import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.ListView; import javafx.scene.input.ContextMenuEvent; +import javafx.scene.input.KeyCode; import javafx.scene.input.KeyEvent; import javafx.scene.input.MouseEvent; import javafx.stage.Stage; +import java.util.EnumSet; + +import static org.cryptomator.common.vaults.VaultState.Value.ERROR; +import static org.cryptomator.common.vaults.VaultState.Value.LOCKED; +import static org.cryptomator.common.vaults.VaultState.Value.MISSING; +import static org.cryptomator.common.vaults.VaultState.Value.NEEDS_MIGRATION; @MainWindowScoped public class VaultListController implements FxController { @@ -29,16 +38,18 @@ public class VaultListController implements FxController { private final VaultListCellFactory cellFactory; private final AddVaultWizardComponent.Builder addVaultWizard; private final BooleanBinding emptyVaultList; + private final RemoveVaultComponent.Builder removeVaultDialogue; public ListView vaultList; @Inject - VaultListController(@MainWindow Stage mainWindow, ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard) { + VaultListController(@MainWindow Stage mainWindow, ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVaultDialogue) { this.mainWindow = mainWindow; this.vaults = vaults; this.selectedVault = selectedVault; this.cellFactory = cellFactory; this.addVaultWizard = addVaultWizard; + this.removeVaultDialogue = removeVaultDialogue; this.emptyVaultList = Bindings.isEmpty(vaults); @@ -63,7 +74,22 @@ public class VaultListController implements FxController { request.consume(); } }); - //register vault selection shortcut globally + vaultList.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> { + if (keyEvent.getCode() == KeyCode.DELETE) { + pressedShortcutToRemoveVault(); + keyEvent.consume(); + } + }); + if (SystemUtils.IS_OS_MAC) { + vaultList.addEventFilter(KeyEvent.KEY_PRESSED, keyEvent -> { + if (keyEvent.getCode() == KeyCode.BACK_SPACE) { + pressedShortcutToRemoveVault(); + keyEvent.consume(); + } + }); + } + + //register vault selection shortcut to the main window mainWindow.addEventFilter(KeyEvent.KEY_RELEASED, keyEvent -> { if (keyEvent.isShortcutDown() && keyEvent.getCode().isDigitKey()) { vaultList.getSelectionModel().select(Integer.parseInt(keyEvent.getText()) - 1); @@ -91,6 +117,13 @@ public class VaultListController implements FxController { addVaultWizard.build().showAddVaultWizard(); } + private void pressedShortcutToRemoveVault() { + final var vault = selectedVault.get(); + if (vault != null && EnumSet.of(LOCKED, MISSING, ERROR, NEEDS_MIGRATION).contains(vault.getState())) { + removeVaultDialogue.vault(vault).build().showRemoveVault(); + } + } + // Getter and Setter public BooleanBinding emptyVaultListProperty() {