From 4f6e091c13c845998d0b73cbd589cb6368e2c451 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Thu, 13 Feb 2025 11:21:05 +0100 Subject: [PATCH] first proper design draft --- src/main/java/module-info.java | 2 +- .../org/cryptomator/common/CommonsModule.java | 2 +- .../org/cryptomator/common/Environment.java | 2 +- .../org/cryptomator/common/vaults/Vault.java | 4 +- .../cryptomator/{notify => event}/Answer.java | 2 +- .../java/org/cryptomator/event/Event.java | 15 ++++++++ .../NotificationHandler.java | 2 +- .../org/cryptomator/event/UpdateEvent.java | 17 +++++++++ .../org/cryptomator/event/VaultEvent.java | 17 +++++++++ .../java/org/cryptomator/notify/Event.java | 5 --- .../org/cryptomator/notify/UpdateEvent.java | 3 -- .../org/cryptomator/notify/VaultEvent.java | 7 ---- .../ui/eventviewer/EventViewController.java | 29 +++++++++++++- .../ui/eventviewer/EventViewerModule.java | 17 ++++++--- .../UpdateEventViewController.java | 14 +++++++ .../ui/fxapp/FxApplicationWindows.java | 8 +++- .../cryptomator/ui/fxapp/UpdateChecker.java | 4 +- src/main/resources/css/light_theme.css | 20 ++++++++++ src/main/resources/fxml/eventviewer.fxml | 38 +++++++------------ .../resources/fxml/eventviewer_update.fxml | 12 ++++++ 20 files changed, 162 insertions(+), 58 deletions(-) rename src/main/java/org/cryptomator/{notify => event}/Answer.java (87%) create mode 100644 src/main/java/org/cryptomator/event/Event.java rename src/main/java/org/cryptomator/{notify => event}/NotificationHandler.java (91%) create mode 100644 src/main/java/org/cryptomator/event/UpdateEvent.java create mode 100644 src/main/java/org/cryptomator/event/VaultEvent.java delete mode 100644 src/main/java/org/cryptomator/notify/Event.java delete mode 100644 src/main/java/org/cryptomator/notify/UpdateEvent.java delete mode 100644 src/main/java/org/cryptomator/notify/VaultEvent.java create mode 100644 src/main/java/org/cryptomator/ui/eventviewer/UpdateEventViewController.java create mode 100644 src/main/resources/fxml/eventviewer_update.fxml diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index f43e6599d..459d3c52d 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -59,7 +59,7 @@ open module org.cryptomator.desktop { uses org.cryptomator.common.locationpresets.LocationPresetsProvider; uses SSLContextProvider; - uses org.cryptomator.notify.NotificationHandler; + uses org.cryptomator.event.NotificationHandler; provides TrayMenuController with AwtTrayMenuController; provides Configurator with LogbackConfiguratorFactory; diff --git a/src/main/java/org/cryptomator/common/CommonsModule.java b/src/main/java/org/cryptomator/common/CommonsModule.java index 85a28e9f1..b130a7d83 100644 --- a/src/main/java/org/cryptomator/common/CommonsModule.java +++ b/src/main/java/org/cryptomator/common/CommonsModule.java @@ -15,7 +15,7 @@ import org.cryptomator.common.vaults.VaultComponent; import org.cryptomator.common.vaults.VaultListModule; import org.cryptomator.cryptolib.common.MasterkeyFileAccess; import org.cryptomator.integrations.revealpath.RevealPathService; -import org.cryptomator.notify.Event; +import org.cryptomator.event.Event; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/cryptomator/common/Environment.java b/src/main/java/org/cryptomator/common/Environment.java index 981b3729b..90bd4d567 100644 --- a/src/main/java/org/cryptomator/common/Environment.java +++ b/src/main/java/org/cryptomator/common/Environment.java @@ -111,7 +111,7 @@ public class Environment { * @return App version or "SNAPSHOT", if undefined */ public String getAppVersion() { - return System.getProperty(APP_VERSION_PROP_NAME, "SNAPSHOT"); + return System.getProperty(APP_VERSION_PROP_NAME, "1.14.2"); } public Optional getBuildNumber() { diff --git a/src/main/java/org/cryptomator/common/vaults/Vault.java b/src/main/java/org/cryptomator/common/vaults/Vault.java index 6d47c95f5..e6909cbe1 100644 --- a/src/main/java/org/cryptomator/common/vaults/Vault.java +++ b/src/main/java/org/cryptomator/common/vaults/Vault.java @@ -27,8 +27,8 @@ import org.cryptomator.integrations.mount.Mountpoint; import org.cryptomator.integrations.mount.UnmountFailedException; import org.cryptomator.integrations.quickaccess.QuickAccessService; import org.cryptomator.integrations.quickaccess.QuickAccessServiceException; -import org.cryptomator.notify.Event; -import org.cryptomator.notify.VaultEvent; +import org.cryptomator.event.Event; +import org.cryptomator.event.VaultEvent; import org.jetbrains.annotations.NotNull; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/java/org/cryptomator/notify/Answer.java b/src/main/java/org/cryptomator/event/Answer.java similarity index 87% rename from src/main/java/org/cryptomator/notify/Answer.java rename to src/main/java/org/cryptomator/event/Answer.java index 8c99b82de..bfb780e52 100644 --- a/src/main/java/org/cryptomator/notify/Answer.java +++ b/src/main/java/org/cryptomator/event/Answer.java @@ -1,4 +1,4 @@ -package org.cryptomator.notify; +package org.cryptomator.event; public sealed interface Answer permits Answer.DoNothing, Answer.DoSomething { diff --git a/src/main/java/org/cryptomator/event/Event.java b/src/main/java/org/cryptomator/event/Event.java new file mode 100644 index 000000000..34fb3176a --- /dev/null +++ b/src/main/java/org/cryptomator/event/Event.java @@ -0,0 +1,15 @@ +package org.cryptomator.event; + +public sealed interface Event extends Comparable permits UpdateEvent, VaultEvent { + + long getTimestampMilli(); + + default int compareTo(Event other) { + long timeDiff = this.getTimestampMilli() - other.getTimestampMilli(); + if (timeDiff != 0) { + return (int) timeDiff; + } + return this.equals(other) ? 0 : this.getClass().getName().compareTo(other.getClass().getName()); + } + +} diff --git a/src/main/java/org/cryptomator/notify/NotificationHandler.java b/src/main/java/org/cryptomator/event/NotificationHandler.java similarity index 91% rename from src/main/java/org/cryptomator/notify/NotificationHandler.java rename to src/main/java/org/cryptomator/event/NotificationHandler.java index 48936e30b..fe8818ec2 100644 --- a/src/main/java/org/cryptomator/notify/NotificationHandler.java +++ b/src/main/java/org/cryptomator/event/NotificationHandler.java @@ -1,4 +1,4 @@ -package org.cryptomator.notify; +package org.cryptomator.event; import org.cryptomator.integrations.common.IntegrationsLoader; diff --git a/src/main/java/org/cryptomator/event/UpdateEvent.java b/src/main/java/org/cryptomator/event/UpdateEvent.java new file mode 100644 index 000000000..2e4ae0f2d --- /dev/null +++ b/src/main/java/org/cryptomator/event/UpdateEvent.java @@ -0,0 +1,17 @@ +package org.cryptomator.event; + +import java.time.Instant; + +public record UpdateEvent(long timestamp, String newVersion) implements Event { + + public UpdateEvent(String newVersion) { + this(Instant.now().toEpochMilli(), newVersion); + } + + @Override + public long getTimestampMilli() { + return timestamp; + } +} + + diff --git a/src/main/java/org/cryptomator/event/VaultEvent.java b/src/main/java/org/cryptomator/event/VaultEvent.java new file mode 100644 index 000000000..41c0f7e0c --- /dev/null +++ b/src/main/java/org/cryptomator/event/VaultEvent.java @@ -0,0 +1,17 @@ +package org.cryptomator.event; + +import org.cryptomator.cryptofs.event.FilesystemEvent; + +import java.time.Instant; + +public record VaultEvent(long timestamp, String vaultId, String displayName, FilesystemEvent actualEvent) implements Event { + + public VaultEvent(String vaultId, String displayName, FilesystemEvent actualEvent) { + this(Instant.now().toEpochMilli(), vaultId, displayName, actualEvent); + } + + @Override + public long getTimestampMilli() { + return timestamp; + } +} diff --git a/src/main/java/org/cryptomator/notify/Event.java b/src/main/java/org/cryptomator/notify/Event.java deleted file mode 100644 index 488b28bec..000000000 --- a/src/main/java/org/cryptomator/notify/Event.java +++ /dev/null @@ -1,5 +0,0 @@ -package org.cryptomator.notify; - -public sealed interface Event permits UpdateEvent, VaultEvent { - -} diff --git a/src/main/java/org/cryptomator/notify/UpdateEvent.java b/src/main/java/org/cryptomator/notify/UpdateEvent.java deleted file mode 100644 index 0a3328fd0..000000000 --- a/src/main/java/org/cryptomator/notify/UpdateEvent.java +++ /dev/null @@ -1,3 +0,0 @@ -package org.cryptomator.notify; - -public record UpdateEvent(String newVersion) implements Event {} diff --git a/src/main/java/org/cryptomator/notify/VaultEvent.java b/src/main/java/org/cryptomator/notify/VaultEvent.java deleted file mode 100644 index 6c2690494..000000000 --- a/src/main/java/org/cryptomator/notify/VaultEvent.java +++ /dev/null @@ -1,7 +0,0 @@ -package org.cryptomator.notify; - -import org.cryptomator.cryptofs.event.FilesystemEvent; - -public record VaultEvent(String vaultId, String path, FilesystemEvent actualEvent) implements Event { - -} diff --git a/src/main/java/org/cryptomator/ui/eventviewer/EventViewController.java b/src/main/java/org/cryptomator/ui/eventviewer/EventViewController.java index 2a0921921..9ec7602a8 100644 --- a/src/main/java/org/cryptomator/ui/eventviewer/EventViewController.java +++ b/src/main/java/org/cryptomator/ui/eventviewer/EventViewController.java @@ -1,14 +1,39 @@ package org.cryptomator.ui.eventviewer; +import org.cryptomator.event.Event; import org.cryptomator.ui.common.FxController; import javax.inject.Inject; +import javafx.collections.ObservableList; +import javafx.collections.transformation.SortedList; +import javafx.fxml.FXML; +import javafx.scene.control.ListView; +import java.util.Comparator; @EventViewerScoped public class EventViewController implements FxController { - @Inject - public EventViewController() { + private final SortedList reversedEventList; + private final ObservableList eventList; + @FXML + ListView eventListView; + + @Inject + public EventViewController(ObservableList eventList) { + reversedEventList = new SortedList<>(eventList, Comparator.reverseOrder()); + this.eventList = eventList; } + + @FXML + public void initialize() { + eventListView.setItems(reversedEventList); + } + + @FXML + void emptyEventList() { + eventList.clear(); + } + + } diff --git a/src/main/java/org/cryptomator/ui/eventviewer/EventViewerModule.java b/src/main/java/org/cryptomator/ui/eventviewer/EventViewerModule.java index 1b552f41a..9931252f7 100644 --- a/src/main/java/org/cryptomator/ui/eventviewer/EventViewerModule.java +++ b/src/main/java/org/cryptomator/ui/eventviewer/EventViewerModule.java @@ -30,7 +30,7 @@ abstract class EventViewerModule { Stage stage = factory.create(); stage.setTitle("TODO EVENTVIEWER"); stage.setResizable(true); - stage.initModality(Modality.WINDOW_MODAL); //TODO: or not modal at all? + stage.initModality(Modality.NONE); stage.initOwner(owner); return stage; } @@ -42,11 +42,6 @@ abstract class EventViewerModule { return new FxmlLoaderFactory(factories, sceneFactory, resourceBundle); } - @Binds - @IntoMap - @FxControllerKey(EventViewController.class) - abstract FxController bindEventViewController(EventViewController controller); - @Provides @FxmlScene(FxmlFile.EVENT_VIEWER) @EventViewerScoped @@ -54,4 +49,14 @@ abstract class EventViewerModule { return fxmlLoaders.createScene(FxmlFile.EVENT_VIEWER); } + + @Binds + @IntoMap + @FxControllerKey(EventViewController.class) + abstract FxController bindEventViewController(EventViewController controller); + + @Binds + @IntoMap + @FxControllerKey(UpdateEventViewController.class) + abstract FxController bindUpdateEventViewController(UpdateEventViewController controller); } diff --git a/src/main/java/org/cryptomator/ui/eventviewer/UpdateEventViewController.java b/src/main/java/org/cryptomator/ui/eventviewer/UpdateEventViewController.java new file mode 100644 index 000000000..5c2778ade --- /dev/null +++ b/src/main/java/org/cryptomator/ui/eventviewer/UpdateEventViewController.java @@ -0,0 +1,14 @@ +package org.cryptomator.ui.eventviewer; + +import org.cryptomator.ui.common.FxController; + +import javax.inject.Inject; + +@EventViewerScoped +public class UpdateEventViewController implements FxController { + + @Inject + public UpdateEventViewController() { + + } +} diff --git a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java index b5d2a1973..f51cfb25d 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java +++ b/src/main/java/org/cryptomator/ui/fxapp/FxApplicationWindows.java @@ -204,10 +204,14 @@ public class FxApplicationWindows { } } - public CompletionStage showEventViewer(@Nullable Stage owner) { + public CompletionStage showEventViewer(@Nullable Stage owner) { return CompletableFuture.supplyAsync(() -> { eventViewWindow.create(owner).showEventViewerWindow(); return null; - }, Platform::runLater); + }, Platform::runLater).exceptionally(t -> { + LOG.error("Unable to display event viewer.", t); + + return null; + }); } } diff --git a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java index b66edbc85..39eeaa277 100644 --- a/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java +++ b/src/main/java/org/cryptomator/ui/fxapp/UpdateChecker.java @@ -3,8 +3,8 @@ package org.cryptomator.ui.fxapp; import org.cryptomator.common.Environment; import org.cryptomator.common.SemVerComparator; import org.cryptomator.common.settings.Settings; -import org.cryptomator.notify.Event; -import org.cryptomator.notify.UpdateEvent; +import org.cryptomator.event.Event; +import org.cryptomator.event.UpdateEvent; import org.slf4j.Logger; import org.slf4j.LoggerFactory; diff --git a/src/main/resources/css/light_theme.css b/src/main/resources/css/light_theme.css index 516dd0b26..ffa9604f1 100644 --- a/src/main/resources/css/light_theme.css +++ b/src/main/resources/css/light_theme.css @@ -215,6 +215,26 @@ -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_ARMED; } +.event-window .button-bar .button-right { + -fx-border-color: CONTROL_BORDER_NORMAL; + -fx-border-width: 0 0 0 1px; + -fx-background-color: MAIN_BG; + -fx-background-radius: 0px; + -fx-min-height: 42px; + -fx-max-height: 42px; +} + +.event-window .button-bar .button-right:armed { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_ARMED; +} + +.event-window .button-bar { + -fx-min-height:42px; + -fx-max-height:42px; + -fx-background-color: MAIN_BG; + -fx-border-color: CONTROL_BORDER_NORMAL transparent transparent transparent; + -fx-border-width: 1px 0 0 0; +} /******************************************************************************* * * * TabPane * diff --git a/src/main/resources/fxml/eventviewer.fxml b/src/main/resources/fxml/eventviewer.fxml index fa268bb45..bffc2c8bc 100644 --- a/src/main/resources/fxml/eventviewer.fxml +++ b/src/main/resources/fxml/eventviewer.fxml @@ -1,32 +1,22 @@ - - - + + - + - - - - - - - - - - - - - - - - - + styleClass="event-window" + > + + +