Skip to content

Commit d00acff

Browse files
committed
Add dark mode (#301)
(Automatic switching between dark and light mode not supported yet)
1 parent b515699 commit d00acff

File tree

12 files changed

+158
-20
lines changed

12 files changed

+158
-20
lines changed

.idea/compiler.xml

Lines changed: 5 additions & 0 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/Main__Linux_.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/Main__Windows_.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

.idea/runConfigurations/Main__macOS_.xml

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

build.gradle

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,9 +65,16 @@ javafx {
6565
modules = [ 'javafx.controls', 'javafx.fxml' ]
6666
}
6767

68+
String addExports = '--add-exports=javafx.graphics/com.sun.javafx.css=airsquared.blobsaver'
69+
70+
compileJava {
71+
options.compilerArgs.add addExports
72+
}
73+
6874
application {
6975
mainModule = "airsquared.blobsaver"
7076
mainClass = "airsquared.blobsaver.app.Main"
77+
applicationDefaultJvmArgs.add addExports
7178
}
7279

7380
private String getJarDirectory() {
@@ -85,14 +92,14 @@ run {
8592
test {
8693
useJUnitPlatform()
8794
systemProperty "jar.directory", getJarDirectory()
88-
jvmArgs = ['--add-exports=javafx.graphics/com.sun.glass.ui=org.testfx.monocle']
95+
jvmArgs '--add-exports=javafx.graphics/com.sun.glass.ui=org.testfx.monocle', addExports
8996
}
9097

9198
jlink {
9299
addOptions '--strip-debug', '--compress', '2', '--no-header-files', '--no-man-pages', '--strip-native-commands',
93100
'--dedup-legal-notices=error-if-not-same-content'
94101
launcher {
95-
jvmArgs = [ '-Djar.directory={{BIN_DIR}}' ]
102+
jvmArgs = [ '-Djar.directory={{BIN_DIR}}', addExports ]
96103
noConsole = true
97104
}
98105
jpackage {

src/main/java/airsquared/blobsaver/app/Controller.java

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -44,12 +44,13 @@
4444
import java.util.Locale;
4545
import java.util.concurrent.TimeUnit;
4646

47-
@SuppressWarnings({"TextBlockMigration"})
47+
@SuppressWarnings("TextBlockMigration")
4848
public class Controller {
4949

5050

5151
@FXML private MenuBar menuBar;
5252
@FXML private MenuItem checkForUpdatesMenu, clearAllDataMenu, deleteDeviceMenu, backgroundSettingsMenu;
53+
@FXML private RadioMenuItem darkDisabled, darkSync, darkEnabled;
5354

5455
@FXML private ChoiceBox<String> deviceTypeChoiceBox, deviceModelChoiceBox;
5556

@@ -77,6 +78,11 @@ public void initialize() {
7778
backgroundSettingsMenu.textProperty().bind(Bindings.when(backgroundSettingsButton.selectedProperty())
7879
.then("Hide Background Settings").otherwise("Show Background Settings"));
7980
backgroundSettingsMenu.setOnAction(e -> backgroundSettingsButton.fire());
81+
switch (Prefs.getDarkMode()) {
82+
case DISABLED -> darkDisabled.setSelected(true);
83+
case SYNC_WITH_OS -> darkSync.setSelected(true);
84+
case ENABLED -> darkEnabled.setSelected(true);
85+
}
8086
}
8187

8288
public void newGithubIssue() { Utils.newGithubIssue(); }
@@ -253,6 +259,28 @@ public void showOlderDevicesHandler(Event evt) {
253259
Devices.updateLists();
254260
}
255261

262+
@SuppressWarnings("unused")
263+
public void darkModeHandler(ObservableValue<?> a, RadioMenuItem old, RadioMenuItem darkMode) {
264+
switch ((Prefs.DarkMode) darkMode.getUserData()) {
265+
case ENABLED -> updateDarkMode(true);
266+
case DISABLED -> updateDarkMode(false);
267+
case SYNC_WITH_OS -> System.err.println("Sync with OS not implemented yet"); // register listener for os here
268+
}
269+
Prefs.setDarkMode((Prefs.DarkMode) darkMode.getUserData());
270+
}
271+
272+
@SuppressWarnings("ConstantConditions")
273+
private void updateDarkMode(boolean enable) {
274+
if (enable) {
275+
// eventually replace with https://github.com/openjdk/jfx/pull/511 once released
276+
com.sun.javafx.css.StyleManager.getInstance().addUserAgentStylesheet(Controller.class.getResource("modena_dark.css").toExternalForm());
277+
savedDevicesVBox.setStyle("-fx-background-color: -fx-background");
278+
} else {
279+
com.sun.javafx.css.StyleManager.getInstance().removeUserAgentStylesheet(Controller.class.getResource("modena_dark.css").toExternalForm());
280+
savedDevicesVBox.setStyle("-fx-background-color: white");
281+
}
282+
}
283+
256284
public void disableAnalyticsHandler(Event evt) {
257285
Prefs.setDisableAnalytics(((CheckMenuItem) evt.getSource()).isSelected());
258286
}

src/main/java/airsquared/blobsaver/app/Main.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,7 @@ public JavaFxApplication() {
100100
}
101101

102102
@Override
103+
@SuppressWarnings("ConstantConditions")
103104
public void start(Stage primaryStage) {
104105
Main.primaryStage = primaryStage;
105106
Parent root = null;
@@ -113,7 +114,7 @@ public void start(Stage primaryStage) {
113114
primaryStage.setScene(new Scene(root));
114115
if (isWindows()) {
115116
primaryStage.getIcons().clear();
116-
primaryStage.getIcons().add(new Image(getClass().getResourceAsStream("blob_emoji.png")));
117+
primaryStage.getIcons().add(new Image(Main.class.getResourceAsStream("blob_emoji.png")));
117118
}
118119
primaryStage.setResizable(false);
119120
Utils.checkForUpdates(false);

src/main/java/airsquared/blobsaver/app/Prefs.java

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,16 @@ public static boolean getShowOldDevices() {
131131
return appPrefs.getBoolean("Show Old Devices", false);
132132
}
133133

134+
public enum DarkMode {DISABLED, SYNC_WITH_OS, ENABLED}
135+
136+
public static DarkMode getDarkMode() {
137+
return DarkMode.valueOf(appPrefs.get("Dark Mode", "DISABLED"));
138+
}
139+
140+
public static void setDarkMode(DarkMode darkMode) {
141+
appPrefs.put("Dark Mode", darkMode.name());
142+
}
143+
134144
private static Stream<SavedDevice> savedDevices() {
135145
try {
136146
return Arrays.stream(savedDevicesPrefs.childrenNames()).map(SavedDevice::new);

src/main/java/airsquared/blobsaver/app/Utils.java

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -290,12 +290,13 @@ static void forEachButton(Alert alert, Consumer<? super Node> action) {
290290
static File showFilePickerDialog(Window window, File initialDirectory) {
291291
DirectoryChooser dirChooser = new DirectoryChooser();
292292
dirChooser.setTitle("Choose a folder to save Blobs in");
293-
if (initialDirectory.exists()) {
294-
dirChooser.setInitialDirectory(initialDirectory);
295-
} else if (initialDirectory.getParentFile().exists()) {
296-
dirChooser.setInitialDirectory(initialDirectory.getParentFile());
297-
} else {
298-
dirChooser.setInitialDirectory(new File(System.getProperty("user.home")));
293+
for (int i = 0; i < 20; i++) { // limit loop iterations to 20
294+
if (initialDirectory == null || initialDirectory.isDirectory()) {
295+
dirChooser.setInitialDirectory(initialDirectory);
296+
break;
297+
} else {
298+
initialDirectory = initialDirectory.getParentFile();
299+
}
299300
}
300301
return dirChooser.showDialog(window);
301302
}

src/main/resources/airsquared/blobsaver/app/app.css

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,3 @@
2424
-fx-max-width: Infinity;
2525
-fx-pref-width: Infinity;
2626
}
27-
28-
#savedDevicesVBox {
29-
-fx-background-color: white;
30-
}

0 commit comments

Comments
 (0)