diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index ace983167..da1897030 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -23,14 +23,11 @@
-
+
-
-
-
\ No newline at end of file
diff --git a/.idea/modules.xml b/.idea/modules.xml
index bca3878d6..2e793ed5c 100644
--- a/.idea/modules.xml
+++ b/.idea/modules.xml
@@ -3,7 +3,6 @@
-
\ No newline at end of file
diff --git a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java
index 71f43a100..30156ea0c 100644
--- a/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java
+++ b/main/launcher/src/main/java/org/cryptomator/launcher/Cryptomator.java
@@ -89,11 +89,7 @@ public class Cryptomator {
private int runGuiApplication() {
try {
shutdownPerformer.registerShutdownHook();
- Platform.startup(() -> {
- assert Platform.isFxApplicationThread();
- FxApplication app = CRYPTOMATOR_COMPONENT.fxApplicationComponent().application();
- app.start();
- });
+ CRYPTOMATOR_COMPONENT.fxApplicationComponent().start();
shutdownLatch.await();
LOG.info("UI shut down");
return 0;
diff --git a/main/ui/src/main/java/org/cryptomator/ui/FxApplicationComponent.java b/main/ui/src/main/java/org/cryptomator/ui/FxApplicationComponent.java
index 5b029a50c..ac000565c 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/FxApplicationComponent.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/FxApplicationComponent.java
@@ -6,11 +6,20 @@
package org.cryptomator.ui;
import dagger.Subcomponent;
+import javafx.application.Application;
+import javafx.application.Platform;
@FxApplicationScoped
@Subcomponent(modules = FxApplicationModule.class)
public interface FxApplicationComponent {
FxApplication application();
+
+ default void start() {
+ Platform.startup(() -> {
+ assert Platform.isFxApplicationThread();
+ application().start();
+ });
+ }
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/UiModule.java b/main/ui/src/main/java/org/cryptomator/ui/UiModule.java
index 59d652cc1..8447916f6 100644
--- a/main/ui/src/main/java/org/cryptomator/ui/UiModule.java
+++ b/main/ui/src/main/java/org/cryptomator/ui/UiModule.java
@@ -15,10 +15,8 @@ import org.apache.commons.lang3.SystemUtils;
import org.cryptomator.common.settings.Settings;
import org.cryptomator.frontend.webdav.WebDavServer;
import org.cryptomator.keychain.KeychainModule;
-import org.cryptomator.ui.controllers.ViewControllerModule;
import org.cryptomator.ui.mainwindow.MainWindowModule;
import org.cryptomator.ui.model.VaultComponent;
-import org.cryptomator.ui.vaultlist.VaultListModule;
import org.fxmisc.easybind.EasyBind;
import javax.inject.Named;
@@ -29,7 +27,7 @@ import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.function.Consumer;
-@Module(includes = {ViewControllerModule.class, KeychainModule.class, VaultListModule.class, MainWindowModule.class}, subcomponents = {VaultComponent.class})
+@Module(includes = {KeychainModule.class, MainWindowModule.class}, subcomponents = {VaultComponent.class})
public class UiModule {
private static final int NUM_SCHEDULER_THREADS = 4;
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 6a0344ee1..c2b2ae5b3 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
@@ -2,10 +2,16 @@ package org.cryptomator.ui.mainwindow;
import dagger.Binds;
import dagger.Module;
+import dagger.Provides;
import dagger.multibindings.IntoMap;
+import javafx.beans.property.ObjectProperty;
+import javafx.beans.property.SimpleObjectProperty;
+import javafx.collections.ObservableList;
+import org.cryptomator.ui.FxApplicationScoped;
import org.cryptomator.ui.FxController;
import org.cryptomator.ui.FxControllerKey;
-import org.cryptomator.ui.vaultlist.VaultListController;
+import org.cryptomator.ui.model.Vault;
+import org.cryptomator.ui.model.VaultList;
@Module
public abstract class MainWindowModule {
@@ -13,6 +19,27 @@ public abstract class MainWindowModule {
@Binds
@IntoMap
@FxControllerKey(MainWindowController.class)
- abstract FxController bindController(MainWindowController controller);
+ abstract FxController bindMainWindowController(MainWindowController controller);
+
+ @Binds
+ @IntoMap
+ @FxControllerKey(VaultListController.class)
+ abstract FxController bindVaultListController(VaultListController controller);
+
+ @Binds
+ @IntoMap
+ @FxControllerKey(VaultDetailController.class)
+ abstract FxController bindVaultDetailController(VaultDetailController controller);
+
+ // ------------------
+
+ @Binds
+ abstract ObservableList provideVaults(VaultList vaultList);
+
+ @Provides
+ @FxApplicationScoped
+ static ObjectProperty provideSelectedVault() {
+ return new SimpleObjectProperty<>();
+ }
}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java
new file mode 100644
index 000000000..580a9a825
--- /dev/null
+++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultDetailController.java
@@ -0,0 +1,32 @@
+package org.cryptomator.ui.mainwindow;
+
+import javafx.beans.property.ObjectProperty;
+import org.cryptomator.ui.FxApplicationScoped;
+import org.cryptomator.ui.FxController;
+import org.cryptomator.ui.model.Vault;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+
+@FxApplicationScoped
+public class VaultDetailController implements FxController {
+
+ private static final Logger LOG = LoggerFactory.getLogger(VaultDetailController.class);
+
+ private final ObjectProperty vault;
+
+ @Inject
+ VaultDetailController(ObjectProperty vault) {
+ this.vault = vault;
+ }
+
+ public ObjectProperty vaultProperty() {
+ return vault;
+ }
+
+ public Vault getVault() {
+ return vault.get();
+ }
+
+}
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
new file mode 100644
index 000000000..e3e790663
--- /dev/null
+++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/VaultListController.java
@@ -0,0 +1,47 @@
+package org.cryptomator.ui.mainwindow;
+
+import javafx.beans.binding.Bindings;
+import javafx.beans.property.ObjectProperty;
+import javafx.collections.ObservableList;
+import javafx.event.ActionEvent;
+import javafx.fxml.FXML;
+import javafx.scene.control.ListView;
+import javafx.scene.layout.AnchorPane;
+import org.cryptomator.ui.FxApplicationScoped;
+import org.cryptomator.ui.FxController;
+import org.cryptomator.ui.model.Vault;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import javax.inject.Inject;
+
+@FxApplicationScoped
+public class VaultListController implements FxController {
+
+ private static final Logger LOG = LoggerFactory.getLogger(VaultListController.class);
+
+ private final ObservableList vaults;
+ private final ObjectProperty selectedVault;
+ public ListView vaultList;
+ public AnchorPane onboardingOverlay;
+
+ @Inject
+ public VaultListController(ObservableList vaults, ObjectProperty selectedVault) {
+ this.vaults = vaults;
+ this.selectedVault = selectedVault;
+ }
+
+ @FXML
+ public void initialize() {
+ LOG.debug("init VaultListController");
+ onboardingOverlay.visibleProperty().bind(Bindings.isEmpty(vaults));
+ vaultList.setItems(vaults);
+ selectedVault.bind(vaultList.getSelectionModel().selectedItemProperty());
+ }
+
+ public void didClickAddVault(ActionEvent actionEvent) {
+ }
+
+ public void didClickRemoveVault(ActionEvent actionEvent) {
+ }
+}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListController.java b/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListController.java
deleted file mode 100644
index 9e28ba9c5..000000000
--- a/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListController.java
+++ /dev/null
@@ -1,25 +0,0 @@
-package org.cryptomator.ui.vaultlist;
-
-import javafx.fxml.FXML;
-import org.cryptomator.ui.FxApplicationScoped;
-import org.cryptomator.ui.FxController;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import javax.inject.Inject;
-
-@FxApplicationScoped
-public class VaultListController implements FxController {
-
- private static final Logger LOG = LoggerFactory.getLogger(VaultListController.class);
-
- @Inject
- public VaultListController() {
- }
-
- @FXML
- public void initialize() {
- LOG.debug("init VaultListController");
- }
-
-}
diff --git a/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListModule.java b/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListModule.java
deleted file mode 100644
index 86ce99080..000000000
--- a/main/ui/src/main/java/org/cryptomator/ui/vaultlist/VaultListModule.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package org.cryptomator.ui.vaultlist;
-
-import dagger.Binds;
-import dagger.Module;
-import dagger.multibindings.IntoMap;
-import org.cryptomator.ui.FxController;
-import org.cryptomator.ui.FxControllerKey;
-
-@Module
-public abstract class VaultListModule {
-
- @Binds
- @IntoMap
- @FxControllerKey(VaultListController.class)
- abstract FxController bindController(VaultListController controller);
-
-}
diff --git a/main/ui/src/main/resources/fxml/main_window.fxml b/main/ui/src/main/resources/fxml/main_window.fxml
index d0730d023..547d7d3d0 100644
--- a/main/ui/src/main/resources/fxml/main_window.fxml
+++ b/main/ui/src/main/resources/fxml/main_window.fxml
@@ -8,31 +8,33 @@
-
-
-
-
-
-
-
-
-
-
-
-
+ fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
+ styleClass="main-window">
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main/ui/src/main/resources/fxml/vault_detail.fxml b/main/ui/src/main/resources/fxml/vault_detail.fxml
new file mode 100644
index 000000000..6a301e1a3
--- /dev/null
+++ b/main/ui/src/main/resources/fxml/vault_detail.fxml
@@ -0,0 +1,16 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main/ui/src/main/resources/fxml/vault_list.fxml b/main/ui/src/main/resources/fxml/vault_list.fxml
new file mode 100644
index 000000000..1dbd23c1e
--- /dev/null
+++ b/main/ui/src/main/resources/fxml/vault_list.fxml
@@ -0,0 +1,49 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/main/ui/src/main/resources/fxml/vaultlist.fxml b/main/ui/src/main/resources/fxml/vaultlist.fxml
deleted file mode 100644
index 344ceade7..000000000
--- a/main/ui/src/main/resources/fxml/vaultlist.fxml
+++ /dev/null
@@ -1,9 +0,0 @@
-
-
-
-
-
-
-
diff --git a/main/ui/src/main/resources/i18n/strings.properties b/main/ui/src/main/resources/i18n/strings.properties
index 99c76666b..d47a4cb32 100644
--- a/main/ui/src/main/resources/i18n/strings.properties
+++ b/main/ui/src/main/resources/i18n/strings.properties
@@ -1,3 +1,3 @@
main.closeBtn.tooltip=Close
main.settingsBtn.tooltip=Settings
-title=Cryptomator
\ No newline at end of file
+vaultlist.emptyList.onboardingInstruction=Click here to add a vault
\ No newline at end of file
diff --git a/main/ui/src/main/resources/i18n/strings_de.properties b/main/ui/src/main/resources/i18n/strings_de.properties
index 3f4eb3198..131176730 100644
--- a/main/ui/src/main/resources/i18n/strings_de.properties
+++ b/main/ui/src/main/resources/i18n/strings_de.properties
@@ -1,3 +1,3 @@
main.closeBtn.tooltip=Close
main.settingsBtn.tooltip=Settings
-title=CryptomatorDE
\ No newline at end of file
+vaultlist.emptyList.onboardingInstruction=Klicken Sie hier, um neue Tresore hinzuzufügen
\ No newline at end of file
diff --git a/main/ui/src/main/resources/i18n/strings_en.properties b/main/ui/src/main/resources/i18n/strings_en.properties
index 8c23b81fa..d47a4cb32 100644
--- a/main/ui/src/main/resources/i18n/strings_en.properties
+++ b/main/ui/src/main/resources/i18n/strings_en.properties
@@ -1,3 +1,3 @@
main.closeBtn.tooltip=Close
main.settingsBtn.tooltip=Settings
-title=CryptomatorEN
\ No newline at end of file
+vaultlist.emptyList.onboardingInstruction=Click here to add a vault
\ No newline at end of file