From 0e32e96c7de77f4dfe43f4899e148515e8d30458 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Mon, 22 Mar 2021 17:10:45 +0100 Subject: [PATCH] made context menu great again: * added entry to unlock / lock a vault * added entry to show vault options --- .../ui/mainwindow/VaultListController.java | 84 ++++++++++++++++--- .../src/main/resources/fxml/vault_list.fxml | 5 +- .../main/resources/i18n/strings.properties | 3 + 3 files changed, 78 insertions(+), 14 deletions(-) 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 f66ef36be..66e42b667 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 @@ -2,9 +2,13 @@ package org.cryptomator.ui.mainwindow; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultListManager; +import org.cryptomator.common.vaults.VaultState; import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.fxapp.FxApplication; import org.cryptomator.ui.removevault.RemoveVaultComponent; +import org.cryptomator.ui.vaultoptions.SelectedVaultOptionsTab; +import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -20,6 +24,8 @@ import javafx.collections.ListChangeListener; import javafx.collections.ObservableList; import javafx.fxml.FXML; import javafx.scene.control.ListView; +import javafx.stage.Stage; +import java.util.Optional; @MainWindowScoped public class VaultListController implements FxController { @@ -28,24 +34,33 @@ public class VaultListController implements FxController { private final ObservableList vaults; private final ObjectProperty selectedVault; - private final BooleanProperty selectedVaultRemovable; + private final BooleanProperty selectedVaultLocked; + private final BooleanProperty selectedVaultUnlocked; private final VaultListCellFactory cellFactory; + private final Stage mainWindow; + private final FxApplication application; private final AddVaultWizardComponent.Builder addVaultWizard; private final RemoveVaultComponent.Builder removeVault; + private final VaultOptionsComponent.Builder vaultOptionsWindow; private final BooleanBinding noVaultSelected; private final BooleanBinding emptyVaultList; + public ListView vaultList; @Inject - VaultListController(ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVault) { + VaultListController(ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, @MainWindow Stage mainWindow, FxApplication application, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVault, VaultOptionsComponent.Builder vaultOptionsWindow) { this.vaults = vaults; this.selectedVault = selectedVault; this.cellFactory = cellFactory; + this.mainWindow = mainWindow; + this.application = application; this.addVaultWizard = addVaultWizard; this.removeVault = removeVault; this.noVaultSelected = selectedVault.isNull(); this.emptyVaultList = Bindings.isEmpty(vaults); - this.selectedVaultRemovable = new SimpleBooleanProperty(false); + this.vaultOptionsWindow = vaultOptionsWindow; + this.selectedVaultLocked = new SimpleBooleanProperty(false); + this.selectedVaultUnlocked = new SimpleBooleanProperty(false); selectedVault.addListener(this::selectedVaultDidChange); } @@ -64,19 +79,25 @@ public class VaultListController implements FxController { } private void selectedVaultDidChange(@SuppressWarnings("unused") ObservableValue observableValue, @SuppressWarnings("unused") Vault oldValue, Vault newValue) { - if(oldValue != null){ - oldValue.lockedProperty().removeListener((ChangeListener) this::updateSelectedVaultRemovable); + if (oldValue != null) { + oldValue.stateProperty().removeListener((ChangeListener) this::updateVaultStateDependencies); } if (newValue == null) { return; } VaultListManager.redetermineVaultState(newValue); - selectedVaultRemovable.setValue(newValue.isLocked()); - newValue.lockedProperty().addListener((ChangeListener) this::updateSelectedVaultRemovable); + setVaultStateDependencies(newValue.getState()); + newValue.stateProperty().addListener((ChangeListener) this::updateVaultStateDependencies); } - private void updateSelectedVaultRemovable(ObservableValue observableValue, Boolean oldVal, Boolean newVal) { - selectedVaultRemovable.setValue(newVal); + private void setVaultStateDependencies(VaultState state) { + selectedVaultLocked.setValue(state == VaultState.LOCKED); + selectedVaultUnlocked.setValue(state == VaultState.UNLOCKED); + } + + private void updateVaultStateDependencies(ObservableValue observableValue, VaultState oldVal, VaultState newVal) { + selectedVaultLocked.setValue(newVal == VaultState.LOCKED); + selectedVaultUnlocked.setValue(newVal == VaultState.UNLOCKED); } @@ -95,6 +116,36 @@ public class VaultListController implements FxController { } } + @FXML + public void didClickShowVaultOptions() { + Vault v = selectedVault.get(); + if (v != null) { + vaultOptionsWindow.vault(v).build().showVaultOptionsWindow(SelectedVaultOptionsTab.ANY); + } else { + LOG.debug("Cannot open vault options if none is selected."); + } + } + + @FXML + public void didClickUnlockVault() { + Vault v = selectedVault.get(); + if (v != null) { + application.startUnlockWorkflow(v, Optional.of(mainWindow)); + } else { + LOG.debug("Cannot unlock vault if none is selected."); + } + } + + @FXML + public void didClickLockVault() { + Vault v = selectedVault.get(); + if (v != null) { + application.startLockWorkflow(v, Optional.of(mainWindow)); + } else { + LOG.debug("Cannot lock vault if none is selected."); + } + } + // Getter and Setter public BooleanBinding emptyVaultListProperty() { @@ -113,12 +164,19 @@ public class VaultListController implements FxController { return noVaultSelected.get(); } - public BooleanProperty selectedVaultRemovableProperty() { - return selectedVaultRemovable; + public BooleanProperty selectedVaultLockedProperty() { + return selectedVaultLocked; } - public boolean isSelectedVaultRemovable() { - return selectedVaultRemovable.get(); + public boolean isSelectedVaultLocked() { + return selectedVaultLocked.get(); } + public BooleanProperty selectedVaultUnlockedProperty() { + return selectedVaultUnlocked; + } + + public boolean isSelectedVaultUnlocked() { + return selectedVaultUnlocked.get(); + } } diff --git a/main/ui/src/main/resources/fxml/vault_list.fxml b/main/ui/src/main/resources/fxml/vault_list.fxml index e7362ffbb..5791a8882 100644 --- a/main/ui/src/main/resources/fxml/vault_list.fxml +++ b/main/ui/src/main/resources/fxml/vault_list.fxml @@ -19,7 +19,10 @@ - + + + + diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties index 20aa17a14..583468674 100644 --- a/main/ui/src/main/resources/i18n/strings.properties +++ b/main/ui/src/main/resources/i18n/strings.properties @@ -225,6 +225,9 @@ main.dropZone.unknownDragboardContent=If you want to add a vault, drag it to thi ## Vault List main.vaultlist.emptyList.onboardingInstruction=Click here to add a vault main.vaultlist.contextMenu.remove=Remove Vault… +main.vaultlist.contextMenu.lock=Lock Vault… +main.vaultlist.contextMenu.unlock=Unlock Vault… +main.vaultlist.contextMenu.vaultoptions=Show Vault Options main.vaultlist.addVaultBtn=Add Vault ## Vault Detail ### Welcome