diff --git a/core/src/main/java/com/github/weisj/darklaf/settings/ThemeSettings.java b/core/src/main/java/com/github/weisj/darklaf/settings/ThemeSettings.java index 8519b277..b5180554 100644 --- a/core/src/main/java/com/github/weisj/darklaf/settings/ThemeSettings.java +++ b/core/src/main/java/com/github/weisj/darklaf/settings/ThemeSettings.java @@ -401,7 +401,12 @@ public class ThemeSettings implements ThemePreferenceListener { /** Saves the settings. */ public void save() { - fetchFromSettingsPanel(); + save(true); + } + + /** Saves the settings. */ + private void save(final boolean fetchFromPanel) { + if (fetchFromPanel) fetchFromSettingsPanel(); LafManager.enabledPreferenceChangeReporting(currentConfiguration.isSystemPreferencesEnabled()); savedConfiguration.load(currentConfiguration); LOGGER.fine(() -> "Saving settings " + savedConfiguration); @@ -416,7 +421,7 @@ public class ThemeSettings implements ThemePreferenceListener { public void setConfiguration(final SettingsConfiguration configuration) { this.currentConfiguration.load(configuration); updateSettingsPanel(); - save(); + save(false); } /** diff --git a/core/src/test/java/ui/PersistentThemeSettingsDemo.java b/core/src/test/java/ui/PersistentThemeSettingsDemo.java new file mode 100644 index 00000000..c389002a --- /dev/null +++ b/core/src/test/java/ui/PersistentThemeSettingsDemo.java @@ -0,0 +1,76 @@ +/* + * MIT License + * + * Copyright (c) 2020 Jannis Weis + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and + * associated documentation files (the "Software"), to deal in the Software without restriction, + * including without limitation the rights to use, copy, modify, merge, publish, distribute, + * sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all copies or + * substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT + * NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND + * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, + * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + * + */ +package ui; + +import java.io.*; +import java.util.prefs.Preferences; + +import javax.swing.*; + +import com.github.weisj.darklaf.settings.SettingsConfiguration; +import com.github.weisj.darklaf.settings.ThemeSettings; + +public class PersistentThemeSettingsDemo { + + public static void main(final String[] args) { + load(); + Runtime.getRuntime().addShutdownHook(new Thread(PersistentThemeSettingsDemo::save)); + SwingUtilities.invokeLater(() -> { + JFrame frame = new JFrame("Persistent Theme Demo"); + frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); + frame.setContentPane(new SettingsDemo().createComponent()); + frame.pack(); + frame.setLocationRelativeTo(null); + frame.setVisible(true); + }); + } + + private static void load() { + ThemeSettings settings = ThemeSettings.getInstance(); + Preferences preferences = Preferences.userNodeForPackage(PersistentThemeSettingsDemo.class); + byte[] serializedSettings = preferences.getByteArray("themeSettings", null); + if (serializedSettings != null) { + try (ObjectInputStream in = new ObjectInputStream(new ByteArrayInputStream(serializedSettings))) { + SettingsConfiguration config = (SettingsConfiguration) in.readObject(); + settings.setConfiguration(config); + } catch (IOException | ClassNotFoundException e) { + e.printStackTrace(); + } + } + settings.apply(); + } + + private static void save() { + ThemeSettings settings = ThemeSettings.getInstance(); + SettingsConfiguration config = settings.exportConfiguration(); + ByteArrayOutputStream bos = new ByteArrayOutputStream(); + try (ObjectOutputStream out = new ObjectOutputStream(bos)) { + out.writeObject(config); + out.flush(); + Preferences preferences = Preferences.userNodeForPackage(PersistentThemeSettingsDemo.class); + preferences.putByteArray("themeSettings", bos.toByteArray()); + } catch (IOException e) { + e.printStackTrace(); + } + } + +}