From a3382c2d5b375e770c8e23f3ef2bf16064243458 Mon Sep 17 00:00:00 2001 From: Sebastian Stenzel Date: Mon, 15 Jul 2019 16:39:21 +0200 Subject: [PATCH] hook up preferences window --- .../org/cryptomator/ui/FxApplication.java | 53 ++++++++++++++----- .../cryptomator/ui/FxApplicationModule.java | 11 +--- .../java/org/cryptomator/ui/UiModule.java | 3 +- .../cryptomator/ui/mainwindow/MainWindow.java | 13 +++++ .../ui/mainwindow/MainWindowController.java | 12 ++++- .../ui/mainwindow/MainWindowModule.java | 15 +++++- .../ui/preferences/PreferencesController.java | 13 +++++ .../ui/preferences/PreferencesModule.java | 34 ++++++++++++ .../ui/preferences/PreferencesWindow.java | 13 +++++ .../src/main/resources/fxml/main_window.fxml | 2 +- .../src/main/resources/fxml/preferences.fxml | 10 ++++ 11 files changed, 151 insertions(+), 28 deletions(-) create mode 100644 main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindow.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java create mode 100644 main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesWindow.java create mode 100644 main/ui/src/main/resources/fxml/preferences.fxml diff --git a/main/ui/src/main/java/org/cryptomator/ui/FxApplication.java b/main/ui/src/main/java/org/cryptomator/ui/FxApplication.java index 8ffff75cd..41973dc57 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/FxApplication.java +++ b/main/ui/src/main/java/org/cryptomator/ui/FxApplication.java @@ -1,14 +1,18 @@ package org.cryptomator.ui; import javafx.application.Application; +import javafx.application.Platform; import javafx.scene.Parent; import javafx.scene.Scene; import javafx.stage.Stage; +import org.cryptomator.ui.mainwindow.MainWindow; +import org.cryptomator.ui.preferences.PreferencesWindow; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; -import javax.inject.Named; +import java.awt.Desktop; +import java.awt.desktop.PreferencesEvent; import java.io.IOException; import java.io.UncheckedIOException; @@ -17,29 +21,52 @@ public class FxApplication extends Application { private static final Logger LOG = LoggerFactory.getLogger(FxApplication.class); - private final Stage primaryStage; + private final Stage mainWindow; + private final Stage preferencesWindow; private final FXMLLoaderFactory fxmlLoaders; @Inject - FxApplication(@Named("mainWindow") Stage primaryStage, FXMLLoaderFactory fxmlLoaders) { - this.primaryStage = primaryStage; + FxApplication(@MainWindow Stage mainWindow, @PreferencesWindow Stage preferencesWindow, FXMLLoaderFactory fxmlLoaders) { + this.mainWindow = mainWindow; + this.preferencesWindow = preferencesWindow; this.fxmlLoaders = fxmlLoaders; } public void start() { - try { - LOG.info("Starting GUI..."); - start(primaryStage); - } catch (IOException e) { - throw new UncheckedIOException(e); + LOG.trace("FxApplication.start()"); + if (Desktop.getDesktop().isSupported(Desktop.Action.APP_PREFERENCES)) { + Desktop.getDesktop().setPreferencesHandler(this::handlePreferences); } + + start(mainWindow); } @Override - public void start(Stage stage) throws IOException { - Parent root = fxmlLoaders.load("/fxml/main_window.fxml").getRoot(); - stage.setScene(new Scene(root)); - stage.show(); + public void start(Stage stage) { + assert stage == mainWindow; + showMainWindow(); + } + + private void handlePreferences(PreferencesEvent preferencesEvent) { + Platform.runLater(this::showPreferencesWindow); + } + + public void showMainWindow() { + showViewInWindow("/fxml/main_window.fxml", mainWindow); + } + + public void showPreferencesWindow() { + showViewInWindow("/fxml/preferences.fxml", preferencesWindow); + } + + private void showViewInWindow(String fxmlResourceName, Stage window) { + try { + Parent root = fxmlLoaders.load(fxmlResourceName).getRoot(); + window.setScene(new Scene(root)); + window.show(); + } catch (IOException e) { + LOG.error("Failed to load " + fxmlResourceName, e); + } } } diff --git a/main/ui/src/main/java/org/cryptomator/ui/FxApplicationModule.java b/main/ui/src/main/java/org/cryptomator/ui/FxApplicationModule.java index 658204c9b..a57e09ec5 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/FxApplicationModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/FxApplicationModule.java @@ -17,16 +17,7 @@ import javax.inject.Named; @Module(includes = {UiModule.class}) abstract class FxApplicationModule { - @Provides - @FxApplicationScoped - @Named("mainWindow") - static Stage providePrimaryStage() { - Stage stage = new Stage(); - stage.setMinWidth(652.0); - stage.setMinHeight(440.0); - stage.initStyle(StageStyle.UNDECORATED); - return stage; - } + @Binds @FxApplicationScoped 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 8447916f6..9b9922061 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/UiModule.java +++ b/main/ui/src/main/java/org/cryptomator/ui/UiModule.java @@ -17,6 +17,7 @@ import org.cryptomator.frontend.webdav.WebDavServer; import org.cryptomator.keychain.KeychainModule; import org.cryptomator.ui.mainwindow.MainWindowModule; import org.cryptomator.ui.model.VaultComponent; +import org.cryptomator.ui.preferences.PreferencesModule; import org.fxmisc.easybind.EasyBind; import javax.inject.Named; @@ -27,7 +28,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.atomic.AtomicInteger; import java.util.function.Consumer; -@Module(includes = {KeychainModule.class, MainWindowModule.class}, subcomponents = {VaultComponent.class}) +@Module(includes = {KeychainModule.class, MainWindowModule.class, PreferencesModule.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/MainWindow.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindow.java new file mode 100644 index 000000000..33c534139 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindow.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.mainwindow; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Qualifier +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface MainWindow { + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java index 3a9cbc828..6712f0f34 100644 --- a/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java +++ b/main/ui/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java @@ -1,9 +1,10 @@ package org.cryptomator.ui.mainwindow; -import javafx.application.Application; +import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.layout.HBox; import javafx.stage.Stage; +import org.cryptomator.ui.FxApplication; import org.cryptomator.ui.FxApplicationScoped; import org.cryptomator.ui.FxController; import org.slf4j.Logger; @@ -20,6 +21,7 @@ public class MainWindowController implements FxController { private final CountDownLatch shutdownLatch; private final Stage mainWindow; + private final FxApplication application; @FXML public HBox titleBar; @@ -28,9 +30,10 @@ public class MainWindowController implements FxController { private double yOffset; @Inject - public MainWindowController(@Named("shutdownLatch") CountDownLatch shutdownLatch, @Named("mainWindow") Stage mainWindow) { + public MainWindowController(@Named("shutdownLatch") CountDownLatch shutdownLatch, @MainWindow Stage mainWindow, FxApplication application) { this.shutdownLatch = shutdownLatch; this.mainWindow = mainWindow; + this.application = application; } @FXML @@ -52,4 +55,9 @@ public class MainWindowController implements FxController { LOG.info("closed..."); shutdownLatch.countDown(); } + + @FXML + public void showPreferences() { + application.showPreferencesWindow(); + } } 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 c2b2ae5b3..1f6bf0907 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 @@ -7,6 +7,8 @@ import dagger.multibindings.IntoMap; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.collections.ObservableList; +import javafx.stage.Stage; +import javafx.stage.StageStyle; import org.cryptomator.ui.FxApplicationScoped; import org.cryptomator.ui.FxController; import org.cryptomator.ui.FxControllerKey; @@ -33,8 +35,19 @@ public abstract class MainWindowModule { // ------------------ + @Provides + @FxApplicationScoped + @MainWindow + static Stage providePrimaryStage() { + Stage stage = new Stage(); + stage.setMinWidth(652.0); + stage.setMinHeight(440.0); + stage.initStyle(StageStyle.UNDECORATED); + return stage; + } + @Binds - abstract ObservableList provideVaults(VaultList vaultList); + abstract ObservableList bindVaultList(VaultList vaultList); @Provides @FxApplicationScoped diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java new file mode 100644 index 000000000..1265a3e9f --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesController.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.preferences; + +import org.cryptomator.ui.FxController; + +import javax.inject.Inject; + +@PreferencesWindow +public class PreferencesController implements FxController { + + @Inject + PreferencesController() {} + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java new file mode 100644 index 000000000..11896f034 --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesModule.java @@ -0,0 +1,34 @@ +package org.cryptomator.ui.preferences; + +import dagger.Binds; +import dagger.Module; +import dagger.Provides; +import dagger.multibindings.IntoMap; +import javafx.stage.Modality; +import javafx.stage.Stage; +import org.cryptomator.ui.FxApplicationScoped; +import org.cryptomator.ui.FxController; +import org.cryptomator.ui.FxControllerKey; +import org.cryptomator.ui.mainwindow.MainWindow; + +@Module +public abstract class PreferencesModule { + + @Binds + @IntoMap + @FxControllerKey(PreferencesController.class) + abstract FxController bindPreferencesController(PreferencesController controller); + + @Provides + @FxApplicationScoped + @PreferencesWindow + static Stage providePreferencesStage(@MainWindow Stage mainWindow) { + Stage stage = new Stage(); + stage.setMinWidth(400); + stage.setMinHeight(300); + stage.initModality(Modality.APPLICATION_MODAL); + stage.initOwner(mainWindow); + return stage; + } + +} diff --git a/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesWindow.java b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesWindow.java new file mode 100644 index 000000000..a2bc2b81d --- /dev/null +++ b/main/ui/src/main/java/org/cryptomator/ui/preferences/PreferencesWindow.java @@ -0,0 +1,13 @@ +package org.cryptomator.ui.preferences; + +import javax.inject.Qualifier; +import java.lang.annotation.Documented; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; + +@Qualifier +@Documented +@Retention(RetentionPolicy.RUNTIME) +public @interface PreferencesWindow { + +} diff --git a/main/ui/src/main/resources/fxml/main_window.fxml b/main/ui/src/main/resources/fxml/main_window.fxml index 547d7d3d0..a95a3a70b 100644 --- a/main/ui/src/main/resources/fxml/main_window.fxml +++ b/main/ui/src/main/resources/fxml/main_window.fxml @@ -15,7 +15,7 @@ -