From d73b9683f9d5c4c53a37d9ae271602262b597a2d Mon Sep 17 00:00:00 2001 From: Martin Prokoph Date: Sat, 15 Feb 2025 12:01:44 +0100 Subject: [PATCH] feat: support non-primitive fields - Closes #69 (nice) --- .../eu/midnightdust/lib/config/MidnightConfig.java | 14 +++++++------- .../example/config/MidnightConfigExample.java | 2 ++ 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java b/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java index dd313f4..cb13e08 100755 --- a/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java +++ b/common/src/main/java/eu/midnightdust/lib/config/MidnightConfig.java @@ -146,11 +146,11 @@ public abstract class MidnightConfig { if (requiredModLoaded) entries.add(info); } public static Class getUnderlyingType(Field field) { - if (field.getType() == List.class) { - Class listType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; - try { return (Class) listType.getField("TYPE").get(null); - } catch (NoSuchFieldException | IllegalAccessException ignored) { return listType; } - } else return field.getType(); + Class rawType = field.getType(); + if (field.getType() == List.class) + rawType = (Class) ((ParameterizedType) field.getGenericType()).getActualTypeArguments()[0]; + try { return (Class) rawType.getField("TYPE").get(null); // Tries to get primitive types from non-primitives (e.g. Boolean -> boolean) + } catch (NoSuchFieldException | IllegalAccessException ignored) { return rawType; } } public static Tooltip getTooltip(EntryInfo info, boolean isButton) { String key = info.modid + ".midnightconfig."+info.field.getName()+(!isButton ? ".label" : "" )+".tooltip"; @@ -476,8 +476,8 @@ public abstract class MidnightConfig { @Override public void applyValue() { if (info.dataType == int.class) info.setValue(((Number) (e.min() + value * (e.max() - e.min()))).intValue()); - else if (info.field.getType() == double.class) info.setValue(Math.round((e.min() + value * (e.max() - e.min())) * (double) e.precision()) / (double) e.precision()); - else if (info.field.getType() == float.class) info.setValue(Math.round((e.min() + value * (e.max() - e.min())) * (float) e.precision()) / (float) e.precision()); + else if (info.dataType == double.class) info.setValue(Math.round((e.min() + value * (e.max() - e.min())) * (double) e.precision()) / (double) e.precision()); + else if (info.dataType == float.class) info.setValue(Math.round((e.min() + value * (e.max() - e.min())) * (float) e.precision()) / (float) e.precision()); } } diff --git a/test-fabric/src/main/java/eu/midnightdust/fabric/example/config/MidnightConfigExample.java b/test-fabric/src/main/java/eu/midnightdust/fabric/example/config/MidnightConfigExample.java index f16c370..12d29c2 100644 --- a/test-fabric/src/main/java/eu/midnightdust/fabric/example/config/MidnightConfigExample.java +++ b/test-fabric/src/main/java/eu/midnightdust/fabric/example/config/MidnightConfigExample.java @@ -22,6 +22,7 @@ public class MidnightConfigExample extends MidnightConfig { @Comment(category = TEXT, centered = true) public static Comment text2; // Centered comments are the same as normal ones - just centered! @Comment(category = TEXT) public static Comment spacer1; // Comments containing the word "spacer" will just appear as a blank line @Entry(category = TEXT) public static boolean showInfo = true; // Example for a boolean option + @Entry(category = TEXT, name="I am a (non-primitive) Boolean") public static Boolean nonPrimitive = true; // Example for a non-primative boolean option @Entry(category = TEXT) public static String name = "Hello World!"; // Example for a string option, which is in a category! @Entry(category = TEXT, width = 7, min = 7, isColor = true, name = "I am a color!") public static String titleColor = "#ffffff"; // The isColor property adds a color chooser for a hexadecimal color @Entry(category = TEXT, idMode = 0) public static Identifier id = Identifier.ofVanilla("diamond"); // Example for an identifier with matching items displayed next to it! @@ -34,6 +35,7 @@ public class MidnightConfigExample extends MidnightConfig { @Entry(category = NUMBERS, min=69,max=420) public static int hello = 420; // - The entered number has to be larger than 69 and smaller than 420 @Entry(category = SLIDERS, name = "I am an int slider.",isSlider = true, min = 0, max = 100) public static int intSlider = 35; // Int fields can also be displayed as a Slider @Entry(category = SLIDERS, name = "I am a float slider!", isSlider = true, min = 0f, max = 1f, precision = 1000) public static float floatSlider = 0.24f; // And so can floats! Precision defines the amount of decimal places + @Entry(category = SLIDERS, name = "I am a non-primitive double slider!", isSlider = true, min = 0d, max = 4d, precision = 10000) public static Double nonPrimitiveDoubleSlider = 3.76d; // Even works for non-primitive fields // The name field can be used to specify a custom translation string or plain text @Entry(category = LISTS, name = "I am a string list!") public static List stringList = Lists.newArrayList("String1", "String2"); // Array String Lists are also supported @Entry(category = LISTS, isColor = true, name = "I am a color list!") public static List colorList = Lists.newArrayList("#ac5f99", "#11aa44"); // Lists also support colors