From d7d6a49b985a4bef8180894c4b16d41c25dddeb0 Mon Sep 17 00:00:00 2001 From: michiel Date: Sat, 4 Oct 2025 22:33:46 +0200 Subject: [PATCH] settings --- .idea/misc.xml | 2 +- app/pom.xml | 6 +- app/src/main/java/org/toop/app/App.java | 23 +++--- .../toop/app/layer/layers/OptionsLayer.java | 18 +++-- .../main/java/org/toop/local/AppSettings.java | 46 ++++++++++++ framework/pom.xml | 8 +- .../framework/asset/resources/JsonAsset.java | 75 +++++++++++++++++++ .../asset/resources/SettingsAsset.java | 41 ++++++++++ .../org/toop/framework/settings/Settings.java | 9 +++ 9 files changed, 211 insertions(+), 17 deletions(-) create mode 100644 app/src/main/java/org/toop/local/AppSettings.java create mode 100644 framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java create mode 100644 framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java create mode 100644 framework/src/main/java/org/toop/framework/settings/Settings.java diff --git a/.idea/misc.xml b/.idea/misc.xml index 97dd9e8..64c32f6 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -13,7 +13,7 @@ - + \ No newline at end of file diff --git a/app/pom.xml b/app/pom.xml index f8a54cf..c3f2ea5 100644 --- a/app/pom.xml +++ b/app/pom.xml @@ -19,7 +19,11 @@ spotless-maven-plugin 2.46.1 - + + com.google.code.gson + gson + 2.10.1 + org.toop pism_framework diff --git a/app/src/main/java/org/toop/app/App.java b/app/src/main/java/org/toop/app/App.java index 9646f46..bc68b76 100644 --- a/app/src/main/java/org/toop/app/App.java +++ b/app/src/main/java/org/toop/app/App.java @@ -10,16 +10,19 @@ import javafx.application.Application; import javafx.scene.Scene; import javafx.scene.layout.StackPane; import javafx.stage.Stage; +import org.toop.framework.asset.resources.SettingsAsset; +import org.toop.local.AppSettings; +import java.io.File; import java.util.Stack; public final class App extends Application { private static Stage stage; private static StackPane root; private static Stack stack; - - private static int width; - private static int height; + private static int height; + private static int width; + private static SettingsAsset settingsAsset; private static boolean isQuitting; @@ -29,7 +32,14 @@ public final class App extends Application { @Override public void start(Stage stage) throws Exception { - final StackPane root = new StackPane(); + + App.stage = stage; + final StackPane root = new StackPane(); + App.root = root; + App.stack = new Stack<>(); + + AppSettings settings = new AppSettings(); + settings.applySettings(); final Scene scene = new Scene(root); scene.getStylesheets().add(ResourceManager.get(CssAsset.class, "app.css").getUrl()); @@ -48,13 +58,8 @@ public final class App extends Application { stage.setScene(scene); stage.setResizable(false); - stage.show(); - App.stage = stage; - App.root = root; - App.stack = new Stack<>(); - App.width = (int) stage.getWidth(); App.height = (int) stage.getHeight(); diff --git a/app/src/main/java/org/toop/app/layer/layers/OptionsLayer.java b/app/src/main/java/org/toop/app/layer/layers/OptionsLayer.java index f617f66..cb9dfd7 100644 --- a/app/src/main/java/org/toop/app/layer/layers/OptionsLayer.java +++ b/app/src/main/java/org/toop/app/layer/layers/OptionsLayer.java @@ -6,12 +6,14 @@ import org.toop.app.layer.Layer; import org.toop.app.layer.containers.VerticalContainer; import org.toop.framework.asset.ResourceManager; import org.toop.framework.asset.resources.LocalizationAsset; +import org.toop.framework.asset.resources.SettingsAsset; import org.toop.framework.audio.events.AudioEvents; import org.toop.framework.eventbus.EventFlow; import org.toop.local.AppContext; import javafx.geometry.Pos; import javafx.scene.control.ChoiceBox; +import org.toop.local.AppSettings; import java.util.Locale; @@ -19,8 +21,11 @@ public final class OptionsLayer extends Layer { private Locale currentLocale = AppContext.getLocale(); private LocalizationAsset locale = ResourceManager.get("localization"); - private static int currentVolume = 25; - private static boolean isWindowed = true; + AppSettings appSettings = new AppSettings(); + SettingsAsset settings = appSettings.getPath(); + + private int currentVolume = settings.getVolume(); + private boolean isWindowed = !(settings.getFullscreen()); OptionsLayer() { super("options.css"); @@ -61,6 +66,8 @@ public final class OptionsLayer extends Layer { AppContext.setLocale(locale); + settings.setLocale(locale.toLanguageTag()); + this.currentLocale = AppContext.getLocale(); this.locale = ResourceManager.get("localization"); @@ -70,14 +77,14 @@ public final class OptionsLayer extends Layer { for (final Locale localeFile : locale.getAvailableLocales()) { languageBox.getItems().add(localeFile); } - languageBox.setValue(currentLocale); } private void addVolumeSlider(Container container) { container.addSlider(100, currentVolume, (volume) -> { currentVolume = volume; - new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(volume.doubleValue() / 100.0)).asyncPostEvent(); + settings.setVolume(volume); + new EventFlow().addPostEvent(new AudioEvents.ChangeVolume(volume.doubleValue() / 100.0)).asyncPostEvent(); }); } @@ -85,6 +92,7 @@ public final class OptionsLayer extends Layer { container.addToggle("Windowed", "Fullscreen", !isWindowed, (fullscreen) -> { isWindowed = !fullscreen; App.setFullscreen(fullscreen); - }); + settings.setFullscreen(fullscreen); + }); } } \ No newline at end of file diff --git a/app/src/main/java/org/toop/local/AppSettings.java b/app/src/main/java/org/toop/local/AppSettings.java new file mode 100644 index 0000000..5e200a2 --- /dev/null +++ b/app/src/main/java/org/toop/local/AppSettings.java @@ -0,0 +1,46 @@ +package org.toop.local; + +import org.toop.app.App; +import org.toop.framework.asset.resources.SettingsAsset; +import org.toop.framework.settings.Settings; + +import java.io.File; +import java.util.Locale; + +public class AppSettings { + + private SettingsAsset settingsAsset; + + public void applySettings() { + SettingsAsset settings = getPath(); + if (!settings.isLoaded()) { + settings.load(); + } + Settings settingsData = settings.getContent(); + + AppContext.setLocale(Locale.of(settingsData.locale)); + App.setFullscreen(settingsData.fullScreen); + } + + public SettingsAsset getPath() { + if (this.settingsAsset == null) { + String os = System.getProperty("os.name").toLowerCase(); + String basePath; + + if (os.contains("win")) { + basePath = System.getenv("APPDATA"); + if (basePath == null) { + basePath = System.getProperty("user.home"); + } + } else if (os.contains("mac")) { + basePath = System.getProperty("user.home") + "/Library/Application Support"; + } else { + basePath = System.getProperty("user.home") + "/.config"; + } + + File settingsFile = new File(basePath + File.separator + "ISY1" + File.separator + "settings.json"); + this.settingsAsset = new SettingsAsset(settingsFile); + } + return this.settingsAsset; + } +} diff --git a/framework/pom.xml b/framework/pom.xml index b32b25c..33b077a 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -116,8 +116,14 @@ reflections 0.10.2 + + com.google.code.gson + gson + 2.10.1 + compile + - + diff --git a/framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java new file mode 100644 index 0000000..5f9e1ba --- /dev/null +++ b/framework/src/main/java/org/toop/framework/asset/resources/JsonAsset.java @@ -0,0 +1,75 @@ +package org.toop.framework.asset.resources; +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import org.toop.framework.asset.types.FileExtension; +import org.toop.framework.asset.types.LoadableResource; +import java.io.File; +import java.io.FileReader; +import java.io.FileWriter; +import java.io.IOException; + +@FileExtension({"json"}) +public class JsonAsset extends BaseResource implements LoadableResource { + + private T content; + private Class type; + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + public JsonAsset(File file, Class type) { + super(file); + this.type = type; + } + + @Override + public void load() { + File file = getFile(); + if (!file.exists()) { + try { + // make a new file with the declared constructor (example: settings) if it doesn't exist + content = type.getDeclaredConstructor().newInstance(); + save(); + } catch (Exception e) { + throw new RuntimeException("Could not make default JSON settings for" + file, e); + } + } else { + // else open the file, try reading it using gson, and set it to loaded + try (FileReader reader = new FileReader(file)) { + content = gson.fromJson(reader, type); + this.isLoaded = true; + } catch(Exception e) { + throw new RuntimeException("Failed to load JSON asset" + getFile(), e); + } + } + } + + @Override + public void unload() { + this.content = null; + this.isLoaded = false; + } + + public T getContent() { + if (!isLoaded()) { + load(); + } + return content; + } + + public void save() { + File file = getFile(); + File parent = file.getParentFile(); + if (parent != null && !parent.exists()) { + parent.mkdirs(); + } + try (FileWriter writer = new FileWriter(file)) { + gson.toJson(content, writer); + } catch (IOException e) { + throw new RuntimeException("Failed to save JSON asset" + getFile(), e); + } + } + + @Override + public boolean isLoaded() { + return this.isLoaded; + } +} diff --git a/framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java b/framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java new file mode 100644 index 0000000..f1a7fc8 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/asset/resources/SettingsAsset.java @@ -0,0 +1,41 @@ +package org.toop.framework.asset.resources; + + +import org.toop.framework.settings.Settings; + +import java.io.File; +import java.util.Locale; + +public class SettingsAsset extends JsonAsset { + + public SettingsAsset(File file) { + super(file, Settings.class); + } + + public int getVolume() { + return getContent().volume; + } + + public Locale getLocale() { + return Locale.forLanguageTag(getContent().locale); + } + + public boolean getFullscreen() { + return getContent().fullScreen; + } + + public void setVolume(int volume) { + getContent().volume = volume; + save(); + } + + public void setLocale(String locale) { + getContent().locale = locale; + save(); + } + + public void setFullscreen(boolean fullscreen) { + getContent().fullScreen = fullscreen; + save(); + } +} \ No newline at end of file diff --git a/framework/src/main/java/org/toop/framework/settings/Settings.java b/framework/src/main/java/org/toop/framework/settings/Settings.java new file mode 100644 index 0000000..5208c22 --- /dev/null +++ b/framework/src/main/java/org/toop/framework/settings/Settings.java @@ -0,0 +1,9 @@ +package org.toop.framework.settings; + +import java.util.Locale; + +public class Settings { + public boolean fullScreen = false; + public String locale = Locale.getDefault().toLanguageTag(); + public int volume = 100; +}