made context menu great again:

* added entry to unlock / lock a vault
* added entry to show vault options
This commit is contained in:
Armin Schrenk
2021-03-22 17:10:45 +01:00
parent 97afadd7b9
commit 0e32e96c7d
3 changed files with 78 additions and 14 deletions

View File

@@ -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<Vault> vaults;
private final ObjectProperty<Vault> 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<Vault> vaultList;
@Inject
VaultListController(ObservableList<Vault> vaults, ObjectProperty<Vault> selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard, RemoveVaultComponent.Builder removeVault) {
VaultListController(ObservableList<Vault> vaults, ObjectProperty<Vault> 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<? extends Vault> observableValue, @SuppressWarnings("unused") Vault oldValue, Vault newValue) {
if(oldValue != null){
oldValue.lockedProperty().removeListener((ChangeListener<? super Boolean>) this::updateSelectedVaultRemovable);
if (oldValue != null) {
oldValue.stateProperty().removeListener((ChangeListener<? super VaultState>) this::updateVaultStateDependencies);
}
if (newValue == null) {
return;
}
VaultListManager.redetermineVaultState(newValue);
selectedVaultRemovable.setValue(newValue.isLocked());
newValue.lockedProperty().addListener((ChangeListener<? super Boolean>) this::updateSelectedVaultRemovable);
setVaultStateDependencies(newValue.getState());
newValue.stateProperty().addListener((ChangeListener<? super VaultState>) this::updateVaultStateDependencies);
}
private void updateSelectedVaultRemovable(ObservableValue<? extends Boolean> 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<? extends VaultState> 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();
}
}

View File

@@ -19,7 +19,10 @@
<contextMenu>
<ContextMenu>
<items>
<MenuItem text="%main.vaultlist.contextMenu.remove" onAction="#didClickRemoveVault" disable="${!controller.selectedVaultRemovable}"/>
<MenuItem fx:id="lockEntry" text="%main.vaultlist.contextMenu.lock" onAction="#didClickLockVault" visible="${controller.selectedVaultUnlocked}"/>
<MenuItem fx:id="unlockEntry" text="%main.vaultlist.contextMenu.unlock" onAction="#didClickUnlockVault" visible="${controller.selectedVaultLocked}"/>
<MenuItem fx:id="optionsEntry" text="%main.vaultlist.contextMenu.vaultoptions" onAction="#didClickShowVaultOptions" disable="${!controller.selectedVaultLocked}"/>
<MenuItem fx:id="removeEntry" text="%main.vaultlist.contextMenu.remove" onAction="#didClickRemoveVault" disable="${!controller.selectedVaultLocked}"/>
</items>
</ContextMenu>
</contextMenu>

View File

@@ -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