Przeglądaj źródła

made context menu great again:
* added entry to unlock / lock a vault
* added entry to show vault options

Armin Schrenk 4 lat temu
rodzic
commit
0e32e96c7d

+ 71 - 13
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<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 setVaultStateDependencies(VaultState state) {
+		selectedVaultLocked.setValue(state == VaultState.LOCKED);
+		selectedVaultUnlocked.setValue(state == VaultState.UNLOCKED);
 	}
 
-	private void updateSelectedVaultRemovable(ObservableValue<? extends Boolean> observableValue, Boolean oldVal, Boolean newVal) {
-		selectedVaultRemovable.setValue(newVal);
+	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();
+	}
 }

+ 4 - 1
main/ui/src/main/resources/fxml/vault_list.fxml

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

+ 3 - 0
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