瀏覽代碼

Add option to change slider value text

Lortseam 4 年之前
父節點
當前提交
802ae53db6

+ 2 - 0
example/src/main/java/me/lortseam/completeconfig/example/Settings.java

@@ -17,9 +17,11 @@ public final class Settings implements ConfigContainer {
         private boolean bool;
         private int integer;
         @ConfigEntry.BoundedInteger(min = 0, max = 10)
+        @ConfigEntry.Slider
         private int boundedInt;
         private long aLong;
         @ConfigEntry.BoundedLong(min = 0, max = 100)
+        @ConfigEntry.Slider
         private long boundedLong;
         private float aFloat;
         private double aDouble;

+ 8 - 14
lib/src/main/java/me/lortseam/completeconfig/api/ConfigEntry.java

@@ -107,13 +107,6 @@ public @interface ConfigEntry {
          */
         int max() default java.lang.Integer.MAX_VALUE;
 
-        /**
-         * Specifies whether the entry should be rendered as slider.
-         *
-         * @return whether the entry should be rendered as slider
-         */
-        boolean slider() default true;
-
     }
 
     /**
@@ -137,13 +130,6 @@ public @interface ConfigEntry {
          */
         long max() default java.lang.Long.MAX_VALUE;
 
-        /**
-         * Specifies whether the entry should be rendered as slider.
-         *
-         * @return whether the entry should be rendered as slider
-         */
-        boolean slider() default true;
-
     }
 
     /**
@@ -192,6 +178,14 @@ public @interface ConfigEntry {
 
     }
 
+    @Target({ElementType.FIELD})
+    @Retention(RetentionPolicy.RUNTIME)
+    @interface Slider {
+
+        String valueTranslationKey() default "";
+
+    }
+
     /**
      * Applied to an entry of type Enum.
      *

+ 13 - 11
lib/src/main/java/me/lortseam/completeconfig/data/BooleanEntry.java

@@ -4,7 +4,6 @@ import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.data.entry.AnnotatedEntryOrigin;
 import me.lortseam.completeconfig.data.entry.EntryOrigin;
 import me.lortseam.completeconfig.data.text.TranslationIdentifier;
-import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import net.minecraft.text.Text;
 import org.apache.commons.lang3.StringUtils;
 
@@ -14,22 +13,25 @@ public class BooleanEntry extends Entry<Boolean> {
 
     private final Function<Boolean, TranslationIdentifier> valueTranslationSupplier;
 
-    public BooleanEntry(EntryOrigin origin, Function<Boolean, TranslationIdentifier> valueTranslationSupplier) {
-        super(origin);
-        this.valueTranslationSupplier = valueTranslationSupplier;
-    }
-
     BooleanEntry(AnnotatedEntryOrigin<ConfigEntry.Boolean> origin) {
         super(origin);
         ConfigEntry.Boolean annotation = origin.getAnnotation();
-        if (StringUtils.isBlank(annotation.trueTranslationKey()) || StringUtils.isBlank(annotation.falseTranslationKey())) {
-            throw new IllegalAnnotationParameterException("Both true key and false key must be specified");
+        if (StringUtils.isBlank(annotation.trueTranslationKey()) && StringUtils.isBlank(annotation.falseTranslationKey())) {
+            valueTranslationSupplier = null;
+        } else {
+            valueTranslationSupplier = value -> {
+                String key = value ? annotation.trueTranslationKey() : annotation.falseTranslationKey();
+                if (!StringUtils.isBlank(key)) {
+                    return getTranslation().root().append(key);
+                }
+                return getTranslation().append(value ? "true" : "false");
+            };
         }
-        valueTranslationSupplier = bool -> getTranslation().root().append(bool ? annotation.trueTranslationKey() : annotation.falseTranslationKey());
     }
 
     BooleanEntry(EntryOrigin origin) {
-        this(origin, null);
+        super(origin);
+        valueTranslationSupplier = null;
     }
 
     public Function<Boolean, Text> getValueTextSupplier() {
@@ -38,7 +40,7 @@ public class BooleanEntry extends Entry<Boolean> {
         }
         TranslationIdentifier defaultTrueTranslation = getTranslation().append("true");
         TranslationIdentifier defaultFalseTranslation = getTranslation().append("false");
-        if (defaultTrueTranslation.exists() && defaultFalseTranslation.exists()) {
+        if (defaultTrueTranslation.exists() || defaultFalseTranslation.exists()) {
             return bool -> (bool ? defaultTrueTranslation : defaultFalseTranslation).toText();
         }
         return null;

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/Collection.java

@@ -22,7 +22,7 @@ public class Collection extends Node {
     Collection(String id, TranslationIdentifier translation, String[] customTooltipTranslationKeys, String comment) {
         super(translation);
         this.id = id;
-        customTooltipTranslation = ArrayUtils.isNotEmpty(customTooltipTranslationKeys) ? Arrays.stream(customTooltipTranslationKeys).map(key -> translation.root().appendKey(key)).toArray(TranslationIdentifier[]::new) : null;
+        customTooltipTranslation = ArrayUtils.isNotEmpty(customTooltipTranslationKeys) ? Arrays.stream(customTooltipTranslationKeys).map(key -> translation.root().append(key)).toArray(TranslationIdentifier[]::new) : null;
         this.comment = !StringUtils.isBlank(comment) ? comment : null;
     }
 

+ 1 - 1
lib/src/main/java/me/lortseam/completeconfig/data/Config.java

@@ -37,7 +37,7 @@ public class Config extends Node {
     private final ConfigSource source;
 
     private Config(ConfigSource source, LinkedHashSet<ConfigContainer> children) {
-        super(new TranslationIdentifier(source.getModID()));
+        super(TranslationIdentifier.ofRoot(source.getModID()));
         this.source = source;
         resolve(children);
         if (isEmpty()) {

+ 8 - 10
lib/src/main/java/me/lortseam/completeconfig/data/Entry.java

@@ -35,17 +35,15 @@ public class Entry<T> extends EntryBase<T> implements DataPart {
             Transformation.byType(boolean.class, Boolean.class).transforms(BooleanEntry::new),
             Transformation.byAnnotation(ConfigEntry.BoundedInteger.class).andType(int.class, Integer.class).transforms(origin -> {
                 ConfigEntry.BoundedInteger bounds = origin.getAnnotation();
-                if (bounds.slider()) {
-                    return new SliderEntry<>(origin, bounds.min(), bounds.max());
-                }
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+                return origin.getAnnotation(ConfigEntry.Slider.class).map(slider -> {
+                    return (Entry<Integer>) new SliderEntry<>(origin, bounds.min(), bounds.max(), slider);
+                }).orElse(new BoundedEntry<>(origin, bounds.min(), bounds.max()));
             }),
             Transformation.byAnnotation(ConfigEntry.BoundedLong.class).andType(long.class, Long.class).transforms(origin -> {
                 ConfigEntry.BoundedLong bounds = origin.getAnnotation();
-                if (bounds.slider()) {
-                    return new SliderEntry<>(origin, bounds.min(), bounds.max());
-                }
-                return new BoundedEntry<>(origin, bounds.min(), bounds.max());
+                return origin.getAnnotation(ConfigEntry.Slider.class).map(slider -> {
+                    return (Entry<Long>) new SliderEntry<>(origin, bounds.min(), bounds.max(), slider);
+                }).orElse(new BoundedEntry<>(origin, bounds.min(), bounds.max()));
             }),
             Transformation.byAnnotation(ConfigEntry.BoundedFloat.class).andType(float.class, Float.class).transforms(origin -> {
                 ConfigEntry.BoundedFloat bounds = origin.getAnnotation();
@@ -183,14 +181,14 @@ public class Entry<T> extends EntryBase<T> implements DataPart {
             }
             String customTranslationKey = annotation.translationKey();
             if (!StringUtils.isBlank(customTranslationKey)) {
-                customTranslation = parentTranslation.root().appendKey(customTranslationKey);
+                customTranslation = parentTranslation.root().append(customTranslationKey);
             }
             String[] customTooltipTranslationKeys = annotation.tooltipTranslationKeys();
             if (customTooltipTranslationKeys.length > 0) {
                 if (Arrays.stream(customTooltipTranslationKeys).anyMatch(StringUtils::isBlank)) {
                     throw new IllegalAnnotationParameterException("Entry tooltip translation key(s) must not be blank");
                 }
-                customTooltipTranslation = Arrays.stream(customTooltipTranslationKeys).map(key -> parentTranslation.root().appendKey(key)).toArray(TranslationIdentifier[]::new);
+                customTooltipTranslation = Arrays.stream(customTooltipTranslationKeys).map(key -> parentTranslation.root().append(key)).toArray(TranslationIdentifier[]::new);
             }
             forceUpdate = annotation.forceUpdate();
             requiresRestart = annotation.requiresRestart();

+ 25 - 1
lib/src/main/java/me/lortseam/completeconfig/data/SliderEntry.java

@@ -1,11 +1,35 @@
 package me.lortseam.completeconfig.data;
 
+import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.data.entry.EntryOrigin;
+import me.lortseam.completeconfig.data.text.TranslationIdentifier;
+import net.minecraft.text.Text;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.function.Function;
 
 public class SliderEntry<T extends Number> extends BoundedEntry<T> {
 
-    public SliderEntry(EntryOrigin origin, T min, T max) {
+    private final TranslationIdentifier valueTranslation;
+
+    public SliderEntry(EntryOrigin origin, T min, T max, ConfigEntry.Slider slider) {
         super(origin, min, max);
+        if (!StringUtils.isBlank(slider.valueTranslationKey())) {
+            valueTranslation = getTranslation().root().append(slider.valueTranslationKey());
+        } else {
+            valueTranslation = null;
+        }
+    }
+
+    public Function<T, Text> getValueTextSupplier() {
+        if (valueTranslation != null) {
+            return valueTranslation::toText;
+        }
+        TranslationIdentifier defaultValueTranslation = getTranslation().append("value");
+        if (defaultValueTranslation.exists()) {
+            return defaultValueTranslation::toText;
+        }
+        return null;
     }
 
 }

+ 2 - 2
lib/src/main/java/me/lortseam/completeconfig/data/entry/AnnotatedEntryOrigin.java

@@ -12,9 +12,9 @@ public class AnnotatedEntryOrigin<A extends Annotation> extends EntryOrigin {
     @Getter
     private final A annotation;
 
-    AnnotatedEntryOrigin(Field field, ConfigContainer parentObject, TranslationIdentifier parentTranslation, A annotation) {
+    AnnotatedEntryOrigin(Field field, ConfigContainer parentObject, TranslationIdentifier parentTranslation, Class<A> annotationType) {
         super(field, parentObject, parentTranslation);
-        this.annotation = annotation;
+        annotation = field.getAnnotation(annotationType);
     }
 
 }

+ 10 - 1
lib/src/main/java/me/lortseam/completeconfig/data/entry/EntryOrigin.java

@@ -6,16 +6,25 @@ import lombok.RequiredArgsConstructor;
 import me.lortseam.completeconfig.api.ConfigContainer;
 import me.lortseam.completeconfig.data.text.TranslationIdentifier;
 
+import java.lang.annotation.Annotation;
 import java.lang.reflect.Field;
+import java.util.Optional;
 
 @RequiredArgsConstructor(access = AccessLevel.PACKAGE)
 public class EntryOrigin {
 
     @Getter
-    private final Field field;
+    protected final Field field;
     @Getter
     private final ConfigContainer parentObject;
     @Getter
     private final TranslationIdentifier parentTranslation;
 
+    public <A extends Annotation> Optional<A> getAnnotation(Class<A> annotationType) {
+        if (field.isAnnotationPresent(annotationType)) {
+            return Optional.of(field.getAnnotation(annotationType));
+        }
+        return Optional.empty();
+    }
+
 }

+ 3 - 3
lib/src/main/java/me/lortseam/completeconfig/data/entry/Transformation.java

@@ -24,10 +24,10 @@ public final class Transformation<O extends EntryOrigin> {
         return new Transformation.Builder<>(EntryOrigin::new).andType(types);
     }
 
-    public static <A extends Annotation> Transformation.Builder<AnnotatedEntryOrigin<A>> byAnnotation(Class<A> annotationClass) {
+    public static <A extends Annotation> Transformation.Builder<AnnotatedEntryOrigin<A>> byAnnotation(Class<A> annotationType) {
         return new Transformation.Builder<>((field, parentObject, parentTranslation) -> {
-            return new AnnotatedEntryOrigin<>(field, parentObject, parentTranslation, field.getDeclaredAnnotation(annotationClass));
-        }).and(base -> base.getField().isAnnotationPresent(annotationClass));
+            return new AnnotatedEntryOrigin<>(field, parentObject, parentTranslation, annotationType);
+        }).and(base -> base.getField().isAnnotationPresent(annotationType));
     }
 
     private final Predicate<EntryBase<?>> predicate;

+ 12 - 15
lib/src/main/java/me/lortseam/completeconfig/data/text/TranslationIdentifier.java

@@ -1,7 +1,5 @@
 package me.lortseam.completeconfig.data.text;
 
-import lombok.AccessLevel;
-import lombok.AllArgsConstructor;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.Text;
 import net.minecraft.text.TranslatableText;
@@ -12,15 +10,18 @@ import java.util.List;
 import java.util.Optional;
 import java.util.regex.Pattern;
 
-@AllArgsConstructor(access = AccessLevel.PRIVATE)
 public final class TranslationIdentifier {
 
+    public static TranslationIdentifier ofRoot(String modID) {
+        return new TranslationIdentifier("config." + modID);
+    }
+
     private final String modKey;
     private final String[] keyParts;
 
-    public TranslationIdentifier(String modID) {
-        modKey = "config." + modID;
-        keyParts = new String[0];
+    private TranslationIdentifier(String modKey, String... keyParts) {
+        this.modKey = modKey;
+        this.keyParts = keyParts;
     }
 
     private String getKey() {
@@ -33,23 +34,19 @@ public final class TranslationIdentifier {
     }
 
     public TranslationIdentifier root() {
-        return new TranslationIdentifier(modKey, new String[0]);
+        return new TranslationIdentifier(modKey);
     }
 
     public boolean exists() {
         return I18n.hasTranslation(getKey());
     }
 
-    public Text toText() {
-        return new TranslatableText(getKey());
-    }
-
-    public TranslationIdentifier append(String... keyParts) {
-        return new TranslationIdentifier(modKey, ArrayUtils.addAll(this.keyParts, keyParts));
+    public Text toText(Object... args) {
+        return new TranslatableText(getKey(), args);
     }
 
-    public TranslationIdentifier appendKey(String key) {
-        return new TranslationIdentifier(modKey, key.split(Pattern.quote(".")));
+    public TranslationIdentifier append(String key) {
+        return new TranslationIdentifier(modKey, ArrayUtils.addAll(this.keyParts, key.split(Pattern.quote("."))));
     }
 
     public Optional<TranslationIdentifier[]> appendTooltip() {

+ 2 - 0
lib/src/main/java/me/lortseam/completeconfig/gui/cloth/GuiRegistry.java

@@ -100,6 +100,7 @@ public final class GuiRegistry {
                builder -> builder
                        .startIntSlider(entry.getText(), entry.getValue(), entry.getMin(), entry.getMax())
                        .setDefaultValue(entry.getDefaultValue())
+                       .setTextGetter(entry.getValueTextSupplier())
                        .setTooltip(entry.getTooltip())
                        .setSaveConsumer(entry::setValue),
                entry.requiresRestart()
@@ -135,6 +136,7 @@ public final class GuiRegistry {
                builder -> builder
                        .startLongSlider(entry.getText(), entry.getValue(), entry.getMin(), entry.getMax())
                        .setDefaultValue(entry.getDefaultValue())
+                       .setTextGetter(entry.getValueTextSupplier())
                        .setTooltip(entry.getTooltip())
                        .setSaveConsumer(entry::setValue),
                entry.requiresRestart()