From 35ac3515410629c191b048a4f10f41405e94bf29 Mon Sep 17 00:00:00 2001 From: Armin Schrenk Date: Tue, 25 Aug 2026 14:12:00 +0200 Subject: [PATCH 1/3] Increase usablity of TOFU dialog * Add description * display URLs in legible font * add copy button for URLs --- .../hub/CheckHostTrustController.java | 69 ++++++++++++++++-- .../css/AtkinsonHyperlegibleMono-Regular.ttf | Bin 0 -> 34320 bytes src/main/resources/css/dark_theme.css | 15 ++++ src/main/resources/css/light_theme.css | 15 ++++ .../resources/fxml/hub_check_host_trust.fxml | 11 +-- src/main/resources/i18n/strings.properties | 3 + 6 files changed, 101 insertions(+), 12 deletions(-) create mode 100644 src/main/resources/css/AtkinsonHyperlegibleMono-Regular.ttf diff --git a/src/main/java/org/cryptomator/ui/keyloading/hub/CheckHostTrustController.java b/src/main/java/org/cryptomator/ui/keyloading/hub/CheckHostTrustController.java index 18bdbfead..aa5ce3c1e 100644 --- a/src/main/java/org/cryptomator/ui/keyloading/hub/CheckHostTrustController.java +++ b/src/main/java/org/cryptomator/ui/keyloading/hub/CheckHostTrustController.java @@ -6,6 +6,8 @@ import org.cryptomator.common.settings.Settings; import org.cryptomator.ui.common.FxController; import org.cryptomator.ui.common.FxmlFile; import org.cryptomator.ui.common.FxmlScene; +import org.cryptomator.ui.controls.FontAwesome5Icon; +import org.cryptomator.ui.controls.FontAwesome5IconView; import org.cryptomator.ui.keyloading.KeyLoading; import org.cryptomator.ui.keyloading.KeyLoadingScoped; import org.jetbrains.annotations.VisibleForTesting; @@ -13,14 +15,24 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.inject.Inject; +import javafx.animation.PauseTransition; import javafx.application.Platform; import javafx.beans.property.SimpleStringProperty; import javafx.beans.property.StringProperty; import javafx.fxml.FXML; +import javafx.geometry.Pos; +import javafx.scene.Node; import javafx.scene.Scene; -import javafx.scene.text.Text; -import javafx.scene.text.TextFlow; +import javafx.scene.control.Hyperlink; +import javafx.scene.control.Label; +import javafx.scene.control.Tooltip; +import javafx.scene.input.Clipboard; +import javafx.scene.input.ClipboardContent; +import javafx.scene.layout.HBox; +import javafx.scene.layout.Priority; +import javafx.scene.layout.VBox; import javafx.stage.Stage; +import javafx.util.Duration; import java.net.URI; import java.util.ResourceBundle; import java.util.Set; @@ -35,7 +47,11 @@ public class CheckHostTrustController implements FxController { private static final String CHECK_KEY = "hub.checkHostTrust.message.check"; private static final String ASK_SINGULAR_KEY = "hub.checkHostTrust.message.ask"; private static final String ASK_PLURAL_KEY = "hub.checkHostTrust.message.ask.plural"; + private static final String DESCRIPTION_SINGULAR_KEY = "hub.checkHostTrust.description.ask"; + private static final String DESCRIPTION_PLURAL_KEY = "hub.checkHostTrust.description.ask.plural"; + private static final String COPY_TOOLTIP_KEY = "hub.checkHostTrust.copyBtn.tooltip"; private static final String TRUSTED_CRYPTOMATOR_CLOUD_DOMAIN = ".cryptomator.cloud"; + private static final Duration COPIED_INDICATION_DURATION = Duration.seconds(2); private final Stage window; private final HubConfig hubConfig; @@ -49,9 +65,10 @@ public class CheckHostTrustController implements FxController { private final ResourceBundle resourceBundle; private final SortedSet hostnames; private final StringProperty messageLabel; + private final StringProperty descriptionLabel; @FXML - private TextFlow hostnamesFlow; + private VBox hostnamesBox; @Inject public CheckHostTrustController(@KeyLoading Stage window, // @@ -74,6 +91,7 @@ public class CheckHostTrustController implements FxController { this.resourceBundle = resourceBundle; this.hostnames = new TreeSet<>(); this.messageLabel = new SimpleStringProperty(resourceBundle.getString(CHECK_KEY)); + this.descriptionLabel = new SimpleStringProperty(""); } @FXML @@ -117,12 +135,41 @@ public class CheckHostTrustController implements FxController { } private void renderHostnames() { - hostnamesFlow.getChildren().clear(); + hostnamesBox.getChildren().clear(); for (var hostname : hostnames) { - hostnamesFlow.getChildren().add(new Text(hostname + System.lineSeparator())); + hostnamesBox.getChildren().add(createHostnameRow(hostname)); } - var messageKey = hostnames.size() > 1 ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY; - messageLabel.set(resourceBundle.getString(messageKey)); + var plural = hostnames.size() > 1; + messageLabel.set(resourceBundle.getString(plural ? ASK_PLURAL_KEY : ASK_SINGULAR_KEY)); + descriptionLabel.set(resourceBundle.getString(plural ? DESCRIPTION_PLURAL_KEY : DESCRIPTION_SINGULAR_KEY)); + } + + private Node createHostnameRow(String hostname) { + var label = new Label(hostname); + label.setWrapText(true); + HBox.setHgrow(label, Priority.ALWAYS); + + var icon = new FontAwesome5IconView(); + icon.setGlyph(FontAwesome5Icon.COPY); + var copyLink = new Hyperlink(null, icon); + copyLink.setTooltip(new Tooltip(resourceBundle.getString(COPY_TOOLTIP_KEY))); + copyLink.setAccessibleText(resourceBundle.getString(COPY_TOOLTIP_KEY)); + copyLink.setOnAction(_ -> copyToClipboard(hostname, icon)); + + var row = new HBox(6, label, copyLink); + row.setAlignment(Pos.CENTER_LEFT); + return row; + } + + private void copyToClipboard(String hostname, FontAwesome5IconView icon) { + var clipboardContent = new ClipboardContent(); + clipboardContent.putString(hostname); + Clipboard.getSystemClipboard().setContent(clipboardContent); + + icon.setGlyph(FontAwesome5Icon.CHECK); + var resetIcon = new PauseTransition(COPIED_INDICATION_DURATION); + resetIcon.setOnFinished(_ -> icon.setGlyph(FontAwesome5Icon.COPY)); + resetIcon.play(); } private boolean isConsistentHubConfig() { @@ -176,4 +223,12 @@ public class CheckHostTrustController implements FxController { return messageLabel.get(); } + public StringProperty descriptionLabelProperty() { + return descriptionLabel; + } + + public String getDescriptionLabel() { + return descriptionLabel.get(); + } + } diff --git a/src/main/resources/css/AtkinsonHyperlegibleMono-Regular.ttf b/src/main/resources/css/AtkinsonHyperlegibleMono-Regular.ttf new file mode 100644 index 0000000000000000000000000000000000000000..157d62eabf3f7966d77ef41c7407afa1f4860cf7 GIT binary patch literal 34320 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 literal 0 HcmV?d00001 diff --git a/src/main/resources/css/dark_theme.css b/src/main/resources/css/dark_theme.css index bb23af18c..f4416282c 100644 --- a/src/main/resources/css/dark_theme.css +++ b/src/main/resources/css/dark_theme.css @@ -20,6 +20,10 @@ src: url('firacode_regular.ttf'); } +@font-face { + src: url('AtkinsonHyperlegibleMono-Regular.ttf'); +} + /******************************************************************************* * * * Root Styling & Colors * @@ -141,6 +145,17 @@ -fx-font-size: 1.1em; } +.hostname-list { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 1px; + -fx-background-radius: 4px; + -fx-padding: 6px 8px 6px 8px; +} + +.hostname-list .label { + -fx-font-family: 'Atkinson Hyperlegible Mono'; +} + /******************************************************************************* * * * Glyph Icons * diff --git a/src/main/resources/css/light_theme.css b/src/main/resources/css/light_theme.css index dcbee907f..68e2a099e 100644 --- a/src/main/resources/css/light_theme.css +++ b/src/main/resources/css/light_theme.css @@ -20,6 +20,10 @@ src: url('firacode_regular.ttf'); } +@font-face { + src: url('AtkinsonHyperlegibleMono-Regular.ttf'); +} + /******************************************************************************* * * * Root Styling & Colors * @@ -141,6 +145,17 @@ -fx-font-size: 1.1em; } +.hostname-list { + -fx-background-color: CONTROL_BORDER_NORMAL, CONTROL_BG_NORMAL; + -fx-background-insets: 0, 1px; + -fx-background-radius: 4px; + -fx-padding: 6px 8px 6px 8px; +} + +.hostname-list .label { + -fx-font-family: 'Atkinson Hyperlegible Mono'; +} + /******************************************************************************* * * * Glyph Icons * diff --git a/src/main/resources/fxml/hub_check_host_trust.fxml b/src/main/resources/fxml/hub_check_host_trust.fxml index e93936a93..d124948e2 100644 --- a/src/main/resources/fxml/hub_check_host_trust.fxml +++ b/src/main/resources/fxml/hub_check_host_trust.fxml @@ -11,12 +11,11 @@ - - + - +