diff --git a/main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java b/main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java index 1fd4fc80c..e2c169266 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java +++ b/main/ui/src/main/java/org/cryptomator/ui/controls/DraggableListCell.java @@ -30,7 +30,7 @@ import javafx.scene.layout.CornerRadii; import javafx.scene.paint.Color; import javafx.scene.paint.Paint; -class DraggableListCell extends ListCell { +public class DraggableListCell extends ListCell { private static final double DROP_LINE_WIDTH = 4.0; private static final Paint DROP_LINE_COLOR = Color.gray(0.0, 0.6); diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index 8c3f103e8..22c8bc6e7 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -52,4 +52,9 @@ public abstract class MainWindowModule { @FxControllerKey(VaultDetailController.class) abstract FxController bindVaultDetailController(VaultDetailController controller); + @Binds + @IntoMap + @FxControllerKey(VaultListCellController.class) + abstract FxController bindVaultListCellController(VaultListCellController controller); + } diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java new file mode 100644 index 000000000..dba8ec5e1 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellController.java @@ -0,0 +1,31 @@ +package org.cryptomator.ui.mainwindow; + +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.model.Vault; + +import javax.inject.Inject; + +// unscoped because each cell needs its own controller +public class VaultListCellController implements FxController { + + private final ObjectProperty vault = new SimpleObjectProperty<>(); + + @Inject + VaultListCellController() {} + + /* Getter/Setter */ + + public ObjectProperty vaultProperty() { + return vault; + } + + public Vault getVault() { + return vault.get(); + } + + public void setVault(Vault value) { + vault.set(value); + } +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellFactory.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellFactory.java new file mode 100644 index 000000000..000417da9 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListCellFactory.java @@ -0,0 +1,61 @@ +package org.cryptomator.ui.mainwindow; + +import javafx.fxml.FXMLLoader; +import javafx.scene.Parent; +import javafx.scene.control.ContentDisplay; +import javafx.scene.control.ListCell; +import javafx.scene.control.ListView; +import javafx.util.Callback; +import org.cryptomator.ui.common.FXMLLoaderFactory; +import org.cryptomator.ui.controls.DraggableListCell; +import org.cryptomator.ui.model.Vault; + +import javax.inject.Inject; +import java.io.IOException; +import java.io.UncheckedIOException; + +@MainWindowScoped +public class VaultListCellFactory implements Callback, ListCell> { + + private final FXMLLoaderFactory fxmlLoaders; + + @Inject + VaultListCellFactory(@MainWindow FXMLLoaderFactory fxmlLoaders) { + this.fxmlLoaders = fxmlLoaders; + } + + @Override + public ListCell call(ListView param) { + try { + FXMLLoader fxmlLoader = fxmlLoaders.load("/fxml/vault_list_cell.fxml"); + return new Cell(fxmlLoader.getRoot(), fxmlLoader.getController()); + } catch (IOException e) { + throw new UncheckedIOException("Failed to load /fxml/vault_list_cell.fxml.", e); + } + } + + private static class Cell extends DraggableListCell { + + private final Parent node; + private final VaultListCellController controller; + + public Cell(Parent node, VaultListCellController controller) { + this.node = node; + this.controller = controller; + } + + @Override + protected void updateItem(Vault item, boolean empty) { + super.updateItem(item, empty); + + if (empty) { + setText(null); + setGraphic(null); + } else { + setContentDisplay(ContentDisplay.GRAPHIC_ONLY); + setGraphic(node); + controller.setVault(item); + } + } + } +} 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 d911a2c8f..2921c1082 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 @@ -16,20 +16,23 @@ public class VaultListController implements FxController { private final ObservableList vaults; private final ObjectProperty selectedVault; + private final VaultListCellFactory cellFactory; private final AddVaultWizardComponent.Builder addVaultWizard; - public ListView vaultList; + public ListView vaultList; public AnchorPane onboardingOverlay; @Inject - VaultListController(ObservableList vaults, ObjectProperty selectedVault, AddVaultWizardComponent.Builder addVaultWizard) { + VaultListController(ObservableList vaults, ObjectProperty selectedVault, VaultListCellFactory cellFactory, AddVaultWizardComponent.Builder addVaultWizard) { this.vaults = vaults; this.selectedVault = selectedVault; + this.cellFactory = cellFactory; this.addVaultWizard = addVaultWizard; } public void initialize() { onboardingOverlay.visibleProperty().bind(Bindings.isEmpty(vaults)); vaultList.setItems(vaults); + vaultList.setCellFactory(cellFactory); selectedVault.bind(vaultList.getSelectionModel().selectedItemProperty()); } diff --git a/main/ui/src/main/resources/fxml/vault_list_cell.fxml b/main/ui/src/main/resources/fxml/vault_list_cell.fxml new file mode 100644 index 000000000..5d41aa709 --- /dev/null +++ b/main/ui/src/main/resources/fxml/vault_list_cell.fxml @@ -0,0 +1,12 @@ + + + + + + +