From 396b541cd249a98d0cc9b368857c16a1ba863d46 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 15:36:10 +0200 Subject: [PATCH 01/46] safe position settings --- .../cryptomator/common/settings/Settings.java | 25 +++++++++++++++++++ .../common/settings/SettingsJsonAdapter.java | 10 ++++++++ 2 files changed, 35 insertions(+) diff --git a/src/main/java/org/cryptomator/common/settings/Settings.java b/src/main/java/org/cryptomator/common/settings/Settings.java index e4cb9b8f7..5d2cd7c22 100644 --- a/src/main/java/org/cryptomator/common/settings/Settings.java +++ b/src/main/java/org/cryptomator/common/settings/Settings.java @@ -59,6 +59,11 @@ public class Settings { private final StringProperty licenseKey = new SimpleStringProperty(DEFAULT_LICENSE_KEY); private final BooleanProperty showMinimizeButton = new SimpleBooleanProperty(DEFAULT_SHOW_MINIMIZE_BUTTON); private final BooleanProperty showTrayIcon; + private final IntegerProperty windowXPosition = new SimpleIntegerProperty(); + private final IntegerProperty windowYPosition = new SimpleIntegerProperty(); + private final IntegerProperty windowWidth = new SimpleIntegerProperty(); + private final IntegerProperty windowHeight = new SimpleIntegerProperty(); + private Consumer saveCmd; @@ -83,6 +88,10 @@ public class Settings { licenseKey.addListener(this::somethingChanged); showMinimizeButton.addListener(this::somethingChanged); showTrayIcon.addListener(this::somethingChanged); + windowXPosition.addListener(this::somethingChanged); + windowYPosition.addListener(this::somethingChanged); + windowWidth.addListener(this::somethingChanged); + windowHeight.addListener(this::somethingChanged); } void setSaveCmd(Consumer saveCmd) { @@ -158,4 +167,20 @@ public class Settings { public BooleanProperty showTrayIcon() { return showTrayIcon; } + + public IntegerProperty windowXPositionProperty() { + return windowXPosition; + } + + public IntegerProperty windowYPositionProperty() { + return windowYPosition; + } + + public IntegerProperty windowWidthProperty() { + return windowWidth; + } + + public IntegerProperty windowHeightProperty() { + return windowHeight; + } } diff --git a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java index 5bcb5f3d7..f390f0b84 100644 --- a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java +++ b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java @@ -52,6 +52,11 @@ public class SettingsJsonAdapter extends TypeAdapter { out.name("licenseKey").value(value.licenseKey().get()); out.name("showMinimizeButton").value(value.showMinimizeButton().get()); out.name("showTrayIcon").value(value.showTrayIcon().get()); + out.name("windowXPosition").value((value.windowXPositionProperty().get())); + out.name("windowYPosition").value((value.windowYPositionProperty().get())); + out.name("windowWidth").value((value.windowWidthProperty().get())); + out.name("windowHeight").value((value.windowHeightProperty().get())); + out.endObject(); } @@ -86,6 +91,11 @@ public class SettingsJsonAdapter extends TypeAdapter { case "licenseKey" -> settings.licenseKey().set(in.nextString()); case "showMinimizeButton" -> settings.showMinimizeButton().set(in.nextBoolean()); case "showTrayIcon" -> settings.showTrayIcon().set(in.nextBoolean()); + case "windowXPosition" -> settings.windowXPositionProperty().set(in.nextInt()); + case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt()); + case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt()); + case "windowHeight"-> settings.windowHeightProperty().set(in.nextInt()); + default -> { LOG.warn("Unsupported vault setting found in JSON: " + name); in.skipValue(); From 4223d15c0896fff11d9b5ec62dc5c584f6bf26ac Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 16:23:46 +0200 Subject: [PATCH 02/46] set stored window size to initial window size --- .../ui/mainwindow/MainWindowModule.java | 39 ++++++++++--------- .../ui/mainwindow/ResizeController.java | 36 ++++++++++++++--- 2 files changed, 50 insertions(+), 25 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index 90311bd5b..d1128664e 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -4,27 +4,28 @@ import dagger.Binds; import dagger.Module; import dagger.Provides; import dagger.multibindings.IntoMap; -import org.cryptomator.common.vaults.Vault; -import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; -import org.cryptomator.ui.common.FxmlLoaderFactory; -import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.common.FxControllerKey; -import org.cryptomator.ui.common.FxmlFile; -import org.cryptomator.ui.common.FxmlScene; -import org.cryptomator.ui.common.StageFactory; -import org.cryptomator.ui.health.HealthCheckComponent; -import org.cryptomator.ui.migration.MigrationComponent; -import org.cryptomator.ui.removevault.RemoveVaultComponent; -import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; -import org.cryptomator.ui.stats.VaultStatisticsComponent; -import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; - -import javax.inject.Provider; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleObjectProperty; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.stage.StageStyle; +import org.cryptomator.common.vaults.Vault; +import org.cryptomator.ui.addvaultwizard.AddVaultWizardComponent; +import org.cryptomator.ui.common.FxController; +import org.cryptomator.ui.common.FxControllerKey; +import org.cryptomator.ui.common.FxmlFile; +import org.cryptomator.ui.common.FxmlLoaderFactory; +import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.common.StageFactory; +import org.cryptomator.ui.health.HealthCheckComponent; +import org.cryptomator.ui.migration.MigrationComponent; +import org.cryptomator.ui.removevault.RemoveVaultComponent; +import org.cryptomator.ui.stats.VaultStatisticsComponent; +import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; +import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; + +import javax.inject.Provider; +import java.awt.*; import java.util.Map; import java.util.ResourceBundle; @@ -49,11 +50,11 @@ abstract class MainWindowModule { @MainWindowScoped static Stage provideStage(StageFactory factory) { Stage stage = factory.create(StageStyle.UNDECORATED); - // TODO: min/max values chosen arbitrarily. We might wanna take a look at the user's resolution... + Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); stage.setMinWidth(650); stage.setMinHeight(440); - stage.setMaxWidth(1000); - stage.setMaxHeight(700); + stage.setMaxWidth(screenSize.getWidth()); + stage.setMaxHeight(screenSize.getHeight()); stage.setTitle("Cryptomator"); return stage; } diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 908944d68..aad74ffc6 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -1,16 +1,21 @@ package org.cryptomator.ui.mainwindow; -import org.cryptomator.ui.common.FxController; - -import javax.inject.Inject; import javafx.fxml.FXML; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Region; import javafx.stage.Stage; +import org.cryptomator.common.settings.Settings; +import org.cryptomator.ui.common.FxController; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import javax.inject.Inject; @MainWindow public class ResizeController implements FxController { + private static final Logger LOG = LoggerFactory.getLogger(ResizeController.class); + private final Stage window; public Region tlResizer; @@ -20,14 +25,17 @@ public class ResizeController implements FxController { private double origX, origY, origW, origH; + private final Settings settings; + @Inject - ResizeController(@MainWindow Stage window) { + ResizeController(@MainWindow Stage window, Settings settings) { this.window = window; - // TODO inject settings and save current position and size + this.settings = settings; } @FXML public void initialize() { + LOG.debug("init ResizeController"); tlResizer.setOnMousePressed(this::startResize); trResizer.setOnMousePressed(this::startResize); blResizer.setOnMousePressed(this::startResize); @@ -36,6 +44,11 @@ public class ResizeController implements FxController { trResizer.setOnMouseDragged(this::resizeTopRight); blResizer.setOnMouseDragged(this::resizeBottomLeft); brResizer.setOnMouseDragged(this::resizeBottomRight); + + window.setY(settings.windowYPositionProperty().get()); + window.setX(settings.windowXPositionProperty().get()); + window.setHeight(settings.windowHeightProperty().get()); + window.setWidth(settings.windowWidthProperty().get()); } private void startResize(MouseEvent evt) { @@ -48,21 +61,25 @@ public class ResizeController implements FxController { private void resizeTopLeft(MouseEvent evt) { resizeTop(evt); resizeLeft(evt); + saveSettings(); } private void resizeTopRight(MouseEvent evt) { resizeTop(evt); resizeRight(evt); + saveSettings(); } private void resizeBottomLeft(MouseEvent evt) { resizeBottom(evt); resizeLeft(evt); + saveSettings(); } private void resizeBottomRight(MouseEvent evt) { resizeBottom(evt); resizeRight(evt); + saveSettings(); } private void resizeTop(MouseEvent evt) { @@ -99,4 +116,11 @@ public class ResizeController implements FxController { } } -} + private void saveSettings() { + settings.windowHeightProperty().setValue(window.getHeight()); + settings.windowWidthProperty().setValue(window.getWidth()); + settings.windowYPositionProperty().setValue(window.getY()); + settings.windowXPositionProperty().setValue(window.getX()); + } + +} \ No newline at end of file From b529764eb43f0ca4b28cae1ad682fcd1ac9371fe Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 17:37:15 +0200 Subject: [PATCH 03/46] remove max width and max heigth --- .../java/org/cryptomator/ui/mainwindow/MainWindowModule.java | 2 -- .../java/org/cryptomator/ui/mainwindow/ResizeController.java | 4 ++++ 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index d1128664e..d16079d7c 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -53,8 +53,6 @@ abstract class MainWindowModule { Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); stage.setMinWidth(650); stage.setMinHeight(440); - stage.setMaxWidth(screenSize.getWidth()); - stage.setMaxHeight(screenSize.getHeight()); stage.setTitle("Cryptomator"); return stage; } diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index aad74ffc6..9f8204706 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -48,7 +48,11 @@ public class ResizeController implements FxController { window.setY(settings.windowYPositionProperty().get()); window.setX(settings.windowXPositionProperty().get()); window.setHeight(settings.windowHeightProperty().get()); + //TODO: remove comments + //window.setHeight(settings.windowHeightProperty().get() > window.getMaxHeight() ? window.getMaxHeight() * 0.95 : settings.windowHeightProperty().get()); + window.setWidth(settings.windowWidthProperty().get()); + //window.setWidth(settings.windowWidthProperty().get() > window.getMaxWidth() ? window.getMaxWidth() * 0.95 : settings.windowWidthProperty().get()); } private void startResize(MouseEvent evt) { From 58d65c609f792f7edba8930cd90464ffad274e41 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 17:38:01 +0200 Subject: [PATCH 04/46] set the position on illegal position --- .../ui/mainwindow/ResizeController.java | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 9f8204706..95138ea97 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -45,14 +45,26 @@ public class ResizeController implements FxController { blResizer.setOnMouseDragged(this::resizeBottomLeft); brResizer.setOnMouseDragged(this::resizeBottomRight); - window.setY(settings.windowYPositionProperty().get()); - window.setX(settings.windowXPositionProperty().get()); window.setHeight(settings.windowHeightProperty().get()); //TODO: remove comments //window.setHeight(settings.windowHeightProperty().get() > window.getMaxHeight() ? window.getMaxHeight() * 0.95 : settings.windowHeightProperty().get()); window.setWidth(settings.windowWidthProperty().get()); //window.setWidth(settings.windowWidthProperty().get() > window.getMaxWidth() ? window.getMaxWidth() * 0.95 : settings.windowWidthProperty().get()); + + + //TODO: define illegalPosition + boolean illegalPosition = false; + if (illegalPosition) { + // if the position is illegal, then the window appears on the main screen in the middle of the window. + window.setY((window.getMaxHeight() - window.getHeight()) / 2); + window.setX((window.getMaxWidth() - window.getWidth()) / 2); + } + else { + window.setX(settings.windowXPositionProperty().get()); + window.setY(settings.windowYPositionProperty().get()); + } + } private void startResize(MouseEvent evt) { From 03eebfe48693f10c26d8b886ba38b4a6f07e90fe Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 18:03:55 +0200 Subject: [PATCH 05/46] add double click on titleBar to min/maximize application --- .../mainwindow/MainWindowTitleController.java | 25 ++++++++++++++----- 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index ef050e799..af2eadfe7 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -1,5 +1,12 @@ package org.cryptomator.ui.mainwindow; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; +import javafx.beans.property.ReadOnlyBooleanProperty; +import javafx.fxml.FXML; +import javafx.scene.input.MouseButton; +import javafx.scene.layout.HBox; +import javafx.stage.Stage; import org.cryptomator.common.LicenseHolder; import org.cryptomator.common.settings.Settings; import org.cryptomator.ui.common.FxController; @@ -12,12 +19,6 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; -import javafx.beans.binding.Bindings; -import javafx.beans.binding.BooleanBinding; -import javafx.beans.property.ReadOnlyBooleanProperty; -import javafx.fxml.FXML; -import javafx.scene.layout.HBox; -import javafx.stage.Stage; @MainWindowScoped public class MainWindowTitleController implements FxController { @@ -58,6 +59,18 @@ public class MainWindowTitleController implements FxController { titleBar.setOnMousePressed(event -> { xOffset = event.getSceneX(); yOffset = event.getSceneY(); + + }); + titleBar.setOnMouseClicked(event -> { + if (event.getButton().equals(MouseButton.PRIMARY)) { + if (event.getClickCount() == 2) { + if (window.isFullScreen()) { + window.setFullScreen(false); + } else { + window.setFullScreen(true); + } + } + } }); titleBar.setOnMouseDragged(event -> { window.setX(event.getScreenX() - xOffset); From 7df028b0b875effa30c2b1d7e2419934bf5fa94a Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 18:52:55 +0200 Subject: [PATCH 06/46] add top, right, bottom and left resizer --- .../cryptomator/ui/mainwindow/ResizeController.java | 13 +++++++++++++ src/main/resources/fxml/main_window_resize.fxml | 9 +++++++++ 2 files changed, 22 insertions(+) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 95138ea97..689e24612 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -22,6 +22,11 @@ public class ResizeController implements FxController { public Region trResizer; public Region blResizer; public Region brResizer; + public Region tResizer; + public Region rResizer; + public Region bResizer; + public Region lResizer; + private double origX, origY, origW, origH; @@ -40,10 +45,18 @@ public class ResizeController implements FxController { trResizer.setOnMousePressed(this::startResize); blResizer.setOnMousePressed(this::startResize); brResizer.setOnMousePressed(this::startResize); + tResizer.setOnMousePressed(this::startResize); + rResizer.setOnMousePressed(this::startResize); + bResizer.setOnMousePressed(this::startResize); + lResizer.setOnMousePressed(this::startResize); tlResizer.setOnMouseDragged(this::resizeTopLeft); trResizer.setOnMouseDragged(this::resizeTopRight); blResizer.setOnMouseDragged(this::resizeBottomLeft); brResizer.setOnMouseDragged(this::resizeBottomRight); + tResizer.setOnMouseDragged(this::resizeTop); + rResizer.setOnMouseDragged(this::resizeRight); + bResizer.setOnMouseDragged(this::resizeBottom); + lResizer.setOnMouseDragged(this::resizeLeft); window.setHeight(settings.windowHeightProperty().get()); //TODO: remove comments diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index b4eb46916..27647c773 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -9,9 +9,18 @@ + + + + + + + + + \ No newline at end of file From 31ca10226359eb2e6eef50e9c36e13411a9fa648 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 19:09:27 +0200 Subject: [PATCH 07/46] update position in settings when moving --- .../ui/mainwindow/MainWindowTitleController.java | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index af2eadfe7..b47616e29 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -76,11 +76,19 @@ public class MainWindowTitleController implements FxController { window.setX(event.getScreenX() - xOffset); window.setY(event.getScreenY() - yOffset); }); + titleBar.setOnMouseReleased(event -> { + saveSettings(); + }); window.setOnCloseRequest(event -> { close(); event.consume(); }); } + //TODO: almost duplicate from ResizeController.class + private void saveSettings() { + settings.windowYPositionProperty().setValue(window.getY()); + settings.windowXPositionProperty().setValue(window.getX()); + } @FXML public void close() { From 957640b1ba206280609e9297d03e78b16782225f Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Tue, 24 Aug 2021 19:21:53 +0200 Subject: [PATCH 08/46] block moving and resizing in fullscreen --- .../ui/mainwindow/MainWindowTitleController.java | 2 ++ .../ui/mainwindow/ResizeController.java | 5 +++++ src/main/resources/fxml/main_window_resize.fxml | 16 ++++++++-------- 3 files changed, 15 insertions(+), 8 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index b47616e29..2e68f66c5 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -73,6 +73,8 @@ public class MainWindowTitleController implements FxController { } }); titleBar.setOnMouseDragged(event -> { + //TODO should it be possible to move the window, when in fullscreen? + if (window.isFullScreen()) return; window.setX(event.getScreenX() - xOffset); window.setY(event.getScreenY() - yOffset); }); diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 689e24612..4e6d80187 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -152,4 +152,9 @@ public class ResizeController implements FxController { settings.windowXPositionProperty().setValue(window.getX()); } + public boolean isShowResizingArrows(){ + //If in fullscreen resizing should not be possible + return window.isFullScreen(); + } + } \ No newline at end of file diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index 27647c773..49055610d 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -14,13 +14,13 @@ - - - - - - - - + + + + + + + + \ No newline at end of file From 6b4ea9a9eba94bf1c551619976b65c28f1cabf94 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Wed, 25 Aug 2021 11:31:29 +0200 Subject: [PATCH 09/46] fix fullscreen binding --- .../mainwindow/MainWindowTitleController.java | 2 +- .../ui/mainwindow/ResizeController.java | 19 ++++++++++----- .../resources/fxml/main_window_resize.fxml | 23 +++++++++---------- 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index 2e68f66c5..bfa050f0b 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -73,7 +73,6 @@ public class MainWindowTitleController implements FxController { } }); titleBar.setOnMouseDragged(event -> { - //TODO should it be possible to move the window, when in fullscreen? if (window.isFullScreen()) return; window.setX(event.getScreenX() - xOffset); window.setY(event.getScreenY() - yOffset); @@ -86,6 +85,7 @@ public class MainWindowTitleController implements FxController { event.consume(); }); } + //TODO: almost duplicate from ResizeController.class private void saveSettings() { settings.windowYPositionProperty().setValue(window.getY()); diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 4e6d80187..20c072895 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -1,5 +1,7 @@ package org.cryptomator.ui.mainwindow; +import javafx.beans.binding.Bindings; +import javafx.beans.binding.BooleanBinding; import javafx.fxml.FXML; import javafx.scene.input.MouseEvent; import javafx.scene.layout.Region; @@ -27,15 +29,17 @@ public class ResizeController implements FxController { public Region bResizer; public Region lResizer; - private double origX, origY, origW, origH; private final Settings settings; + private final BooleanBinding showResizingArrows; + @Inject ResizeController(@MainWindow Stage window, Settings settings) { this.window = window; this.settings = settings; + this.showResizingArrows = Bindings.createBooleanBinding(this::isShowResizingArrows, window.fullScreenProperty()); } @FXML @@ -72,8 +76,7 @@ public class ResizeController implements FxController { // if the position is illegal, then the window appears on the main screen in the middle of the window. window.setY((window.getMaxHeight() - window.getHeight()) / 2); window.setX((window.getMaxWidth() - window.getWidth()) / 2); - } - else { + } else { window.setX(settings.windowXPositionProperty().get()); window.setY(settings.windowYPositionProperty().get()); } @@ -152,9 +155,13 @@ public class ResizeController implements FxController { settings.windowXPositionProperty().setValue(window.getX()); } - public boolean isShowResizingArrows(){ - //If in fullscreen resizing should not be possible - return window.isFullScreen(); + public BooleanBinding showResizingArrowsProperty() { + return showResizingArrows; + } + + public boolean isShowResizingArrows() { + //If in fullscreen resizing should not be possible; + return !window.isFullScreen(); } } \ No newline at end of file diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index 49055610d..ce491b3a6 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -9,18 +9,17 @@ - - - - + + - - - - - - - - + + + + + + + + + \ No newline at end of file From 981902409c71a9e9eb04a6190ae52a95433e5ae5 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 10:33:31 +0200 Subject: [PATCH 10/46] calculate new position on display configuration change --- .../cryptomator/common/settings/Settings.java | 14 ++++-- .../common/settings/SettingsJsonAdapter.java | 4 +- .../ui/mainwindow/ResizeController.java | 47 ++++++++++++------- 3 files changed, 44 insertions(+), 21 deletions(-) diff --git a/src/main/java/org/cryptomator/common/settings/Settings.java b/src/main/java/org/cryptomator/common/settings/Settings.java index 5d2cd7c22..ac15dbe0e 100644 --- a/src/main/java/org/cryptomator/common/settings/Settings.java +++ b/src/main/java/org/cryptomator/common/settings/Settings.java @@ -8,9 +8,6 @@ ******************************************************************************/ package org.cryptomator.common.settings; -import org.apache.commons.lang3.SystemUtils; -import org.cryptomator.common.Environment; - import javafx.beans.Observable; import javafx.beans.property.BooleanProperty; import javafx.beans.property.IntegerProperty; @@ -23,6 +20,9 @@ import javafx.beans.property.StringProperty; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.geometry.NodeOrientation; +import org.apache.commons.lang3.SystemUtils; +import org.cryptomator.common.Environment; + import java.util.function.Consumer; public class Settings { @@ -43,6 +43,8 @@ public class Settings { public static final NodeOrientation DEFAULT_USER_INTERFACE_ORIENTATION = NodeOrientation.LEFT_TO_RIGHT; public static final String DEFAULT_LICENSE_KEY = ""; public static final boolean DEFAULT_SHOW_MINIMIZE_BUTTON = false; + public static final String DEFAULT_DISPLAY_CONFIGURATION = ""; + private final ObservableList directories = FXCollections.observableArrayList(VaultSettings::observables); private final BooleanProperty askedForUpdateCheck = new SimpleBooleanProperty(DEFAULT_ASKED_FOR_UPDATE_CHECK); @@ -63,6 +65,7 @@ public class Settings { private final IntegerProperty windowYPosition = new SimpleIntegerProperty(); private final IntegerProperty windowWidth = new SimpleIntegerProperty(); private final IntegerProperty windowHeight = new SimpleIntegerProperty(); + private final ObjectProperty displayConfiguration = new SimpleObjectProperty<>(DEFAULT_DISPLAY_CONFIGURATION); private Consumer saveCmd; @@ -92,6 +95,7 @@ public class Settings { windowYPosition.addListener(this::somethingChanged); windowWidth.addListener(this::somethingChanged); windowHeight.addListener(this::somethingChanged); + displayConfiguration.addListener(this::somethingChanged); } void setSaveCmd(Consumer saveCmd) { @@ -183,4 +187,8 @@ public class Settings { public IntegerProperty windowHeightProperty() { return windowHeight; } + + public ObjectProperty displayConfigurationProperty() { + return displayConfiguration; + } } diff --git a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java index f390f0b84..ee040071a 100644 --- a/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java +++ b/src/main/java/org/cryptomator/common/settings/SettingsJsonAdapter.java @@ -9,13 +9,13 @@ import com.google.gson.TypeAdapter; import com.google.gson.stream.JsonReader; import com.google.gson.stream.JsonToken; import com.google.gson.stream.JsonWriter; +import javafx.geometry.NodeOrientation; import org.cryptomator.common.Environment; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Singleton; -import javafx.geometry.NodeOrientation; import java.io.IOException; import java.util.ArrayList; import java.util.List; @@ -56,6 +56,7 @@ public class SettingsJsonAdapter extends TypeAdapter { out.name("windowYPosition").value((value.windowYPositionProperty().get())); out.name("windowWidth").value((value.windowWidthProperty().get())); out.name("windowHeight").value((value.windowHeightProperty().get())); + out.name("displayConfiguration").value((value.displayConfigurationProperty().get())); out.endObject(); } @@ -95,6 +96,7 @@ public class SettingsJsonAdapter extends TypeAdapter { case "windowYPosition" -> settings.windowYPositionProperty().set(in.nextInt()); case "windowWidth" -> settings.windowWidthProperty().set(in.nextInt()); case "windowHeight"-> settings.windowHeightProperty().set(in.nextInt()); + case "displayConfiguration" -> settings.displayConfigurationProperty().set(in.nextString()); default -> { LOG.warn("Unsupported vault setting found in JSON: " + name); diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 20c072895..cd943cb19 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -12,6 +12,7 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import java.awt.*; @MainWindow public class ResizeController implements FxController { @@ -63,24 +64,36 @@ public class ResizeController implements FxController { lResizer.setOnMouseDragged(this::resizeLeft); window.setHeight(settings.windowHeightProperty().get()); - //TODO: remove comments - //window.setHeight(settings.windowHeightProperty().get() > window.getMaxHeight() ? window.getMaxHeight() * 0.95 : settings.windowHeightProperty().get()); - window.setWidth(settings.windowWidthProperty().get()); - //window.setWidth(settings.windowWidthProperty().get() > window.getMaxWidth() ? window.getMaxWidth() * 0.95 : settings.windowWidthProperty().get()); - - //TODO: define illegalPosition - boolean illegalPosition = false; - if (illegalPosition) { - // if the position is illegal, then the window appears on the main screen in the middle of the window. - window.setY((window.getMaxHeight() - window.getHeight()) / 2); - window.setX((window.getMaxWidth() - window.getWidth()) / 2); + if (checkForChangedDisplayConfiguration()) { + //If the position is illegal, then the window appears on the main screen in the middle of the window. + Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); + window.setX((size.getWidth() - window.getWidth()) / 2); + window.setY((size.getHeight() - window.getHeight()) / 2); } else { window.setX(settings.windowXPositionProperty().get()); window.setY(settings.windowYPositionProperty().get()); } + savePositionalSettings(); + } + private boolean checkForChangedDisplayConfiguration(){ + String currentDisplayConfiguration = getMonitorSizes(); + boolean changedConfiguration = !settings.displayConfigurationProperty().get().equals(currentDisplayConfiguration); + if (changedConfiguration) settings.displayConfigurationProperty().setValue(currentDisplayConfiguration); + return changedConfiguration; + } + + private String getMonitorSizes() { + GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment(); + GraphicsDevice[] gs = ge.getScreenDevices(); + StringBuilder sb = new StringBuilder(); + for (int i = 0; i < gs.length; i++) { + DisplayMode dm = gs[i].getDisplayMode(); + sb.append("screenId: " + i + ", " + dm.getWidth() + "x" + dm.getHeight() + "; "); + } + return sb.toString(); } private void startResize(MouseEvent evt) { @@ -93,25 +106,25 @@ public class ResizeController implements FxController { private void resizeTopLeft(MouseEvent evt) { resizeTop(evt); resizeLeft(evt); - saveSettings(); + savePositionalSettings(); } private void resizeTopRight(MouseEvent evt) { resizeTop(evt); resizeRight(evt); - saveSettings(); + savePositionalSettings(); } private void resizeBottomLeft(MouseEvent evt) { resizeBottom(evt); resizeLeft(evt); - saveSettings(); + savePositionalSettings(); } private void resizeBottomRight(MouseEvent evt) { resizeBottom(evt); resizeRight(evt); - saveSettings(); + savePositionalSettings(); } private void resizeTop(MouseEvent evt) { @@ -148,7 +161,7 @@ public class ResizeController implements FxController { } } - private void saveSettings() { + private void savePositionalSettings() { settings.windowHeightProperty().setValue(window.getHeight()); settings.windowWidthProperty().setValue(window.getWidth()); settings.windowYPositionProperty().setValue(window.getY()); @@ -160,7 +173,7 @@ public class ResizeController implements FxController { } public boolean isShowResizingArrows() { - //If in fullscreen resizing should not be possible; + //If in fullscreen resizing is not be possible; return !window.isFullScreen(); } From 72286de9fed73a47a9ab0d46da61a01786f84771 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 10:46:28 +0200 Subject: [PATCH 11/46] minor string rewriting --- .../java/org/cryptomator/ui/mainwindow/ResizeController.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index cd943cb19..09b4da885 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -91,7 +91,8 @@ public class ResizeController implements FxController { StringBuilder sb = new StringBuilder(); for (int i = 0; i < gs.length; i++) { DisplayMode dm = gs[i].getDisplayMode(); - sb.append("screenId: " + i + ", " + dm.getWidth() + "x" + dm.getHeight() + "; "); + if(!sb.isEmpty()) sb.append(" "); + sb.append("displayId: " + i + ", " + dm.getWidth() + "x" + dm.getHeight() + ";"); } return sb.toString(); } From 21f45d43f7879792f6fc7c3709982ada2d7bb260 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 11:15:19 +0200 Subject: [PATCH 12/46] remove dead code --- .../java/org/cryptomator/ui/mainwindow/MainWindowModule.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index d16079d7c..993670159 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -25,7 +25,6 @@ import org.cryptomator.ui.vaultoptions.VaultOptionsComponent; import org.cryptomator.ui.wrongfilealert.WrongFileAlertComponent; import javax.inject.Provider; -import java.awt.*; import java.util.Map; import java.util.ResourceBundle; @@ -50,7 +49,6 @@ abstract class MainWindowModule { @MainWindowScoped static Stage provideStage(StageFactory factory) { Stage stage = factory.create(StageStyle.UNDECORATED); - Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); stage.setMinWidth(650); stage.setMinHeight(440); stage.setTitle("Cryptomator"); From e5f66281c2b23d138fb6c928bd9f8cf61e04a690 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 17:20:53 +0200 Subject: [PATCH 13/46] centering window as before, renaming --- .../ui/mainwindow/MainWindowModule.java | 2 +- .../mainwindow/MainWindowTitleController.java | 7 +-- .../ui/mainwindow/ResizeController.java | 43 ++++++++++++------- 3 files changed, 33 insertions(+), 19 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index 993670159..3540e876e 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -49,7 +49,7 @@ abstract class MainWindowModule { @MainWindowScoped static Stage provideStage(StageFactory factory) { Stage stage = factory.create(StageStyle.UNDECORATED); - stage.setMinWidth(650); + stage.setMinWidth(550); stage.setMinHeight(440); stage.setTitle("Cryptomator"); return stage; diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index bfa050f0b..154d2cefc 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -78,7 +78,7 @@ public class MainWindowTitleController implements FxController { window.setY(event.getScreenY() - yOffset); }); titleBar.setOnMouseReleased(event -> { - saveSettings(); + saveWindowSettings(); }); window.setOnCloseRequest(event -> { close(); @@ -86,10 +86,11 @@ public class MainWindowTitleController implements FxController { }); } - //TODO: almost duplicate from ResizeController.class - private void saveSettings() { + private void saveWindowSettings() { settings.windowYPositionProperty().setValue(window.getY()); settings.windowXPositionProperty().setValue(window.getX()); + settings.windowWidthProperty().setValue(window.getWidth()); + settings.windowHeightProperty().setValue(window.getHeight()); } @FXML diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 09b4da885..90f83ce6f 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -63,24 +63,37 @@ public class ResizeController implements FxController { bResizer.setOnMouseDragged(this::resizeBottom); lResizer.setOnMouseDragged(this::resizeLeft); - window.setHeight(settings.windowHeightProperty().get()); - window.setWidth(settings.windowWidthProperty().get()); - - if (checkForChangedDisplayConfiguration()) { - //If the position is illegal, then the window appears on the main screen in the middle of the window. - Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); - window.setX((size.getWidth() - window.getWidth()) / 2); - window.setY((size.getHeight() - window.getHeight()) / 2); + if (neverTouched()){ + settings.displayConfigurationProperty().setValue(getMonitorSizes()); + return; } else { - window.setX(settings.windowXPositionProperty().get()); - window.setY(settings.windowYPositionProperty().get()); + if (checkForChangedDisplayConfiguration()) { + //If the position is illegal, then the window appears on the main screen in the middle of the window. + Dimension size = Toolkit.getDefaultToolkit().getScreenSize(); + window.setX((size.getWidth() - window.getMinWidth()) / 2); + window.setY((size.getHeight() - window.getMinHeight()) / 2); + window.setWidth(window.getMinWidth()); + window.setHeight(window.getMinHeight()); + } + else { + window.setHeight(settings.windowHeightProperty().get() > window.getMinHeight() ? settings.windowHeightProperty().get() : window.getMinHeight()); + window.setWidth(settings.windowWidthProperty().get() > window.getMinWidth() ? settings.windowWidthProperty().get() : window.getMinWidth()); + window.setX(settings.windowXPositionProperty().get()); + window.setY(settings.windowYPositionProperty().get()); + } } savePositionalSettings(); } + private boolean neverTouched(){ + return (settings.windowHeightProperty().get() == 0) && (settings.windowWidthProperty().get() == 0) && + (settings.windowXPositionProperty().get() == 0) && (settings.windowYPositionProperty().get() == 0); + } + private boolean checkForChangedDisplayConfiguration(){ String currentDisplayConfiguration = getMonitorSizes(); - boolean changedConfiguration = !settings.displayConfigurationProperty().get().equals(currentDisplayConfiguration); + String settingsDisplayConfiguration = settings.displayConfigurationProperty().get(); + boolean changedConfiguration = !settingsDisplayConfiguration.equals(currentDisplayConfiguration); if (changedConfiguration) settings.displayConfigurationProperty().setValue(currentDisplayConfiguration); return changedConfiguration; } @@ -107,25 +120,21 @@ public class ResizeController implements FxController { private void resizeTopLeft(MouseEvent evt) { resizeTop(evt); resizeLeft(evt); - savePositionalSettings(); } private void resizeTopRight(MouseEvent evt) { resizeTop(evt); resizeRight(evt); - savePositionalSettings(); } private void resizeBottomLeft(MouseEvent evt) { resizeBottom(evt); resizeLeft(evt); - savePositionalSettings(); } private void resizeBottomRight(MouseEvent evt) { resizeBottom(evt); resizeRight(evt); - savePositionalSettings(); } private void resizeTop(MouseEvent evt) { @@ -136,6 +145,7 @@ public class ResizeController implements FxController { window.setY(newY); window.setHeight(newH); } + savePositionalSettings(); } private void resizeLeft(MouseEvent evt) { @@ -146,6 +156,7 @@ public class ResizeController implements FxController { window.setX(newX); window.setWidth(newW); } + savePositionalSettings(); } private void resizeBottom(MouseEvent evt) { @@ -153,6 +164,7 @@ public class ResizeController implements FxController { if (newH < window.getMaxHeight() && newH > window.getMinHeight()) { window.setHeight(newH); } + savePositionalSettings(); } private void resizeRight(MouseEvent evt) { @@ -160,6 +172,7 @@ public class ResizeController implements FxController { if (newW < window.getMaxWidth() && newW > window.getMinWidth()) { window.setWidth(newW); } + savePositionalSettings(); } private void savePositionalSettings() { From 903e022d29a4308e92050bd87a54c885337e69b6 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 17:22:11 +0200 Subject: [PATCH 14/46] change from LOG.debug "init..." to LOG.trace --- .../ui/mainwindow/MainWindowController.java | 24 +++++++++---------- .../mainwindow/MainWindowTitleController.java | 2 +- .../ui/mainwindow/ResizeController.java | 2 +- 3 files changed, 13 insertions(+), 15 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java index 392671246..bb8dc5ce7 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowController.java @@ -1,5 +1,15 @@ package org.cryptomator.ui.mainwindow; +import javafx.beans.Observable; +import javafx.beans.property.BooleanProperty; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.ReadOnlyObjectProperty; +import javafx.beans.property.SimpleBooleanProperty; +import javafx.fxml.FXML; +import javafx.scene.input.DragEvent; +import javafx.scene.input.TransferMode; +import javafx.scene.layout.StackPane; +import javafx.stage.Stage; import org.apache.commons.lang3.SystemUtils; import org.cryptomator.common.vaults.Vault; import org.cryptomator.common.vaults.VaultListManager; @@ -11,20 +21,8 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; -import javafx.beans.Observable; -import javafx.beans.property.BooleanProperty; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.ReadOnlyObjectProperty; -import javafx.beans.property.SimpleBooleanProperty; -import javafx.fxml.FXML; -import javafx.scene.input.DragEvent; -import javafx.scene.input.TransferMode; -import javafx.scene.layout.StackPane; -import javafx.stage.Stage; import java.io.File; import java.io.IOException; -import java.nio.file.Files; -import java.nio.file.NoSuchFileException; import java.nio.file.Path; import java.util.Set; import java.util.stream.Collectors; @@ -55,7 +53,7 @@ public class MainWindowController implements FxController { @FXML public void initialize() { - LOG.debug("init MainWindowController"); + LOG.trace("init MainWindowController"); root.setOnDragEntered(this::handleDragEvent); root.setOnDragOver(this::handleDragEvent); root.setOnDragDropped(this::handleDragEvent); diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java index 154d2cefc..cff4d54df 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowTitleController.java @@ -54,7 +54,7 @@ public class MainWindowTitleController implements FxController { @FXML public void initialize() { - LOG.debug("init MainWindowTitleController"); + LOG.trace("init MainWindowTitleController"); updateChecker.automaticallyCheckForUpdatesIfEnabled(); titleBar.setOnMousePressed(event -> { xOffset = event.getSceneX(); diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 90f83ce6f..0d3bca915 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -45,7 +45,7 @@ public class ResizeController implements FxController { @FXML public void initialize() { - LOG.debug("init ResizeController"); + LOG.trace("init ResizeController"); tlResizer.setOnMousePressed(this::startResize); trResizer.setOnMousePressed(this::startResize); blResizer.setOnMousePressed(this::startResize); From 348b015bdc1de66eec4062347aaaea9684583c97 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Thu, 26 Aug 2021 17:56:20 +0200 Subject: [PATCH 15/46] reformat to use fxml to trigger resizing --- .../ui/mainwindow/ResizeController.java | 26 +++++++------------ .../resources/fxml/main_window_resize.fxml | 16 ++++++------ 2 files changed, 18 insertions(+), 24 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java index 0d3bca915..6b0ac08fd 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/ResizeController.java @@ -46,22 +46,6 @@ public class ResizeController implements FxController { @FXML public void initialize() { LOG.trace("init ResizeController"); - tlResizer.setOnMousePressed(this::startResize); - trResizer.setOnMousePressed(this::startResize); - blResizer.setOnMousePressed(this::startResize); - brResizer.setOnMousePressed(this::startResize); - tResizer.setOnMousePressed(this::startResize); - rResizer.setOnMousePressed(this::startResize); - bResizer.setOnMousePressed(this::startResize); - lResizer.setOnMousePressed(this::startResize); - tlResizer.setOnMouseDragged(this::resizeTopLeft); - trResizer.setOnMouseDragged(this::resizeTopRight); - blResizer.setOnMouseDragged(this::resizeBottomLeft); - brResizer.setOnMouseDragged(this::resizeBottomRight); - tResizer.setOnMouseDragged(this::resizeTop); - rResizer.setOnMouseDragged(this::resizeRight); - bResizer.setOnMouseDragged(this::resizeBottom); - lResizer.setOnMouseDragged(this::resizeLeft); if (neverTouched()){ settings.displayConfigurationProperty().setValue(getMonitorSizes()); @@ -117,27 +101,33 @@ public class ResizeController implements FxController { origH = window.getHeight(); } + @FXML private void resizeTopLeft(MouseEvent evt) { resizeTop(evt); resizeLeft(evt); } + @FXML private void resizeTopRight(MouseEvent evt) { resizeTop(evt); resizeRight(evt); } + @FXML private void resizeBottomLeft(MouseEvent evt) { resizeBottom(evt); resizeLeft(evt); } + @FXML private void resizeBottomRight(MouseEvent evt) { resizeBottom(evt); resizeRight(evt); } + @FXML private void resizeTop(MouseEvent evt) { + startResize(evt); double newY = evt.getScreenY(); double dy = newY - origY; double newH = origH - dy; @@ -148,7 +138,9 @@ public class ResizeController implements FxController { savePositionalSettings(); } + @FXML private void resizeLeft(MouseEvent evt) { + startResize(evt); double newX = evt.getScreenX(); double dx = newX - origX; double newW = origW - dx; @@ -159,6 +151,7 @@ public class ResizeController implements FxController { savePositionalSettings(); } + @FXML private void resizeBottom(MouseEvent evt) { double newH = evt.getSceneY(); if (newH < window.getMaxHeight() && newH > window.getMinHeight()) { @@ -167,6 +160,7 @@ public class ResizeController implements FxController { savePositionalSettings(); } + @FXML private void resizeRight(MouseEvent evt) { double newW = evt.getSceneX(); if (newW < window.getMaxWidth() && newW > window.getMinWidth()) { diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index ce491b3a6..dea6aea17 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -13,13 +13,13 @@ - - - - - - - - + + + + + + + + \ No newline at end of file From 460e6528bfcde290323e705218893a9b49f3f39e Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 26 Aug 2021 21:10:39 +0200 Subject: [PATCH 16/46] Eagerly load vault config: * wrap (re-)loading in new class * assume existence of config in certain vault states * deprecate classes which are not used anymore --- .../org/cryptomator/common/vaults/Vault.java | 34 ++++++----- .../common/vaults/VaultConfigWrapper.java | 56 +++++++++++++++++++ .../common/vaults/VaultListManager.java | 14 ++++- .../ui/health/HealthCheckComponent.java | 14 +---- .../ui/health/HealthCheckModule.java | 13 ----- .../ui/health/StartController.java | 15 ++--- .../ui/health/StartFailController.java | 6 +- .../ui/keyloading/KeyLoadingModule.java | 13 +---- 8 files changed, 97 insertions(+), 68 deletions(-) create mode 100644 src/main/java/org/cryptomator/common/vaults/VaultConfigWrapper.java diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index 74ac7dc40..4c2fd7896 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -17,9 +17,7 @@ import org.cryptomator.cryptofs.CryptoFileSystem; import org.cryptomator.cryptofs.CryptoFileSystemProperties; import org.cryptomator.cryptofs.CryptoFileSystemProperties.FileSystemFlags; import org.cryptomator.cryptofs.CryptoFileSystemProvider; -import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig; -import org.cryptomator.cryptofs.VaultConfigLoadException; import org.cryptomator.cryptofs.common.FileSystemCapabilityChecker; import org.cryptomator.cryptolib.api.CryptoException; import org.cryptomator.cryptolib.api.MasterkeyLoader; @@ -38,8 +36,6 @@ import javafx.beans.property.BooleanProperty; import javafx.beans.property.ObjectProperty; import javafx.beans.property.SimpleBooleanProperty; import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; import java.nio.file.Path; import java.nio.file.Paths; import java.util.EnumSet; @@ -62,6 +58,7 @@ public class Vault { private final AtomicReference cryptoFileSystem; private final VaultState state; private final ObjectProperty lastKnownException; + private final VaultConfigWrapper configWrapper; private final VaultStats stats; private final StringBinding displayName; private final StringBinding displayablePath; @@ -78,8 +75,9 @@ public class Vault { private volatile Volume volume; @Inject - Vault(VaultSettings vaultSettings, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty lastKnownException, VaultStats stats) { + Vault(VaultSettings vaultSettings, VaultConfigWrapper configWrapper, Provider volumeProvider, @DefaultMountFlags StringBinding defaultMountFlags, AtomicReference cryptoFileSystem, VaultState state, @Named("lastKnownException") ObjectProperty lastKnownException, VaultStats stats) { this.vaultSettings = vaultSettings; + this.configWrapper = configWrapper; this.volumeProvider = volumeProvider; this.defaultMountFlags = defaultMountFlags; this.cryptoFileSystem = cryptoFileSystem; @@ -195,6 +193,10 @@ public class Vault { volume.reveal(vaultRevealer); } + public void reloadConfig() throws IOException { + configWrapper.reloadConfig(); + } + // ****************************************************************************** // Observable Properties // ******************************************************************************* @@ -328,19 +330,6 @@ public class Vault { return stats; } - /** - * Attempts to read the vault config file and parse it without verifying its integrity. - * - * @return an unverified vault config - * @throws VaultConfigLoadException if the read file cannot be properly parsed - * @throws IOException if reading the file fails - * - */ - public UnverifiedVaultConfig getUnverifiedVaultConfig() throws IOException { - Path configPath = getPath().resolve(org.cryptomator.common.Constants.VAULTCONFIG_FILENAME); - String token = Files.readString(configPath, StandardCharsets.US_ASCII); - return VaultConfig.decode(token); - } public Observable[] observables() { return new Observable[]{state}; @@ -375,6 +364,15 @@ public class Vault { } } + public UnverifiedVaultConfig getUnverifiedVaultConfig() { + try { + return configWrapper.getConfig(); + } catch (IOException e) { + throw new IllegalStateException("One should not accquire the config if thee is not present."); + } + + } + public void setCustomMountFlags(String mountFlags) { vaultSettings.mountFlags().set(mountFlags); } diff --git a/src/main/java/org/cryptomator/common/vaults/VaultConfigWrapper.java b/src/main/java/org/cryptomator/common/vaults/VaultConfigWrapper.java new file mode 100644 index 000000000..b6f767e23 --- /dev/null +++ b/src/main/java/org/cryptomator/common/vaults/VaultConfigWrapper.java @@ -0,0 +1,56 @@ +package org.cryptomator.common.vaults; + +import org.cryptomator.common.Constants; +import org.cryptomator.common.settings.VaultSettings; +import org.cryptomator.cryptofs.VaultConfig; +import org.cryptomator.cryptofs.VaultConfigLoadException; + +import javax.inject.Inject; +import javafx.beans.property.ObjectProperty; +import javafx.beans.property.SimpleObjectProperty; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.util.Objects; + +/** + * Wrapper for lazy loading and on-demand reloading of the vault configuration. + */ +@PerVault +public class VaultConfigWrapper { + + private final VaultSettings settings; + private final ObjectProperty config; + + @Inject + VaultConfigWrapper(VaultSettings settings) { + this.settings = settings; + this.config = new SimpleObjectProperty<>(); + } + + void reloadConfig() throws IOException { + config.set(readConfigFromStorage(this.settings.path().get())); + } + + VaultConfig.UnverifiedVaultConfig getConfig() throws IOException { + if (Objects.isNull(config.get())) { + reloadConfig(); + } + return config.get(); + } + + + /** + * Attempts to read the vault config file and parse it without verifying its integrity. + * + * @throws VaultConfigLoadException if the read file cannot be properly parsed + * @throws IOException if reading the file fails + */ + static VaultConfig.UnverifiedVaultConfig readConfigFromStorage(Path vaultPath) throws IOException { + Path configPath = vaultPath.resolve(Constants.VAULTCONFIG_FILENAME); + String token = Files.readString(configPath, StandardCharsets.US_ASCII); + return VaultConfig.decode(token); + } + +} diff --git a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java index 05ea8ce07..53374d929 100644 --- a/src/main/java/org/cryptomator/common/vaults/VaultListManager.java +++ b/src/main/java/org/cryptomator/common/vaults/VaultListManager.java @@ -12,13 +12,13 @@ import org.cryptomator.common.settings.Settings; import org.cryptomator.common.settings.VaultSettings; import org.cryptomator.cryptofs.CryptoFileSystemProvider; import org.cryptomator.cryptofs.DirStructure; +import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.migration.Migrators; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Singleton; -import javafx.collections.FXCollections; import javafx.collections.ObservableList; import java.io.IOException; import java.nio.file.Files; @@ -31,6 +31,7 @@ import java.util.ResourceBundle; import static org.cryptomator.common.Constants.MASTERKEY_FILENAME; import static org.cryptomator.common.Constants.VAULTCONFIG_FILENAME; import static org.cryptomator.common.vaults.VaultState.Value.ERROR; +import static org.cryptomator.common.vaults.VaultState.Value.LOCKED; @Singleton public class VaultListManager { @@ -96,6 +97,10 @@ public class VaultListManager { VaultComponent.Builder compBuilder = vaultComponentBuilder.vaultSettings(vaultSettings); try { VaultState.Value vaultState = determineVaultState(vaultSettings.path().get()); + if (vaultState == LOCKED) { + //TODO: maybe already set it in the vault Wrapper ? + VaultConfig.UnverifiedVaultConfig config = VaultConfigWrapper.readConfigFromStorage(vaultSettings.path().get()); + } compBuilder.initialVaultState(vaultState); } catch (IOException e) { LOG.warn("Failed to determine vault state for " + vaultSettings.path().get(), e); @@ -112,6 +117,9 @@ public class VaultListManager { case LOCKED, NEEDS_MIGRATION, MISSING -> { try { var determinedState = determineVaultState(vault.getPath()); + if (determinedState == LOCKED) { + vault.reloadConfig(); + } state.set(determinedState); yield determinedState; } catch (IOException e) { @@ -132,7 +140,9 @@ public class VaultListManager { return switch (CryptoFileSystemProvider.checkDirStructureForVault(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME)) { case VAULT -> VaultState.Value.LOCKED; case UNRELATED -> VaultState.Value.MISSING; - case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? VaultState.Value.NEEDS_MIGRATION : VaultState.Value.MISSING; + case MAYBE_LEGACY -> Migrators.get().needsMigration(pathToVault, VAULTCONFIG_FILENAME, MASTERKEY_FILENAME) ? // + VaultState.Value.NEEDS_MIGRATION // + : VaultState.Value.MISSING; }; } diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java index f78e815c6..aa69e0828 100644 --- a/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java +++ b/src/main/java/org/cryptomator/ui/health/HealthCheckComponent.java @@ -16,26 +16,15 @@ import javafx.stage.Stage; @Subcomponent(modules = {HealthCheckModule.class}) public interface HealthCheckComponent { - LoadUnverifiedConfigResult loadConfig(); - @HealthCheckWindow Stage window(); @FxmlScene(FxmlFile.HEALTH_START) Lazy startScene(); - @FxmlScene(FxmlFile.HEALTH_START_FAIL) - Lazy failScene(); - default Stage showHealthCheckWindow() { Stage stage = window(); - // TODO reevaluate config loading, as soon as we have the new generic error screen - var unverifiedConf = loadConfig(); - if (unverifiedConf.config() != null) { - stage.setScene(startScene().get()); - } else { - stage.setScene(failScene().get()); - } + stage.setScene(startScene().get()); stage.show(); return stage; } @@ -52,5 +41,4 @@ public interface HealthCheckComponent { HealthCheckComponent build(); } - record LoadUnverifiedConfigResult(VaultConfig.UnverifiedVaultConfig config, Throwable error) {} } diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java index ad5ac6156..a98807d82 100644 --- a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java +++ b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java @@ -27,7 +27,6 @@ import javafx.scene.Scene; import javafx.stage.Modality; import javafx.stage.Stage; import java.io.IOException; -import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Optional; @@ -37,18 +36,6 @@ import java.util.concurrent.atomic.AtomicReference; @Module(subcomponents = {KeyLoadingComponent.class}) abstract class HealthCheckModule { - // TODO reevaluate config loading, as soon as we have the new generic error screen - @Provides - @HealthCheckScoped - static HealthCheckComponent.LoadUnverifiedConfigResult provideLoadConfigResult(@HealthCheckWindow Vault vault) { - try { - return new HealthCheckComponent.LoadUnverifiedConfigResult(vault.getUnverifiedVaultConfig(), null); - } catch (IOException e) { - return new HealthCheckComponent.LoadUnverifiedConfigResult(null, e); - } - } - - @Provides @HealthCheckScoped static AtomicReference provideMasterkeyRef() { diff --git a/src/main/java/org/cryptomator/ui/health/StartController.java b/src/main/java/org/cryptomator/ui/health/StartController.java index ebba001b5..4b57ba7b8 100644 --- a/src/main/java/org/cryptomator/ui/health/StartController.java +++ b/src/main/java/org/cryptomator/ui/health/StartController.java @@ -1,7 +1,7 @@ package org.cryptomator.ui.health; -import com.google.common.base.Preconditions; import dagger.Lazy; +import org.cryptomator.common.vaults.Vault; import org.cryptomator.cryptofs.VaultConfig; import org.cryptomator.cryptofs.VaultConfigLoadException; import org.cryptomator.cryptofs.VaultKeyInvalidException; @@ -18,11 +18,10 @@ import org.slf4j.LoggerFactory; import javax.inject.Inject; import javax.inject.Named; import javafx.application.Platform; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; import javafx.fxml.FXML; import javafx.scene.Scene; import javafx.stage.Stage; +import java.io.IOException; import java.util.concurrent.CompletableFuture; import java.util.concurrent.CompletionException; import java.util.concurrent.ExecutorService; @@ -35,7 +34,7 @@ public class StartController implements FxController { private final Stage window; private final Stage unlockWindow; - private final ObjectProperty unverifiedVaultConfig; + private final Vault vault; private final KeyLoadingStrategy keyLoadingStrategy; private final ExecutorService executor; private final AtomicReference masterkeyRef; @@ -44,11 +43,10 @@ public class StartController implements FxController { private final Lazy errorComponent; @Inject - public StartController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference masterkeyRef, AtomicReference vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy checkScene, Lazy errorComponent, @Named("unlockWindow") Stage unlockWindow) { - Preconditions.checkNotNull(configLoadResult.config()); + public StartController(@HealthCheckWindow Stage window, @HealthCheckWindow Vault vault, @HealthCheckWindow KeyLoadingStrategy keyLoadingStrategy, ExecutorService executor, AtomicReference masterkeyRef, AtomicReference vaultConfigRef, @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) Lazy checkScene, Lazy errorComponent, @Named("unlockWindow") Stage unlockWindow) { this.window = window; this.unlockWindow = unlockWindow; - this.unverifiedVaultConfig = new SimpleObjectProperty<>(configLoadResult.config()); + this.vault = vault; this.keyLoadingStrategy = keyLoadingStrategy; this.executor = executor; this.masterkeyRef = masterkeyRef; @@ -71,7 +69,6 @@ public class StartController implements FxController { private void loadKey() { assert !Platform.isFxApplicationThread(); - assert unverifiedVaultConfig.get() != null; try { keyLoadingStrategy.use(this::verifyVaultConfig); } catch (VaultConfigLoadException | UnlockCancelledException e) { @@ -80,7 +77,7 @@ public class StartController implements FxController { } private void verifyVaultConfig(KeyLoadingStrategy keyLoadingStrategy) throws VaultConfigLoadException { - var unverifiedCfg = unverifiedVaultConfig.get(); + var unverifiedCfg = vault.getUnverifiedVaultConfig(); try (var masterkey = keyLoadingStrategy.loadKey(unverifiedCfg.getKeyId())) { var verifiedCfg = unverifiedCfg.verify(masterkey.getEncoded(), unverifiedCfg.allegedVaultVersion()); vaultConfigRef.set(verifiedCfg); diff --git a/src/main/java/org/cryptomator/ui/health/StartFailController.java b/src/main/java/org/cryptomator/ui/health/StartFailController.java index 826766026..80b97bb44 100644 --- a/src/main/java/org/cryptomator/ui/health/StartFailController.java +++ b/src/main/java/org/cryptomator/ui/health/StartFailController.java @@ -18,6 +18,7 @@ import java.nio.charset.StandardCharsets; // TODO reevaluate config loading, as soon as we have the new generic error screen @HealthCheckScoped +@Deprecated public class StartFailController implements FxController { private final Stage window; @@ -28,10 +29,9 @@ public class StartFailController implements FxController { public TitledPane moreInfoPane; @Inject - public StartFailController(@HealthCheckWindow Stage window, HealthCheckComponent.LoadUnverifiedConfigResult configLoadResult) { - Preconditions.checkNotNull(configLoadResult.error()); + public StartFailController(@HealthCheckWindow Stage window) { this.window = window; - this.loadError = new SimpleObjectProperty<>(configLoadResult.error()); + this.loadError = new SimpleObjectProperty<>(new IllegalStateException("This class is not reachable anymore")); this.moreInfoIcon = new SimpleObjectProperty<>(FontAwesome5Icon.CARET_RIGHT); } diff --git a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java index f7eb8922f..bc6a911dd 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java +++ b/src/main/java/org/cryptomator/ui/keyloading/KeyLoadingModule.java @@ -3,7 +3,6 @@ package org.cryptomator.ui.keyloading; import dagger.Module; import dagger.Provides; import org.cryptomator.common.vaults.Vault; -import org.cryptomator.cryptofs.VaultConfig.UnverifiedVaultConfig; import org.cryptomator.ui.common.DefaultSceneFactory; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxmlLoaderFactory; @@ -11,9 +10,7 @@ import org.cryptomator.ui.keyloading.masterkeyfile.MasterkeyFileLoadingModule; import javax.inject.Provider; import java.io.IOException; -import java.net.URI; import java.util.Map; -import java.util.Optional; import java.util.ResourceBundle; @Module(includes = {MasterkeyFileLoadingModule.class}) @@ -30,13 +27,9 @@ abstract class KeyLoadingModule { @KeyLoading @KeyLoadingScoped static KeyLoadingStrategy provideKeyLoaderProvider(@KeyLoading Vault vault, Map> strategies) { - try { - String scheme = vault.getUnverifiedVaultConfig().getKeyId().getScheme(); - var fallback = KeyLoadingStrategy.failed(new IllegalArgumentException("Unsupported key id " + scheme)); - return strategies.getOrDefault(scheme, () -> fallback).get(); - } catch (IOException e) { - return KeyLoadingStrategy.failed(e); - } + String scheme = vault.getUnverifiedVaultConfig().getKeyId().getScheme(); + var fallback = KeyLoadingStrategy.failed(new IllegalArgumentException("Unsupported key id " + scheme)); + return strategies.getOrDefault(scheme, () -> fallback).get(); } } From cf633d74d2f6736b9ba4c2ccfbff1750e0cfeb4d Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Mon, 30 Aug 2021 15:16:52 +0200 Subject: [PATCH 17/46] add extra regions to reset to cursor to the default (+coloring the borders red for debugging and testing) --- src/main/resources/fxml/main_window_resize.fxml | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index dea6aea17..4338e2f65 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -11,6 +11,7 @@ + @@ -21,5 +22,10 @@ + + + + + \ No newline at end of file From 947344e5bc8e3531054c2def2ba49ff86ea88ce8 Mon Sep 17 00:00:00 2001 From: Martin Beyer Date: Mon, 30 Aug 2021 17:13:46 +0200 Subject: [PATCH 18/46] remove border color, reduce default cursor size, enforce minWidth of 650 --- .../org/cryptomator/ui/mainwindow/MainWindowModule.java | 2 +- src/main/resources/fxml/main_window.fxml | 2 +- src/main/resources/fxml/main_window_resize.fxml | 9 ++++----- 3 files changed, 6 insertions(+), 7 deletions(-) diff --git a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java index 3540e876e..993670159 100644 --- a/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java +++ b/src/main/java/org/cryptomator/ui/mainwindow/MainWindowModule.java @@ -49,7 +49,7 @@ abstract class MainWindowModule { @MainWindowScoped static Stage provideStage(StageFactory factory) { Stage stage = factory.create(StageStyle.UNDECORATED); - stage.setMinWidth(550); + stage.setMinWidth(650); stage.setMinHeight(440); stage.setTitle("Cryptomator"); return stage; diff --git a/src/main/resources/fxml/main_window.fxml b/src/main/resources/fxml/main_window.fxml index ff8e65292..91e7512a4 100644 --- a/src/main/resources/fxml/main_window.fxml +++ b/src/main/resources/fxml/main_window.fxml @@ -12,7 +12,7 @@ fx:id="root" fx:controller="org.cryptomator.ui.mainwindow.MainWindowController" styleClass="main-window"> - + diff --git a/src/main/resources/fxml/main_window_resize.fxml b/src/main/resources/fxml/main_window_resize.fxml index 4338e2f65..705271ec3 100644 --- a/src/main/resources/fxml/main_window_resize.fxml +++ b/src/main/resources/fxml/main_window_resize.fxml @@ -22,10 +22,9 @@ - - - - - + + + + \ No newline at end of file From 09a2f76e15985d762cefd02ed66640cee5e40a57 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Fri, 3 Sep 2021 12:02:45 +0200 Subject: [PATCH 19/46] remove startFail controller entirely --- .../org/cryptomator/ui/common/FxmlFile.java | 1 - .../ui/health/HealthCheckModule.java | 12 --- .../ui/health/StartFailController.java | 79 ------------------- .../resources/fxml/health_start_fail.fxml | 44 ----------- 4 files changed, 136 deletions(-) delete mode 100644 src/main/java/org/cryptomator/ui/health/StartFailController.java delete mode 100644 src/main/resources/fxml/health_start_fail.fxml diff --git a/src/main/java/org/cryptomator/ui/common/FxmlFile.java b/src/main/java/org/cryptomator/ui/common/FxmlFile.java index ea0c1ed38..b8d5bbff0 100644 --- a/src/main/java/org/cryptomator/ui/common/FxmlFile.java +++ b/src/main/java/org/cryptomator/ui/common/FxmlFile.java @@ -12,7 +12,6 @@ public enum FxmlFile { ERROR("/fxml/error.fxml"), // FORGET_PASSWORD("/fxml/forget_password.fxml"), // HEALTH_START("/fxml/health_start.fxml"), // - HEALTH_START_FAIL("/fxml/health_start_fail.fxml"), // HEALTH_CHECK_LIST("/fxml/health_check_list.fxml"), // LOCK_FORCED("/fxml/lock_forced.fxml"), // LOCK_FAILED("/fxml/lock_failed.fxml"), // diff --git a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java index a98807d82..c36f486e0 100644 --- a/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java +++ b/src/main/java/org/cryptomator/ui/health/HealthCheckModule.java @@ -116,13 +116,6 @@ abstract class HealthCheckModule { return fxmlLoaders.createScene(FxmlFile.HEALTH_START); } - @Provides - @FxmlScene(FxmlFile.HEALTH_START_FAIL) - @HealthCheckScoped - static Scene provideHealthStartFailScene(@HealthCheckWindow FxmlLoaderFactory fxmlLoaders) { - return fxmlLoaders.createScene(FxmlFile.HEALTH_START_FAIL); - } - @Provides @FxmlScene(FxmlFile.HEALTH_CHECK_LIST) @HealthCheckScoped @@ -135,11 +128,6 @@ abstract class HealthCheckModule { @FxControllerKey(StartController.class) abstract FxController bindStartController(StartController controller); - @Binds - @IntoMap - @FxControllerKey(StartFailController.class) - abstract FxController bindStartFailController(StartFailController controller); - @Binds @IntoMap @FxControllerKey(CheckListController.class) diff --git a/src/main/java/org/cryptomator/ui/health/StartFailController.java b/src/main/java/org/cryptomator/ui/health/StartFailController.java deleted file mode 100644 index 80b97bb44..000000000 --- a/src/main/java/org/cryptomator/ui/health/StartFailController.java +++ /dev/null @@ -1,79 +0,0 @@ -package org.cryptomator.ui.health; - -import com.google.common.base.Preconditions; -import org.cryptomator.cryptofs.VaultConfigLoadException; -import org.cryptomator.ui.common.FxController; -import org.cryptomator.ui.controls.FontAwesome5Icon; - -import javax.inject.Inject; -import javafx.beans.property.ObjectProperty; -import javafx.beans.property.SimpleObjectProperty; -import javafx.beans.value.ObservableValue; -import javafx.fxml.FXML; -import javafx.scene.control.TitledPane; -import javafx.stage.Stage; -import java.io.ByteArrayOutputStream; -import java.io.PrintStream; -import java.nio.charset.StandardCharsets; - -// TODO reevaluate config loading, as soon as we have the new generic error screen -@HealthCheckScoped -@Deprecated -public class StartFailController implements FxController { - - private final Stage window; - private final ObjectProperty loadError; - private final ObjectProperty moreInfoIcon; - - /* FXML */ - public TitledPane moreInfoPane; - - @Inject - public StartFailController(@HealthCheckWindow Stage window) { - this.window = window; - this.loadError = new SimpleObjectProperty<>(new IllegalStateException("This class is not reachable anymore")); - this.moreInfoIcon = new SimpleObjectProperty<>(FontAwesome5Icon.CARET_RIGHT); - } - - public void initialize() { - moreInfoPane.expandedProperty().addListener(this::setMoreInfoIcon); - } - - private void setMoreInfoIcon(ObservableValue observable, boolean wasExpanded, boolean willExpand) { - moreInfoIcon.set(willExpand ? FontAwesome5Icon.CARET_DOWN : FontAwesome5Icon.CARET_RIGHT); - } - - @FXML - public void close() { - window.close(); - } - - /* Getter & Setter */ - - public ObjectProperty moreInfoIconProperty() { - return moreInfoIcon; - } - - public FontAwesome5Icon getMoreInfoIcon() { - return moreInfoIcon.getValue(); - } - - public String getStackTrace() { - ByteArrayOutputStream baos = new ByteArrayOutputStream(); - loadError.get().printStackTrace(new PrintStream(baos)); - return baos.toString(StandardCharsets.UTF_8); - } - - public String getLocalizedErrorMessage() { - return loadError.get().getLocalizedMessage(); - } - - public boolean isParseException() { - return loadError.get() instanceof VaultConfigLoadException; - } - - public boolean isIoException() { - return !isParseException(); - } - -} diff --git a/src/main/resources/fxml/health_start_fail.fxml b/src/main/resources/fxml/health_start_fail.fxml deleted file mode 100644 index 9a35e4788..000000000 --- a/src/main/resources/fxml/health_start_fail.fxml +++ /dev/null @@ -1,44 +0,0 @@ - - - - - - - - - - - - - - - - -