|
@@ -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<Vault> vaultList;
|
|
|
|
|
|
@Inject
|
|
|
- VaultListController(@MainWindow Stage mainWindow, ObservableList<Vault> vaults, ObjectProperty<Vault> selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard) {
|
|
|
+ VaultListController(@MainWindow Stage mainWindow, ObservableList<Vault> vaults, ObjectProperty<Vault> 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() {
|