aboutsummaryrefslogtreecommitdiff
path: root/common/src/main
diff options
context:
space:
mode:
authorisXander <xander@isxander.dev>2023-08-15 13:52:03 +0100
committerisXander <xander@isxander.dev>2023-08-15 13:52:03 +0100
commit3e30af10ab48aa64fa659834a863a4e3067d5542 (patch)
tree5e30586a58863ec2435db360dcfb04994f9405a8 /common/src/main
parentad3e7955295d114ecbdaf07eb51ba26f0dc95d96 (diff)
downloadYetAnotherConfigLib-3e30af10ab48aa64fa659834a863a4e3067d5542.tar.gz
YetAnotherConfigLib-3e30af10ab48aa64fa659834a863a4e3067d5542.tar.bz2
YetAnotherConfigLib-3e30af10ab48aa64fa659834a863a4e3067d5542.zip
Add number fields
Diffstat (limited to 'common/src/main')
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleField.java16
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatField.java16
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntField.java14
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongField.java14
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java9
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java5
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleFieldImpl.java29
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatFieldImpl.java29
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntFieldImpl.java25
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongFieldImpl.java25
-rw-r--r--common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java4
11 files changed, 181 insertions, 5 deletions
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleField.java b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleField.java
new file mode 100644
index 0000000..225fe8e
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/DoubleField.java
@@ -0,0 +1,16 @@
+package dev.isxander.yacl3.config.v2.api.autogen;
+
+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 DoubleField {
+ double min();
+
+ double max();
+
+ String format() default "%.2f";
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatField.java b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatField.java
new file mode 100644
index 0000000..a14b36a
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/FloatField.java
@@ -0,0 +1,16 @@
+package dev.isxander.yacl3.config.v2.api.autogen;
+
+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 FloatField {
+ float min();
+
+ float max();
+
+ String format() default "%.1f";
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntField.java b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntField.java
new file mode 100644
index 0000000..88b5827
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/IntField.java
@@ -0,0 +1,14 @@
+package dev.isxander.yacl3.config.v2.api.autogen;
+
+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 IntField {
+ int min();
+
+ int max();
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongField.java b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongField.java
new file mode 100644
index 0000000..80a29ad
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/api/autogen/LongField.java
@@ -0,0 +1,14 @@
+package dev.isxander.yacl3.config.v2.api.autogen;
+
+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 LongField {
+ long min();
+
+ long max();
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java
index 7c0c2a9..df0af15 100644
--- a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ConfigClassHandlerImpl.java
@@ -6,6 +6,7 @@ import dev.isxander.yacl3.config.v2.api.autogen.AutoGen;
import dev.isxander.yacl3.config.v2.api.autogen.OptionStorage;
import dev.isxander.yacl3.config.v2.impl.autogen.OptionFactoryRegistry;
import dev.isxander.yacl3.config.v2.impl.autogen.OptionStorageImpl;
+import dev.isxander.yacl3.config.v2.impl.autogen.YACLAutoGenException;
import dev.isxander.yacl3.platform.YACLPlatform;
import net.minecraft.network.chat.Component;
import net.minecraft.resources.ResourceLocation;
@@ -36,7 +37,7 @@ public class ConfigClassHandlerImpl<T> implements ConfigClassHandler<T> {
this.instance = constructor.newInstance();
this.defaults = constructor.newInstance();
} catch (Exception e) {
- throw new IllegalArgumentException("Failed to create instance of config class '%s' with no-args constructor.".formatted(configClass.getName()), e);
+ throw new YACLAutoGenException("Failed to create instance of config class '%s' with no-args constructor.".formatted(configClass.getName()), e);
}
this.fields = Arrays.stream(configClass.getDeclaredFields())
@@ -79,7 +80,9 @@ public class ConfigClassHandlerImpl<T> implements ConfigClassHandler<T> {
@Override
public YetAnotherConfigLib generateGui() {
- Validate.isTrue(supportsAutoGen(), "Auto GUI generation is not supported for this config class. You either need to enable it in the builder or you are attempting to create a GUI in a dedicated server environment.");
+ if (!supportsAutoGen()) {
+ throw new YACLAutoGenException("Auto GUI generation is not supported for this config class. You either need to enable it in the builder or you are attempting to create a GUI in a dedicated server environment.");
+ }
OptionStorageImpl storage = new OptionStorageImpl();
Map<String, CategoryAndGroups> categories = new LinkedHashMap<>();
@@ -117,7 +120,7 @@ public class ConfigClassHandlerImpl<T> implements ConfigClassHandler<T> {
private <U> Option<U> createOption(ConfigField<U> configField, OptionStorage storage) {
return OptionFactoryRegistry.createOption(((ReflectionFieldAccess<?>) configField.access()).field(), configField, storage)
- .orElseThrow(() -> new IllegalStateException("Failed to create option for field %s".formatted(configField.access().name())));
+ .orElseThrow(() -> new YACLAutoGenException("Failed to create option for field %s".formatted(configField.access().name())));
}
@Override
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java
index 7bba083..8bb7fc0 100644
--- a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/ReflectionFieldAccess.java
@@ -1,6 +1,7 @@
package dev.isxander.yacl3.config.v2.impl;
import dev.isxander.yacl3.config.v2.api.FieldAccess;
+import dev.isxander.yacl3.config.v2.impl.autogen.YACLAutoGenException;
import java.lang.reflect.Field;
import java.lang.reflect.Type;
@@ -11,7 +12,7 @@ public record ReflectionFieldAccess<T>(Field field, Object instance) implements
try {
return (T) field.get(instance);
} catch (IllegalAccessException e) {
- throw new RuntimeException(e);
+ throw new YACLAutoGenException("Failed to access field '%s'".formatted(name()), e);
}
}
@@ -20,7 +21,7 @@ public record ReflectionFieldAccess<T>(Field field, Object instance) implements
try {
field.set(instance, value);
} catch (IllegalAccessException e) {
- throw new RuntimeException(e);
+ throw new YACLAutoGenException("Failed to set field '%s'".formatted(name()), e);
}
}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleFieldImpl.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleFieldImpl.java
new file mode 100644
index 0000000..46dace4
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/DoubleFieldImpl.java
@@ -0,0 +1,29 @@
+package dev.isxander.yacl3.config.v2.impl.autogen;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.api.controller.ControllerBuilder;
+import dev.isxander.yacl3.api.controller.DoubleFieldControllerBuilder;
+import dev.isxander.yacl3.config.v2.api.ConfigField;
+import dev.isxander.yacl3.config.v2.api.autogen.DoubleField;
+import dev.isxander.yacl3.config.v2.api.autogen.OptionStorage;
+import dev.isxander.yacl3.config.v2.api.autogen.SimpleOptionFactory;
+import net.minecraft.locale.Language;
+import net.minecraft.network.chat.Component;
+
+public class DoubleFieldImpl extends SimpleOptionFactory<DoubleField, Double> {
+ @Override
+ protected ControllerBuilder<Double> createController(DoubleField annotation, ConfigField<Double> field, OptionStorage storage, Option<Double> option) {
+ return DoubleFieldControllerBuilder.create(option)
+ .valueFormatter(v -> {
+ String key = null;
+ if (v == annotation.min())
+ key = getTranslationKey(field, "fmt.min");
+ else if (v == annotation.max())
+ key = getTranslationKey(field, "fmt.max");
+ if (key != null && Language.getInstance().has(key))
+ return Component.translatable(key);
+ return Component.translatable(String.format(annotation.format(), v));
+ })
+ .range(annotation.min(), annotation.max());
+ }
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatFieldImpl.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatFieldImpl.java
new file mode 100644
index 0000000..1c613f9
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/FloatFieldImpl.java
@@ -0,0 +1,29 @@
+package dev.isxander.yacl3.config.v2.impl.autogen;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.api.controller.ControllerBuilder;
+import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
+import dev.isxander.yacl3.config.v2.api.ConfigField;
+import dev.isxander.yacl3.config.v2.api.autogen.FloatField;
+import dev.isxander.yacl3.config.v2.api.autogen.OptionStorage;
+import dev.isxander.yacl3.config.v2.api.autogen.SimpleOptionFactory;
+import net.minecraft.locale.Language;
+import net.minecraft.network.chat.Component;
+
+public class FloatFieldImpl extends SimpleOptionFactory<FloatField, Float> {
+ @Override
+ protected ControllerBuilder<Float> createController(FloatField annotation, ConfigField<Float> field, OptionStorage storage, Option<Float> option) {
+ return FloatFieldControllerBuilder.create(option)
+ .valueFormatter(v -> {
+ String key = null;
+ if (v == annotation.min())
+ key = getTranslationKey(field, "fmt.min");
+ else if (v == annotation.max())
+ key = getTranslationKey(field, "fmt.max");
+ if (key != null && Language.getInstance().has(key))
+ return Component.translatable(key);
+ return Component.translatable(String.format(annotation.format(), v));
+ })
+ .range(annotation.min(), annotation.max());
+ }
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntFieldImpl.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntFieldImpl.java
new file mode 100644
index 0000000..26d6c1f
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/IntFieldImpl.java
@@ -0,0 +1,25 @@
+package dev.isxander.yacl3.config.v2.impl.autogen;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.api.controller.ControllerBuilder;
+import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
+import dev.isxander.yacl3.config.v2.api.ConfigField;
+import dev.isxander.yacl3.config.v2.api.autogen.IntField;
+import dev.isxander.yacl3.config.v2.api.autogen.OptionStorage;
+import dev.isxander.yacl3.config.v2.api.autogen.SimpleOptionFactory;
+import net.minecraft.locale.Language;
+import net.minecraft.network.chat.Component;
+
+public class IntFieldImpl extends SimpleOptionFactory<IntField, Integer> {
+ @Override
+ protected ControllerBuilder<Integer> createController(IntField annotation, ConfigField<Integer> field, OptionStorage storage, Option<Integer> option) {
+ return IntegerFieldControllerBuilder.create(option)
+ .valueFormatter(v -> {
+ String key = getTranslationKey(field, "fmt." + v);
+ if (Language.getInstance().has(key))
+ return Component.translatable(key);
+ return Component.literal(Integer.toString(v));
+ })
+ .range(annotation.min(), annotation.max());
+ }
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongFieldImpl.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongFieldImpl.java
new file mode 100644
index 0000000..fd38763
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/LongFieldImpl.java
@@ -0,0 +1,25 @@
+package dev.isxander.yacl3.config.v2.impl.autogen;
+
+import dev.isxander.yacl3.api.Option;
+import dev.isxander.yacl3.api.controller.ControllerBuilder;
+import dev.isxander.yacl3.api.controller.LongSliderControllerBuilder;
+import dev.isxander.yacl3.config.v2.api.ConfigField;
+import dev.isxander.yacl3.config.v2.api.autogen.LongField;
+import dev.isxander.yacl3.config.v2.api.autogen.OptionStorage;
+import dev.isxander.yacl3.config.v2.api.autogen.SimpleOptionFactory;
+import net.minecraft.locale.Language;
+import net.minecraft.network.chat.Component;
+
+public class LongFieldImpl extends SimpleOptionFactory<LongField, Long> {
+ @Override
+ protected ControllerBuilder<Long> createController(LongField annotation, ConfigField<Long> field, OptionStorage storage, Option<Long> option) {
+ return LongSliderControllerBuilder.create(option)
+ .valueFormatter(v -> {
+ String key = getTranslationKey(field, "fmt." + v);
+ if (Language.getInstance().has(key))
+ return Component.translatable(key);
+ return Component.literal(Long.toString(v));
+ })
+ .range(annotation.min(), annotation.max());
+ }
+}
diff --git a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java
index 28d8bb3..7e440a4 100644
--- a/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java
+++ b/common/src/main/java/dev/isxander/yacl3/config/v2/impl/autogen/OptionFactoryRegistry.java
@@ -24,6 +24,10 @@ public class OptionFactoryRegistry {
registerOptionFactory(LongSlider.class, new LongSliderImpl());
registerOptionFactory(FloatSlider.class, new FloatSliderImpl());
registerOptionFactory(DoubleSlider.class, new DoubleSliderImpl());
+ registerOptionFactory(IntField.class, new IntFieldImpl());
+ registerOptionFactory(LongField.class, new LongFieldImpl());
+ registerOptionFactory(FloatField.class, new FloatFieldImpl());
+ registerOptionFactory(DoubleField.class, new DoubleFieldImpl());
registerOptionFactory(EnumCycler.class, new EnumCyclerImpl());
registerOptionFactory(StringField.class, new StringFieldImpl());
registerOptionFactory(ColorRGBA.class, new ColorRGBAImpl());