aboutsummaryrefslogtreecommitdiff
path: root/src/main/java/cc/polyfrost/oneconfig/config
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/java/cc/polyfrost/oneconfig/config')
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/config/Config.java53
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/config/annotations/CustomOption.java14
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/config/annotations/HUD.java16
-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.java35
-rw-r--r--src/main/java/cc/polyfrost/oneconfig/config/data/OptionType.java4
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,
}