mirror of
https://github.com/cryptomator/cryptomator.git
synced 2026-08-18 13:16:02 +00:00
Merge pull request #4103 from cryptomator/feature/basic-accessibility
Feature: Improve accessibility for core functionality
This commit is contained in:
+1
-1
@@ -15,7 +15,7 @@ Changes to prior versions can be found on the [Github release page](https://gith
|
||||
* Implemented Flatpak update mechanism
|
||||
* App notifications ([#4069](https://github.com/cryptomator/cryptomator/pull/4069))
|
||||
* Mark files in-use for Hub vaults ([#4078](https://github.com/cryptomator/cryptomator/pull/4078))
|
||||
* Accessibility labels for GUI elements ([#4064](https://github.com/cryptomator/cryptomator/issues/4064), [#4066](https://github.com/cryptomator/cryptomator/pull/4066), [#4055](https://github.com/cryptomator/cryptomator/issues/4055))
|
||||
* Accessibility: Adjust app to be used with a screen reader ([#547](https://github.com/cryptomator/cryptomator/issues/547))
|
||||
* Show Archived Vault Dialog on unlock when Hub returns 410 ([#4081](https://github.com/cryptomator/cryptomator/pull/4081))
|
||||
|
||||
### Changed
|
||||
|
||||
+22
-12
@@ -4,24 +4,27 @@ import javafx.beans.property.BooleanProperty;
|
||||
import javafx.beans.property.SimpleBooleanProperty;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.geometry.Pos;
|
||||
import javafx.scene.AccessibleRole;
|
||||
import javafx.scene.control.Button;
|
||||
import javafx.scene.control.ContentDisplay;
|
||||
import javafx.scene.control.Label;
|
||||
import javafx.scene.layout.HBox;
|
||||
import javafx.scene.layout.Region;
|
||||
import javafx.scene.layout.VBox;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
public class NotificationBar extends HBox {
|
||||
public class InfoBar extends HBox {
|
||||
|
||||
@FXML
|
||||
private Label notificationLabel;
|
||||
private Label infoMessage;
|
||||
|
||||
private final BooleanProperty dismissable = new SimpleBooleanProperty();
|
||||
private final BooleanProperty notify = new SimpleBooleanProperty();
|
||||
|
||||
|
||||
public NotificationBar() {
|
||||
public InfoBar() {
|
||||
setAlignment(Pos.CENTER);
|
||||
setStyle("-fx-alignment: center;");
|
||||
getStyleClass().addAll("info-bar");
|
||||
|
||||
Region spacer = new Region();
|
||||
spacer.setMinWidth(40);
|
||||
@@ -36,14 +39,21 @@ public class NotificationBar extends HBox {
|
||||
vbox.setAlignment(Pos.CENTER);
|
||||
HBox.setHgrow(vbox, javafx.scene.layout.Priority.ALWAYS);
|
||||
|
||||
notificationLabel = new Label();
|
||||
notificationLabel.getStyleClass().add("notification-label");
|
||||
notificationLabel.setStyle("-fx-alignment: center;");
|
||||
vbox.getChildren().add(notificationLabel);
|
||||
infoMessage = new Label();
|
||||
infoMessage.setFocusTraversable(true);
|
||||
infoMessage.setAccessibleRole(AccessibleRole.BUTTON);
|
||||
vbox.getChildren().add(infoMessage);
|
||||
|
||||
Button closeButton = new Button("X");
|
||||
var closeGraphic = new FontAwesome5IconView();
|
||||
closeGraphic.setGlyph(FontAwesome5Icon.TIMES);
|
||||
closeGraphic.setGlyphSize(12);
|
||||
closeGraphic.getStyleClass().add("glyph");
|
||||
|
||||
Button closeButton = new Button();
|
||||
closeButton.setGraphic(closeGraphic);
|
||||
closeButton.setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
|
||||
closeButton.setAccessibleText(ResourceBundle.getBundle("i18n.strings").getString("main.notification.closeButton.tooltip"));
|
||||
closeButton.setMinWidth(40);
|
||||
closeButton.setStyle("-fx-background-color: transparent; -fx-text-fill: white; -fx-font-weight: bold;");
|
||||
closeButton.visibleProperty().bind(dismissable);
|
||||
|
||||
closeButton.setOnAction(_ -> {
|
||||
@@ -61,11 +71,11 @@ public class NotificationBar extends HBox {
|
||||
}
|
||||
|
||||
public String getText() {
|
||||
return notificationLabel.getText();
|
||||
return infoMessage.getText();
|
||||
}
|
||||
|
||||
public void setText(String text) {
|
||||
notificationLabel.setText(text);
|
||||
infoMessage.setText(text);
|
||||
}
|
||||
|
||||
public void setStyleClass(String styleClass) {
|
||||
@@ -16,6 +16,7 @@ import javafx.beans.value.ObservableValue;
|
||||
import javafx.fxml.FXML;
|
||||
import javafx.geometry.Insets;
|
||||
import javafx.scene.layout.HBox;
|
||||
import java.util.ResourceBundle;
|
||||
|
||||
// unscoped because each cell needs its own controller
|
||||
public class VaultListCellController implements FxController {
|
||||
@@ -23,9 +24,12 @@ public class VaultListCellController implements FxController {
|
||||
private static final Insets COMPACT_INSETS = new Insets(6, 12, 6, 12);
|
||||
private static final Insets DEFAULT_INSETS = new Insets(12);
|
||||
|
||||
private final ResourceBundle resourceBundle;
|
||||
private final ObjectProperty<Vault> vault = new SimpleObjectProperty<>();
|
||||
private final ObservableValue<VaultState.Value> vaultState;
|
||||
private final ObservableValue<FontAwesome5Icon> glyph;
|
||||
private final ObservableValue<Boolean> compactMode;
|
||||
private final ObservableValue<String> accessibleText;
|
||||
|
||||
private AutoAnimator spinAnimation;
|
||||
|
||||
@@ -35,17 +39,21 @@ public class VaultListCellController implements FxController {
|
||||
public HBox vaultListCell;
|
||||
|
||||
@Inject
|
||||
VaultListCellController(Settings settings) {
|
||||
this.glyph = vault.flatMap(Vault::stateProperty).map(this::getGlyphForVaultState);
|
||||
VaultListCellController(Settings settings, ResourceBundle resourceBundle) {
|
||||
this.resourceBundle = resourceBundle;
|
||||
this.vaultState = vault.flatMap(Vault::stateProperty);
|
||||
this.glyph = vaultState.map(this::getGlyphForVaultState);
|
||||
this.accessibleText = vaultState.map(this::getAccessibleTextForVaultState);
|
||||
this.compactMode = settings.compactMode;
|
||||
}
|
||||
|
||||
public void initialize() {
|
||||
this.spinAnimation = AutoAnimator.animate(Animations.createDiscrete360Rotation(vaultStateView)) //
|
||||
.onCondition(vault.flatMap(Vault::stateProperty).map(VaultState.Value.PROCESSING::equals).orElse(false)) //
|
||||
.onCondition(vaultState.map(VaultState.Value.PROCESSING::equals).orElse(false)) //
|
||||
.afterStop(() -> vaultStateView.setRotate(0)) //
|
||||
.build();
|
||||
this.vaultListCell.paddingProperty().bind(compactMode.map(c -> c ? COMPACT_INSETS : DEFAULT_INSETS));
|
||||
this.vaultListCell.accessibleTextProperty().bind(accessibleText);
|
||||
}
|
||||
|
||||
// TODO deduplicate w/ VaultDetailController
|
||||
@@ -62,6 +70,25 @@ public class VaultListCellController implements FxController {
|
||||
}
|
||||
}
|
||||
|
||||
private String getAccessibleTextForVaultState(VaultState.Value state) {
|
||||
var v = vault.get();
|
||||
if (state != null && v != null) {
|
||||
var translationKey = switch (state) {
|
||||
case LOCKED -> "vault.state.locked";
|
||||
case PROCESSING -> "vault.state.processing";
|
||||
case UNLOCKED -> "vault.state.unlocked";
|
||||
case NEEDS_MIGRATION -> "vault.state.migrationNeeded";
|
||||
case MISSING -> "vault.state.missing";
|
||||
case VAULT_CONFIG_MISSING, ALL_MISSING, ERROR -> "vault.state.error";
|
||||
};
|
||||
|
||||
var localizedState = resourceBundle.getString(translationKey);
|
||||
return resourceBundle.getString("main.vaultlist.listEntry").formatted(v.getDisplayName(), localizedState);
|
||||
} else {
|
||||
return "";
|
||||
}
|
||||
}
|
||||
|
||||
/* Getter/Setter */
|
||||
|
||||
public ObservableValue<FontAwesome5Icon> glyphProperty() {
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
GREEN_5: PRIMARY;
|
||||
RED_5: #E74C3C;
|
||||
ORANGE_5: #E67E22;
|
||||
YELLOW_4: #C19F0E;
|
||||
YELLOW_5: #F1C40F;
|
||||
|
||||
MAIN_BG: GRAY_1;
|
||||
@@ -387,37 +388,62 @@
|
||||
|
||||
/*******************************************************************************
|
||||
* *
|
||||
* NotificationBar *
|
||||
* InfoBar *
|
||||
* *
|
||||
******************************************************************************/
|
||||
.info-bar {
|
||||
-fx-alignment: center;
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: -bar-bg;
|
||||
}
|
||||
|
||||
.notification-label {
|
||||
-fx-text-fill: white;
|
||||
.info-bar--green {
|
||||
-bar-bg: GREEN_5;
|
||||
-button-bg: GREEN_5;
|
||||
-button-bg-pressed: GREEN_3;
|
||||
}
|
||||
|
||||
.info-bar--yellow {
|
||||
-bar-bg: YELLOW_5;
|
||||
-button-bg: YELLOW_5;
|
||||
-button-bg-pressed: YELLOW_4;
|
||||
}
|
||||
|
||||
.info-bar--red {
|
||||
-bar-bg: RED_5;
|
||||
-button-bg: RED_5;
|
||||
-button-bg-pressed: RED_5;
|
||||
}
|
||||
|
||||
.info-bar .label {
|
||||
-fx-text-fill: GRAY_9;
|
||||
-fx-font-weight: bold;
|
||||
}
|
||||
|
||||
.notification-debug {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: RED_5;
|
||||
.info-bar--yellow .label {
|
||||
-fx-text-fill: GRAY_9;
|
||||
-fx-font-weight: bold;
|
||||
-fx-effect: dropshadow( gaussian , rgba(0,0,0,0.45) , 2 , 0 , 0 , 1 );
|
||||
}
|
||||
|
||||
.notification-update {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: YELLOW_5;
|
||||
.info-bar .glyph {
|
||||
-fx-fill: GRAY_9;
|
||||
}
|
||||
|
||||
.notification-support {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: PRIMARY;
|
||||
.info-bar:hover .label {
|
||||
-fx-underline:true;
|
||||
}
|
||||
|
||||
.notification-debug:hover .notification-label,
|
||||
.notification-update:hover .notification-label,
|
||||
.notification-support:hover .notification-label {
|
||||
-fx-underline:true;
|
||||
.info-bar .button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: transparent;
|
||||
-fx-padding: 2 2 2 2;
|
||||
}
|
||||
|
||||
.info-bar .button:armed {
|
||||
-fx-background-color: -button-bg-pressed;
|
||||
-fx-background-radius: 8;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
|
||||
@@ -50,6 +50,7 @@
|
||||
GREEN_5: PRIMARY;
|
||||
RED_5: #E74C3C;
|
||||
ORANGE_5: #E67E22;
|
||||
YELLOW_4: #C19F0E;
|
||||
YELLOW_5: #F1C40F;
|
||||
|
||||
MAIN_BG: GRAY_9;
|
||||
@@ -387,39 +388,64 @@
|
||||
|
||||
/*******************************************************************************
|
||||
* *
|
||||
* NotificationBar *
|
||||
* InfoBar *
|
||||
* *
|
||||
******************************************************************************/
|
||||
.info-bar {
|
||||
-fx-alignment: center;
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: -bar-bg;
|
||||
}
|
||||
|
||||
.notification-label {
|
||||
-fx-text-fill: white;
|
||||
.info-bar--green {
|
||||
-bar-bg: GREEN_5;
|
||||
-button-bg: GREEN_5;
|
||||
-button-bg-pressed: GREEN_3;
|
||||
}
|
||||
|
||||
.info-bar--yellow {
|
||||
-bar-bg: YELLOW_5;
|
||||
-button-bg: YELLOW_5;
|
||||
-button-bg-pressed: YELLOW_4;
|
||||
}
|
||||
|
||||
.info-bar--red {
|
||||
-bar-bg: RED_5;
|
||||
-button-bg: RED_5;
|
||||
-button-bg-pressed: RED_5;
|
||||
}
|
||||
|
||||
.info-bar .label {
|
||||
-fx-text-fill: GRAY_9;
|
||||
-fx-font-weight: bold;
|
||||
}
|
||||
|
||||
.notification-debug {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: RED_5;
|
||||
.info-bar--yellow .label {
|
||||
-fx-text-fill: GRAY_9;
|
||||
-fx-font-weight: bold;
|
||||
-fx-effect: dropshadow( gaussian , rgba(0,0,0,0.45) , 2 , 0 , 0 , 1 );
|
||||
}
|
||||
|
||||
.notification-update {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: YELLOW_5;
|
||||
.info-bar .glyph {
|
||||
-fx-fill: GRAY_9;
|
||||
}
|
||||
|
||||
.notification-support {
|
||||
-fx-min-height:24px;
|
||||
-fx-max-height:24px;
|
||||
-fx-background-color: PRIMARY;
|
||||
}
|
||||
|
||||
.notification-debug:hover .notification-label,
|
||||
.notification-update:hover .notification-label,
|
||||
.notification-support:hover .notification-label {
|
||||
.info-bar:hover .label {
|
||||
-fx-underline:true;
|
||||
}
|
||||
|
||||
.info-bar .button {
|
||||
-fx-background-color: transparent;
|
||||
-fx-border-color: transparent;
|
||||
-fx-padding: 2 2 2 2;
|
||||
}
|
||||
|
||||
.info-bar .button:armed {
|
||||
-fx-background-color: -button-bg-pressed;
|
||||
-fx-background-radius: 8;
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* *
|
||||
* ScrollBar *
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="24"
|
||||
alignment="CENTER">
|
||||
alignment="CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="CENTER_LEFT">
|
||||
alignment="CENTER_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="CENTER_LEFT">
|
||||
alignment="CENTER_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<fx:define>
|
||||
<ToggleGroup fx:id="locationPresetsToggler"/>
|
||||
<FontAwesome5IconView fx:id="badLocation" styleClass="glyph-icon-red" glyph="TIMES"/>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="CENTER_LEFT">
|
||||
alignment="CENTER_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="CENTER_LEFT">
|
||||
alignment="CENTER_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<fx:define>
|
||||
<ToggleGroup fx:id="recoveryKeyChoice"/>
|
||||
</fx:define>
|
||||
|
||||
@@ -11,7 +11,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="CENTER_LEFT">
|
||||
alignment="CENTER_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -13,7 +13,8 @@
|
||||
fx:controller="org.cryptomator.ui.changepassword.ChangePasswordController"
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
minHeight="450"
|
||||
prefWidth="450"
|
||||
prefHeight="450"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="24"/>
|
||||
</padding>
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -11,6 +11,7 @@
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import javafx.scene.shape.Circle?>
|
||||
<!-- TODO: simple dialog -->
|
||||
<HBox xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.keyloading.hub.RegisterFailedController"
|
||||
@@ -18,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="500"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
<?import javafx.scene.control.SplitPane?>
|
||||
<?import javafx.scene.layout.StackPane?>
|
||||
<?import javafx.scene.layout.VBox?>
|
||||
<?import org.cryptomator.ui.controls.NotificationBar?>
|
||||
<?import org.cryptomator.ui.controls.InfoBar?>
|
||||
|
||||
<StackPane xmlns:fx="http://javafx.com/fxml"
|
||||
xmlns="http://javafx.com/javafx"
|
||||
@@ -11,23 +11,23 @@
|
||||
fx:controller="org.cryptomator.ui.mainwindow.MainWindowController"
|
||||
styleClass="main-window">
|
||||
<VBox minWidth="600">
|
||||
<NotificationBar onMouseClicked="#showUpdatePreferences"
|
||||
<InfoBar onMouseClicked="#showUpdatePreferences"
|
||||
text="%main.notification.updateAvailable"
|
||||
dismissable="true"
|
||||
notify="${controller.updateAvailable}"
|
||||
styleClass="notification-update"/>
|
||||
<NotificationBar onMouseClicked="#showContributePreferences"
|
||||
styleClass="info-bar--yellow"/>
|
||||
<InfoBar onMouseClicked="#showContributePreferences"
|
||||
text="%main.notification.support"
|
||||
dismissable="true"
|
||||
notify="${!controller.licenseValid}"
|
||||
styleClass="notification-support"/>
|
||||
styleClass="info-bar--green"/>
|
||||
<SplitPane dividerPositions="0.33" orientation="HORIZONTAL" VBox.vgrow="ALWAYS">
|
||||
<fx:include source="vault_list.fxml" SplitPane.resizableWithParent="false"/>
|
||||
<fx:include source="vault_detail.fxml" SplitPane.resizableWithParent="true"/>
|
||||
</SplitPane>
|
||||
<NotificationBar onMouseClicked="#showGeneralPreferences"
|
||||
<InfoBar onMouseClicked="#showGeneralPreferences"
|
||||
text="DEBUG MODE"
|
||||
styleClass="notification-debug"
|
||||
styleClass="info-bar--red"
|
||||
notify="${controller.debugModeEnabled}"/>
|
||||
</VBox>
|
||||
</StackPane>
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
fx:controller="org.cryptomator.ui.migration.MigrationStartController"
|
||||
prefWidth="580"
|
||||
prefHeight="350"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -15,7 +15,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -16,7 +16,8 @@
|
||||
xmlns:fx="http://javafx.com/fxml"
|
||||
fx:controller="org.cryptomator.ui.notification.NotificationController"
|
||||
prefHeight="200.0" prefWidth="400.0" maxHeight="200.0" maxWidth="400.0"
|
||||
styleClass="notification-window">
|
||||
styleClass="notification-window"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets top="12" right="12" bottom="12" left="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="175"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -14,7 +14,8 @@
|
||||
minWidth="350"
|
||||
minHeight="280"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<children>
|
||||
<FormattedLabel format="%recoveryKey.display.description" arg1="${controller.vaultName}" wrapText="true" labelFor="$textarea"/>
|
||||
|
||||
|
||||
@@ -22,7 +22,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -25,7 +25,8 @@
|
||||
prefWidth="480"
|
||||
minHeight="242"
|
||||
spacing="12"
|
||||
VBox.vgrow="ALWAYS">
|
||||
VBox.vgrow="ALWAYS"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -12,7 +12,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_CENTER">
|
||||
alignment="TOP_CENTER"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -10,7 +10,8 @@
|
||||
fx:controller="org.cryptomator.ui.recoverykey.RecoveryKeyValidateController"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<children>
|
||||
<FormattedLabel format="%recoveryKey.recover.prompt" arg1="${controller.vault.displayName}" wrapText="true" labelFor="$textarea"/>
|
||||
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
xmlns="http://javafx.com/javafx"
|
||||
fx:controller="org.cryptomator.ui.sharevault.ShareVaultController"
|
||||
prefWidth="540"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
minWidth="400"
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12">
|
||||
spacing="12"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -19,7 +19,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -20,7 +20,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -21,7 +21,8 @@
|
||||
maxWidth="400"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,7 +18,8 @@
|
||||
prefWidth="500"
|
||||
minHeight="145"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
<Label styleClass="badge,badge-pill,badge-muted" text="…" minWidth="-Infinity" visible="${controller.vault.processing}" managed="${controller.vault.processing}"/>
|
||||
<Label styleClass="badge,badge-pill,badge-primary" text="%main.vaultDetail.unlockedStatus" minWidth="-Infinity" visible="${controller.vault.unlocked}" managed="${controller.vault.unlocked}"/>
|
||||
</HBox>
|
||||
<Hyperlink styleClass="hyperlink-muted,hyperlink-hover-icon" text="${controller.vault.displayablePath}" textOverrun="CENTER_ELLIPSIS" onAction="#revealStorageLocation">
|
||||
<Hyperlink styleClass="hyperlink-muted,hyperlink-hover-icon" text="${controller.vault.displayablePath}" textOverrun="CENTER_ELLIPSIS" onAction="#revealStorageLocation" accessibleText="%main.vaultDetail.storageLocation" accessibleRole="BUTTON">
|
||||
<graphic>
|
||||
<FontAwesome5IconView styleClass="glyph-icon-muted" glyph="EYE"/>
|
||||
</graphic>
|
||||
|
||||
@@ -22,7 +22,7 @@
|
||||
<VBox>
|
||||
<StackPane VBox.vgrow="ALWAYS">
|
||||
<VBox>
|
||||
<ListView fx:id="vaultList" editable="true" fixedCellSize="${controller.cellSize}">
|
||||
<ListView fx:id="vaultList" editable="true" fixedCellSize="${controller.cellSize}" accessibleText="%main.vaultlist">
|
||||
<contextMenu>
|
||||
<fx:include source="vault_list_contextmenu.fxml"/>
|
||||
</contextMenu>
|
||||
|
||||
@@ -23,7 +23,8 @@
|
||||
minWidth="-Infinity"
|
||||
minHeight="-Infinity"
|
||||
spacing="12"
|
||||
alignment="TOP_LEFT">
|
||||
alignment="TOP_LEFT"
|
||||
accessibleRole="DIALOG">
|
||||
<padding>
|
||||
<Insets topRightBottomLeft="12"/>
|
||||
</padding>
|
||||
|
||||
@@ -18,6 +18,14 @@ generic.button.next=Next
|
||||
generic.button.print=Print
|
||||
generic.button.remove=Remove
|
||||
|
||||
## Vault state
|
||||
vault.state.locked=Locked
|
||||
vault.state.unlocked=Unlocked
|
||||
vault.state.missing=Missing
|
||||
vault.state.migrationNeeded=Migration required
|
||||
vault.state.processing=Processing
|
||||
vault.state.error=Error
|
||||
|
||||
# Error
|
||||
error.message=An error occurred
|
||||
error.description=Cryptomator didn't expect this to happen. You can look up existing solutions for this error. Or if it has not been reported yet, feel free to do so.
|
||||
@@ -402,6 +410,8 @@ stats.access.total=Total accesses: %d
|
||||
|
||||
# Main Window
|
||||
## Vault List
|
||||
main.vaultlist=Vaults
|
||||
main.vaultlist.listEntry=Vault %s (%s)
|
||||
main.vaultlist.emptyList.onboardingInstruction=Click here to add a vault
|
||||
main.vaultlist.contextMenu.remove=Remove…
|
||||
main.vaultlist.contextMenu.lock=Lock
|
||||
@@ -416,12 +426,14 @@ main.vaultlist.addVaultBtn.menuItemRecover=Recover Existing Vault…
|
||||
main.vaultlist.addVaultButton.tooltip=Add Vault
|
||||
main.vaultlist.showEventsButton.tooltip=Open Event View
|
||||
main.vaultlist.showPreferencesButton.tooltip=Show Preferences
|
||||
##Notificaition
|
||||
##Notification
|
||||
main.notification.updateAvailable=Update is available.
|
||||
main.notification.support=Support Cryptomator.
|
||||
main.notification.closeButton.tooltip=Close info bar
|
||||
## Vault Detail
|
||||
### Welcome
|
||||
main.vaultDetail.welcomeOnboarding=Thanks for choosing Cryptomator to protect your files. If you need any assistance, check out our getting started guides:
|
||||
main.vaultDetail.storageLocation=Vault storage location
|
||||
### Locked
|
||||
main.vaultDetail.lockedStatus=LOCKED
|
||||
main.vaultDetail.unlockBtn=Unlock…
|
||||
|
||||
Reference in New Issue
Block a user