From 529777360b08314a6fe1af2f216f0ebfcf99e1af Mon Sep 17 00:00:00 2001 From: coolGi2007 Date: Mon, 25 Apr 2022 15:02:18 +0930 Subject: [PATCH] Add classic config GUI part 2/3 --- src/main/java/com/seibel/lod/core/Config.java | 26 +++++++-------- .../seibel/lod/core/config/ConfigBase.java | 22 ++++++++----- .../core/config/file/ConfigFileHandling.java | 32 +++++++++++++------ .../core/config/types/AbstractConfigType.java | 18 ++++++----- .../lod/core/config/types/ConfigCategory.java | 24 +++++++------- .../lod/core/config/types/ConfigEntry.java | 4 +-- 6 files changed, 75 insertions(+), 51 deletions(-) diff --git a/src/main/java/com/seibel/lod/core/Config.java b/src/main/java/com/seibel/lod/core/Config.java index 184db0457..6135e82a7 100644 --- a/src/main/java/com/seibel/lod/core/Config.java +++ b/src/main/java/com/seibel/lod/core/Config.java @@ -31,15 +31,15 @@ public class Config // |-> Buffers // |-> Debugging - public static ConfigCategory client = new ConfigCategory.Builder().set(new Client()).build(); + public static ConfigCategory client = new ConfigCategory.Builder().set(Client.class).build(); public static class Client { - public static ConfigCategory graphics = new ConfigCategory.Builder().set(new Graphics()).build(); + public static ConfigCategory graphics = new ConfigCategory.Builder().set(Graphics.class).build(); - public static ConfigCategory worldGenerator = new ConfigCategory.Builder().set(new WorldGenerator()).build(); + public static ConfigCategory worldGenerator = new ConfigCategory.Builder().set(WorldGenerator.class).build(); - public static ConfigCategory advanced = new ConfigCategory.Builder().set(new Advanced()).build(); + public static ConfigCategory advanced = new ConfigCategory.Builder().set(Advanced.class).build(); public static ConfigEntry optionsButton = new ConfigEntry.Builder() @@ -47,18 +47,18 @@ public class Config .set(ILodConfigWrapperSingleton.IClient.OPTIONS_BUTTON_DEFAULT) .build(); - public static ConfigEntry> testMultiOption = new ConfigEntry.Builder>() - .set(new HashMap() {{put("overworld", true); put("nether", false);}}) - .build(); +// public static ConfigEntry> testMultiOption = new ConfigEntry.Builder>() +// .set(new HashMap<>() {{put("overworld", true); put("nether", false);}}) +// .build(); public static class Graphics { - public static ConfigCategory quality = new ConfigCategory.Builder().set(new Quality()).build(); + public static ConfigCategory quality = new ConfigCategory.Builder().set(Quality.class).build(); - public static ConfigCategory fogQuality = new ConfigCategory.Builder().set(new FogQuality()).build(); + public static ConfigCategory fogQuality = new ConfigCategory.Builder().set(FogQuality.class).build(); - public static ConfigCategory advancedGraphics = new ConfigCategory.Builder().set(new AdvancedGraphics()).build(); + public static ConfigCategory advancedGraphics = new ConfigCategory.Builder().set(AdvancedGraphics.class).build(); public static class Quality @@ -176,11 +176,11 @@ public class Config public static class Advanced { - public static ConfigCategory threading = new ConfigCategory.Builder().set(new Threading()).build(); + public static ConfigCategory threading = new ConfigCategory.Builder().set(Threading.class).build(); - public static ConfigCategory debugging = new ConfigCategory.Builder().set(new Debugging()).build(); + public static ConfigCategory debugging = new ConfigCategory.Builder().set(Debugging.class).build(); - public static ConfigCategory buffers = new ConfigCategory.Builder().set(new Buffers()).build(); + public static ConfigCategory buffers = new ConfigCategory.Builder().set(Buffers.class).build(); public static class Threading diff --git a/src/main/java/com/seibel/lod/core/config/ConfigBase.java b/src/main/java/com/seibel/lod/core/config/ConfigBase.java index dfa20ae67..35c001050 100644 --- a/src/main/java/com/seibel/lod/core/config/ConfigBase.java +++ b/src/main/java/com/seibel/lod/core/config/ConfigBase.java @@ -11,6 +11,7 @@ import java.lang.reflect.Field; import java.util.ArrayList; import java.util.HashMap; import java.util.List; +import java.util.Map; /** * Indexes and sets everything up for the file handling and gui @@ -42,10 +43,10 @@ public class ConfigBase { acceptableInputs.add(Long.class); // acceptableInputs.add(Float.class); acceptableInputs.add(String.class); - acceptableInputs.add(HashMap.class); + acceptableInputs.add(HashMap.class); // TODO[CONFIG]: This is handled separately to check the first input is String and the second input is valid } - public static final List> entries = new ArrayList<>(); + public static final List> entries = new ArrayList<>(); public static void init(Class config) { addAcceptableInputs(); // Add all of the acceptable stuff to the acceptableInputs list @@ -62,12 +63,12 @@ public class ConfigBase { for (Field field : config.getFields()) { if (AbstractConfigType.class.isAssignableFrom(field.getType())) { try { - entries.add((AbstractConfigType) field.get(field.getType())); + entries.add((AbstractConfigType) field.get(field.getType())); } catch (IllegalAccessException exception) { exception.printStackTrace(); } - AbstractConfigType entry = entries.get(entries.size() - 1); + AbstractConfigType entry = entries.get(entries.size() - 1); entry.category = category; entry.name = field.getName(); @@ -75,21 +76,26 @@ public class ConfigBase { if (!isAcceptableType(((ConfigEntry) entry).get().getClass())) { ClientApi.LOGGER.error("Invalid variable type at [" + (category.isEmpty() ? "" : category + ".") + field.getName() + "]."); ClientApi.LOGGER.error("Type [" + ((ConfigEntry) entry).get().getClass() + "] is not one of these types [" + acceptableInputs.toString() + "]"); + entries.remove(entries.size() -1); // Delete the entry if it is invalid so the game can still run } } if (ConfigCategory.class.isAssignableFrom(field.getType())) { // If it's a category then init the stuff inside it and put it in the category list - initNestedClass((entry.getType()), ((ConfigCategory) entry).getDestination()); + if (((ConfigCategory) entry).getDestination() == null) + ((ConfigCategory) entry).destination = ((ConfigCategory) entry).getNameWCategory(); + if (entry.get() != null) { + initNestedClass(((ConfigCategory) entry).get(), ((ConfigCategory) entry).getDestination()); + } } } } } - private static boolean isAcceptableType(Class Class) { - if (Class.isEnum()) + private static boolean isAcceptableType(Class Clazz) { + if (Clazz.isEnum()) return true; for(Class i: acceptableInputs) { - if(Class == i) + if(Clazz == i) return true; } return false; diff --git a/src/main/java/com/seibel/lod/core/config/file/ConfigFileHandling.java b/src/main/java/com/seibel/lod/core/config/file/ConfigFileHandling.java index fe6a56663..6d4d99528 100644 --- a/src/main/java/com/seibel/lod/core/config/file/ConfigFileHandling.java +++ b/src/main/java/com/seibel/lod/core/config/file/ConfigFileHandling.java @@ -23,29 +23,32 @@ import java.util.HashMap; */ public class ConfigFileHandling { public static final Path ConfigPath = SingletonHandler.get(IMinecraftWrapper.class).getGameDirectory().toPath().resolve("config").resolve(ModInfo.NAME+".toml"); - public static final CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).autosave().build(); /** Saves the config to the file */ public static void saveToFile() { - if (!Files.exists(ConfigPath)) + CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).build(); + if (!Files.exists(ConfigPath)) // Try to check if the config exists try { Files.createFile(ConfigPath); } catch (IOException ex) { ex.printStackTrace(); } + loadConfig(config); - for (AbstractConfigType entry : ConfigBase.entries) { + for (AbstractConfigType entry : ConfigBase.entries) { if (ConfigEntry.class.isAssignableFrom(entry.getClass())) { createComment((ConfigEntry) entry, config); saveEntry((ConfigEntry) entry, config); } } + config.save(); config.close(); } /** Loads the config from the file */ public static void loadFromFile() { + CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).build(); // Attempt to load the file and if it fails then save config to file try { if (Files.exists(ConfigPath)) @@ -55,25 +58,32 @@ public class ConfigFileHandling { return; } } catch (Exception e) { + e.printStackTrace(); saveToFile(); return; } // Load all the entries - for (AbstractConfigType entry : ConfigBase.entries) { + for (AbstractConfigType entry : ConfigBase.entries) { if (ConfigEntry.class.isAssignableFrom(entry.getClass())) { createComment((ConfigEntry) entry, config); loadEntry((ConfigEntry) entry, config); } } + config.save(); config.close(); } + + + // Save an entry when only given the entry public static void saveEntry(ConfigEntry entry) { + CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).build(); loadConfig(config); saveEntry(entry, config); + config.save(); config.close(); } // Save an entry @@ -90,6 +100,7 @@ public class ConfigFileHandling { // Loads an entry when only given the entry public static void loadEntry(ConfigEntry entry) { + CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).autosave().build(); loadConfig(config); loadEntry(entry, config); config.close(); @@ -112,7 +123,6 @@ public class ConfigFileHandling { } else { entry.setWTSave(workConfig.get(entry.getNameWCategory())); } -// entry.setWTSave(workConfig.get(entry.getNameWCategory())); } else { saveEntry(entry, workConfig); } @@ -120,21 +130,28 @@ public class ConfigFileHandling { // Creates the comment for an entry when only given the entry public static void createComment(ConfigEntry entry) { + CommentedFileConfig config = CommentedFileConfig.builder(ConfigPath.toFile()).autosave().build(); loadConfig(config); createComment(entry, config); config.close(); } // Creates a comment for an entry public static void createComment(ConfigEntry entry, CommentedFileConfig workConfig) { + if (!entry.getAppearance().showInFile) + return; workConfig.setComment(entry.getNameWCategory(), entry.getComment()); } + + + + /** Does config.load(); but with error checking */ public static void loadConfig(CommentedFileConfig config) { try { config.load(); } catch (Exception e) { System.out.println("Loading file failed because of this expectation:\n"+e); - try { // Now try remaking the file + try { // Now try remaking the file and loading it Files.deleteIfExists(ConfigPath); Files.createFile(ConfigPath); config.load(); @@ -146,9 +163,6 @@ public class ConfigFileHandling { } } - - - // Stuff for converting HashMap's and String's (uses json) public static String getStringFromHashMap(HashMap item) { JSONObject jsonObject = new JSONObject(); diff --git a/src/main/java/com/seibel/lod/core/config/types/AbstractConfigType.java b/src/main/java/com/seibel/lod/core/config/types/AbstractConfigType.java index 2fafb31bf..1069a662a 100644 --- a/src/main/java/com/seibel/lod/core/config/types/AbstractConfigType.java +++ b/src/main/java/com/seibel/lod/core/config/types/AbstractConfigType.java @@ -7,7 +7,7 @@ import com.seibel.lod.core.config.ConfigEntryAppearance; * * @author coolGi2007 */ -public abstract class AbstractConfigType { +public abstract class AbstractConfigType { // The S is the class that is extending this public String category = ""; // This should only be set once in the init public String name; // This should only be set once in the init protected T value; @@ -55,18 +55,20 @@ public abstract class AbstractConfigType { public Class getType() { return value.getClass(); } - protected static abstract class Builder { + + protected static abstract class Builder { protected ConfigEntryAppearance tmpAppearance = ConfigEntryAppearance.ALL; protected T tmpValue; - public this setAppearance(ConfigEntryAppearance newAppearance) { - this.tmpAppearance = newAppearance; - return this; - } - public this set(T newValue) { + // Put this into your own builder + public S setAppearance(ConfigEntryAppearance newAppearance) { + this.tmpAppearance = newAppearance; + return (S) this; + } + public S set(T newValue) { this.tmpValue = newValue; - return this; + return (S) this; } } } diff --git a/src/main/java/com/seibel/lod/core/config/types/ConfigCategory.java b/src/main/java/com/seibel/lod/core/config/types/ConfigCategory.java index 9cd38d404..ace30d6c6 100644 --- a/src/main/java/com/seibel/lod/core/config/types/ConfigCategory.java +++ b/src/main/java/com/seibel/lod/core/config/types/ConfigCategory.java @@ -1,32 +1,34 @@ package com.seibel.lod.core.config.types; +import com.seibel.lod.core.api.ClientApi; import com.seibel.lod.core.config.ConfigEntryAppearance; -public class ConfigCategory extends AbstractConfigType { - private final String destination; // Where the category goes to +public class ConfigCategory extends AbstractConfigType { + public String destination; // Where the category goes to - public ConfigCategory(ConfigEntryAppearance appearance, T value, String destination) { + public ConfigCategory(ConfigEntryAppearance appearance, Class value, String destination) { super(appearance, value); - if (destination == null) { - this.destination = getNameWCategory(); - } else { - this.destination = destination; - } + this.destination = destination; } public String getDestination() { return this.destination; } - public static class Builder extends AbstractConfigType.Builder { + public static class Builder extends AbstractConfigType.Builder { private String tmpDestination = null; - public Builder setDestination(String newDestination) { + public Builder setDestination(String newDestination) { this.tmpDestination = newDestination; return this; } - public ConfigCategory build() { + public Builder setAppearance(ConfigEntryAppearance newAppearance) { + this.tmpAppearance = newAppearance; + return this; + } + + public ConfigCategory build() { return new ConfigCategory(tmpAppearance, tmpValue, tmpDestination); } } diff --git a/src/main/java/com/seibel/lod/core/config/types/ConfigEntry.java b/src/main/java/com/seibel/lod/core/config/types/ConfigEntry.java index 46f373b0f..901515b65 100644 --- a/src/main/java/com/seibel/lod/core/config/types/ConfigEntry.java +++ b/src/main/java/com/seibel/lod/core/config/types/ConfigEntry.java @@ -8,7 +8,7 @@ import com.seibel.lod.core.config.file.ConfigFileHandling; * * @author coolGi2007 */ -public class ConfigEntry extends AbstractConfigType { +public class ConfigEntry extends AbstractConfigType { private T defaultValue; private String comment; @@ -113,7 +113,7 @@ public class ConfigEntry extends AbstractConfigType { } } - public static class Builder extends AbstractConfigType.Builder { + public static class Builder extends AbstractConfigType.Builder { private String tmpComment; private T tmpMin; private T tmpMax;