diff options
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig/config')
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/Config.java | 53 | ||||
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/annotations/CustomOption.java | 14 | ||||
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/annotations/HUD.java | 16 | ||||
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/annotations/Page.java (renamed from src/main/java/cc/polyfrost/oneconfig/config/annotations/ConfigPage.java) | 2 | ||||
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java | 35 | ||||
-rw-r--r-- | src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java | 4 |
6 files changed, 96 insertions, 28 deletions
diff --git a/src/main/java/cc/polyfrost/oneconfig/config/Config.java b/src/main/java/cc/polyfrost/oneconfig/config/Config.java index de6c575..c3cbe8b 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/Config.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/Config.java @@ -1,24 +1,33 @@ package cc.polyfrost.oneconfig.config; -import cc.polyfrost.oneconfig.internal.config.annotations.Option; +import cc.polyfrost.oneconfig.config.annotations.CustomOption; +import cc.polyfrost.oneconfig.config.annotations.HUD; +import cc.polyfrost.oneconfig.config.annotations.Page; import cc.polyfrost.oneconfig.config.core.ConfigUtils; -import cc.polyfrost.oneconfig.internal.config.core.ConfigCore; -import cc.polyfrost.oneconfig.config.data.*; +import cc.polyfrost.oneconfig.config.data.Mod; +import cc.polyfrost.oneconfig.config.data.PageLocation; import cc.polyfrost.oneconfig.config.elements.BasicOption; import cc.polyfrost.oneconfig.config.elements.OptionPage; +import cc.polyfrost.oneconfig.config.elements.OptionSubcategory; import cc.polyfrost.oneconfig.config.profiles.Profiles; import cc.polyfrost.oneconfig.gui.OneConfigGui; +import cc.polyfrost.oneconfig.gui.elements.config.ConfigPageButton; import cc.polyfrost.oneconfig.gui.pages.ModConfigPage; +import cc.polyfrost.oneconfig.hud.HUDUtils; +import cc.polyfrost.oneconfig.internal.config.annotations.Option; +import cc.polyfrost.oneconfig.internal.config.core.ConfigCore; import cc.polyfrost.oneconfig.utils.gui.GuiUtils; import com.google.gson.*; import java.io.*; -import java.lang.annotation.Annotation; import java.lang.reflect.Field; import java.lang.reflect.Modifier; import java.nio.charset.StandardCharsets; import java.nio.file.Files; -import java.util.*; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; +import java.util.Optional; import java.util.function.Supplier; public class Config { @@ -84,19 +93,39 @@ public class Config { protected void generateOptionList(Object instance, OptionPage page, Mod mod, boolean migrate) { for (Field field : instance.getClass().getDeclaredFields()) { Option option = ConfigUtils.findAnnotation(field, Option.class); - if (option != null) - ConfigUtils.addOptionToPage(page, option, field, instance, migrate ? mod.migrator : null); - // TODO: Make dependencies work, pages, hud + if (option != null) { + BasicOption configOption = ConfigUtils.addOptionToPage(page, option, field, instance, migrate ? mod.migrator : null); + optionNames.put(page.equals(mod.defaultPage) ? "" : page.name + "." + field.getName(), configOption); + } else if (field.isAnnotationPresent(CustomOption.class)) { + BasicOption configOption = getCustomOption(field, page, mod, migrate); + if (configOption == null) continue; + optionNames.put(page.equals(mod.defaultPage) ? "" : page.name + "." + field.getName(), configOption); + } else if (field.isAnnotationPresent(Page.class)) { + Page optionPage = field.getAnnotation(Page.class); + OptionSubcategory subcategory = ConfigUtils.getSubCategory(page, optionPage.category(), optionPage.subcategory()); + Object pageInstance = ConfigUtils.getField(field, instance); + if (pageInstance == null) continue; + OptionPage newPage = new OptionPage(optionPage.name(), mod); + generateOptionList(pageInstance, newPage, mod, migrate); + ConfigPageButton button = new ConfigPageButton(field, instance, optionPage.name(), optionPage.description(), optionPage.category(), optionPage.subcategory(), newPage); + if (optionPage.location() == PageLocation.TOP) subcategory.topButtons.add(button); + else subcategory.bottomButtons.add(button); + } else if (field.isAnnotationPresent(HUD.class)) { + HUDUtils.addHudOptions(page, field, instance); + } } } /** - * Overwrite this method to add your own custom option types + * All fields with the CustomOption annotation are sent to this function * - * @param field target field - * @param page page to add options too + * @param field Target field + * @param page Page to add options too + * @param mod The data of the mod + * @param migrate If the data should be migrated */ - protected void processCustomOption(Field field, OptionPage page) { + protected BasicOption getCustomOption(Field field, OptionPage page, Mod mod, boolean migrate) { + return null; } /** diff --git a/src/main/java/cc/polyfrost/oneconfig/config/annotations/CustomOption.java b/src/main/java/cc/polyfrost/oneconfig/config/annotations/CustomOption.java new file mode 100644 index 0000000..6a1109b --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/config/annotations/CustomOption.java @@ -0,0 +1,14 @@ +package cc.polyfrost.oneconfig.config.annotations; + +import cc.polyfrost.oneconfig.config.data.OptionType; +import cc.polyfrost.oneconfig.internal.config.annotations.Option; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface CustomOption { +} diff --git a/src/main/java/cc/polyfrost/oneconfig/config/annotations/HUD.java b/src/main/java/cc/polyfrost/oneconfig/config/annotations/HUD.java new file mode 100644 index 0000000..7bb1903 --- /dev/null +++ b/src/main/java/cc/polyfrost/oneconfig/config/annotations/HUD.java @@ -0,0 +1,16 @@ +package cc.polyfrost.oneconfig.config.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface HUD { + String name(); + + String category() default "General"; + + String subcategory() default ""; +} diff --git a/src/main/java/cc/polyfrost/oneconfig/config/annotations/ConfigPage.java b/src/main/java/cc/polyfrost/oneconfig/config/annotations/Page.java index 432d65c..2e93a7d 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/annotations/ConfigPage.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/annotations/Page.java @@ -9,7 +9,7 @@ import java.lang.annotation.Target; @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.FIELD) -public @interface ConfigPage { +public @interface Page { /** * The name of the page that will be displayed to the user */ diff --git a/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java b/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java index 2002b01..5327dad 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/core/ConfigUtils.java @@ -52,27 +52,23 @@ public class ConfigUtils { return options; } - public static void addOptionToPage(OptionPage page, Option option, Field field, Object instance, @Nullable Migrator migrator) { + public static BasicOption addOptionToPage(OptionPage page, Option option, Field field, Object instance, @Nullable Migrator migrator) { BasicOption configOption = getOption(option, field, instance); - if (configOption == null) return; + if (configOption == null) return null; if (migrator != null) { Object value = migrator.getValue(field, configOption.name, configOption.category, configOption.subcategory); - if (value != null) { - try { - field.set(instance, value); - } catch (IllegalAccessException ignored) { - } - } + if (value != null) setField(field, value, instance); } - getOptions(page, configOption.category, configOption.subcategory).add(configOption); + getSubCategory(page, configOption.category, configOption.subcategory).options.add(configOption); + return configOption; } - public static ArrayList<BasicOption> getOptions(OptionPage page, String categoryName, String subcategoryName) { + public static OptionSubcategory getSubCategory(OptionPage page, String categoryName, String subcategoryName) { if (!page.categories.containsKey(categoryName)) page.categories.put(categoryName, new OptionCategory()); OptionCategory category = page.categories.get(categoryName); if (category.subcategories.size() == 0 || !category.subcategories.get(category.subcategories.size() - 1).getName().equals(subcategoryName)) category.subcategories.add(new OptionSubcategory(subcategoryName)); - return category.subcategories.get(category.subcategories.size() - 1).options; + return category.subcategories.get(category.subcategories.size() - 1); } public static <T extends Annotation> T findAnnotation(Field field, Class<T> annotationType) { @@ -82,4 +78,21 @@ public class ConfigUtils { } return null; } + + public static Object getField(Field field, Object parent) { + try { + field.setAccessible(true); + return field.get(parent); + } catch (IllegalAccessException ignored) { + return null; + } + } + + public static void setField(Field field, Object value, Object parent) { + try { + field.setAccessible(true); + field.set(parent, value); + } catch (IllegalAccessException ignored) { + } + } } diff --git a/src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java b/src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java index 4ae11da..e636ebb 100644 --- a/src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java +++ b/src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java @@ -45,8 +45,4 @@ public enum OptionType { * Type: OneKeyBind */ KEYBIND, - /** - * Type: ? extends BasicHud - */ - HUD, } |