فهرست منبع

added "Automatic" theme on macOS

Tobias Hagemann 5 سال پیش
والد
کامیت
a975df6f8c

+ 14 - 4
main/commons/src/main/java/org/cryptomator/common/settings/UiTheme.java

@@ -1,11 +1,21 @@
 package org.cryptomator.common.settings;
 
+import org.apache.commons.lang3.SystemUtils;
+
 public enum UiTheme {
-	LIGHT("preferences.general.theme.light"),
-	DARK("preferences.general.theme.dark");
-	// CUSTOM("Custom (%s)");
+	LIGHT("preferences.general.theme.light"), //
+	DARK("preferences.general.theme.dark"), //
+	AUTOMATIC("preferences.general.theme.automatic");
+
+	public static UiTheme[] applicableValues() {
+		if (SystemUtils.IS_OS_MAC) {
+			return values();
+		} else {
+			return new UiTheme[]{LIGHT, DARK};
+		}
+	}
 
-	private String displayName;
+	private final String displayName;
 
 	UiTheme(String displayName) {
 		this.displayName = displayName;

+ 1 - 1
main/pom.xml

@@ -25,7 +25,7 @@
 
 		<!-- cryptomator dependencies -->
 		<cryptomator.cryptofs.version>1.9.12</cryptomator.cryptofs.version>
-		<cryptomator.jni.version>2.2.2</cryptomator.jni.version>
+		<cryptomator.jni.version>2.2.3</cryptomator.jni.version>
 		<cryptomator.fuse.version>1.2.3</cryptomator.fuse.version>
 		<cryptomator.dokany.version>1.1.15</cryptomator.dokany.version>
 		<cryptomator.webdav.version>1.0.11</cryptomator.webdav.version>

+ 32 - 8
main/ui/src/main/java/org/cryptomator/ui/fxapp/FxApplication.java

@@ -6,7 +6,6 @@ import javafx.application.Platform;
 import javafx.beans.binding.Bindings;
 import javafx.beans.binding.BooleanBinding;
 import javafx.beans.value.ObservableValue;
-import javafx.collections.FXCollections;
 import javafx.collections.ObservableSet;
 import javafx.stage.Stage;
 import org.cryptomator.common.LicenseHolder;
@@ -46,6 +45,8 @@ public class FxApplication extends Application {
 	private final LicenseHolder licenseHolder;
 	private final BooleanBinding hasVisibleStages;
 
+	private Optional<String> macApperanceObserverIdentifier = Optional.empty();
+
 	@Inject
 	FxApplication(Settings settings, Lazy<MainWindowComponent> mainWindow, Lazy<PreferencesComponent> preferencesWindow, Provider<UnlockComponent.Builder> unlockWindowBuilderProvider, Provider<QuitComponent.Builder> quitWindowBuilderProvider, Optional<MacFunctions> macFunctions, VaultService vaultService, LicenseHolder licenseHolder, ObservableSet<Stage> visibleStages) {
 		this.settings = settings;
@@ -115,21 +116,44 @@ public class FxApplication extends Application {
 	}
 
 	private void themeChanged(@SuppressWarnings("unused") ObservableValue<? extends UiTheme> observable, @SuppressWarnings("unused") UiTheme oldValue, UiTheme newValue) {
+		if (macApperanceObserverIdentifier.isPresent()) {
+			macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> uiAppearance.removeListener(macApperanceObserverIdentifier.get()));
+			macApperanceObserverIdentifier = Optional.empty();
+		}
 		loadSelectedStyleSheet(newValue);
 	}
 
 	private void loadSelectedStyleSheet(UiTheme desiredTheme) {
 		UiTheme theme = licenseHolder.isValidLicense() ? desiredTheme : UiTheme.LIGHT;
 		switch (theme) {
-			case DARK -> {
-				Application.setUserAgentStylesheet(getClass().getResource("/css/dark_theme.css").toString());
-				macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToDarkAqua));
-			}
-			case LIGHT -> {
-				Application.setUserAgentStylesheet(getClass().getResource("/css/light_theme.css").toString());
-				macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToAqua));
+			case LIGHT -> setToLightTheme();
+			case DARK -> setToDarkTheme();
+			case AUTOMATIC -> {
+				macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> {
+					macApperanceObserverIdentifier = Optional.of(uiAppearance.addListener(this::macInterfaceThemeChanged));
+				});
+				macInterfaceThemeChanged();
 			}
 		}
 	}
 
+	private void macInterfaceThemeChanged() {
+		macFunctions.map(MacFunctions::uiAppearance).ifPresent(uiAppearance -> {
+			switch (uiAppearance.getCurrentInterfaceStyle()) {
+				case LIGHT -> setToLightTheme();
+				case DARK -> setToDarkTheme();
+			}
+		});
+	}
+
+	private void setToLightTheme() {
+		Application.setUserAgentStylesheet(getClass().getResource("/css/light_theme.css").toString());
+		macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToAqua));
+	}
+
+	private void setToDarkTheme() {
+		Application.setUserAgentStylesheet(getClass().getResource("/css/dark_theme.css").toString());
+		macFunctions.map(MacFunctions::uiAppearance).ifPresent(JniException.ignore(MacApplicationUiAppearance::setToDarkAqua));
+	}
+
 }

+ 7 - 4
main/ui/src/main/java/org/cryptomator/ui/preferences/GeneralPreferencesController.java

@@ -1,5 +1,6 @@
 package org.cryptomator.ui.preferences;
 
+import javafx.application.Application;
 import javafx.application.Platform;
 import javafx.beans.property.ObjectProperty;
 import javafx.beans.value.ObservableValue;
@@ -12,11 +13,10 @@ import javafx.scene.control.RadioButton;
 import javafx.scene.control.Toggle;
 import javafx.scene.control.ToggleGroup;
 import javafx.util.StringConverter;
-import javafx.application.Application;
+import org.cryptomator.common.Environment;
 import org.cryptomator.common.LicenseHolder;
 import org.cryptomator.common.settings.Settings;
 import org.cryptomator.common.settings.UiTheme;
-import org.cryptomator.common.Environment;
 import org.cryptomator.ui.common.FxController;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
@@ -64,7 +64,10 @@ public class GeneralPreferencesController implements FxController {
 
 	@FXML
 	public void initialize() {
-		themeChoiceBox.getItems().addAll(UiTheme.values());
+		themeChoiceBox.getItems().addAll(UiTheme.applicableValues());
+		if (!themeChoiceBox.getItems().contains(settings.theme().get())) {
+			settings.theme().set(UiTheme.LIGHT);
+		}
 		themeChoiceBox.valueProperty().bindBidirectional(settings.theme());
 		themeChoiceBox.setConverter(new UiThemeConverter(resourceBundle));
 
@@ -122,7 +125,7 @@ public class GeneralPreferencesController implements FxController {
 	}
 
 	@FXML
-	public void showLogfileDirectory(){
+	public void showLogfileDirectory() {
 		environment.getLogDir().ifPresent(logDirPath -> application.getHostServices().showDocument(logDirPath.toUri().toString()));
 	}
 

+ 1 - 1
main/ui/src/main/java/org/cryptomator/ui/traymenu/TrayIconController.java

@@ -47,7 +47,7 @@ public class TrayIconController {
 		trayMenuController.initTrayMenu();
 	}
 
-	public void macInterfaceThemeChanged() {
+	private void macInterfaceThemeChanged() {
 		trayIcon.setImage(imageFactory.loadImage());
 	}
 

+ 1 - 0
main/ui/src/main/resources/i18n/strings.properties

@@ -131,6 +131,7 @@ preferences.title=Preferences
 ## General
 preferences.general=General
 preferences.general.theme=Look & Feel
+preferences.general.theme.automatic=Automatic
 preferences.general.theme.light=Light
 preferences.general.theme.dark=Dark
 preferences.general.unlockThemes=Unlock dark mode