Sfoglia il codice sorgente

Added list field types

Lortseam 4 anni fa
parent
commit
d69091b340

+ 1 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiBuilder.java

@@ -85,7 +85,7 @@ public class GuiBuilder {
                 }
             }
             list.add(((Optional<GuiProvider>) CompleteConfig.getManager(modID).get().getGuiRegistry().getProvider(entry)).orElseGet(() -> {
-                throw new UnsupportedOperationException("Could not find gui provider for field type " + entry.getType());
+                throw new UnsupportedOperationException("Could not find gui provider for field " + entry.getField());
             }).build(new TranslatableText(translationKey), entry.getField(), entry.getValue(), entry.getDefaultValue(), tooltipKeys != null ? Optional.of(Arrays.stream(tooltipKeys).map(TranslatableText::new).toArray(Text[]::new)) : Optional.empty(), entry.getExtras(), entry::setValue));
         });
         collection.getCollections().forEach((subcategoryID, c) -> {

+ 65 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiRegistry.java

@@ -6,10 +6,13 @@ import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import net.minecraft.text.TranslatableText;
 import org.apache.commons.lang3.ArrayUtils;
 
+import java.lang.reflect.ParameterizedType;
+import java.lang.reflect.Type;
 import java.util.*;
 
 public class GuiRegistry {
 
+    //TODO: Create own class with predicate, provider and test method
     private final LinkedHashMap<GuiProviderPredicate, GuiProvider> guiProviders = new LinkedHashMap<>();
 
     GuiRegistry() {
@@ -17,7 +20,13 @@ public class GuiRegistry {
     }
 
     public <T> void registerProvider(GuiProvider<T> provider, GuiProviderPredicate<T> predicate, Class... types) {
-        guiProviders.put(predicate.and((field, extras) -> types.length == 0 || ArrayUtils.contains(types, field.getType())), provider);
+        guiProviders.put(predicate.and((field, extras) -> {
+            if (types.length == 0) {
+                return true;
+            }
+            Type fieldType = field.getGenericType();
+            return ArrayUtils.contains(types, fieldType instanceof ParameterizedType ? ((ParameterizedType) fieldType).getRawType() : fieldType);
+        }), provider);
     }
 
     public void registerProvider(GuiProvider<?> provider, Class... types) {
@@ -31,6 +40,16 @@ public class GuiRegistry {
         registerProvider(provider, (field, extras) -> extras.getBounds() != null, types);
     }
 
+    public <T> void registerGenericProvider(GuiProvider<T> provider, Class<?> type, Class... genericTypes) {
+        registerProvider(provider, (field, extras) -> {
+            Type fieldType = field.getGenericType();
+            if (!(fieldType instanceof ParameterizedType)) {
+                return false;
+            }
+            return Arrays.equals(((ParameterizedType) fieldType).getActualTypeArguments(), genericTypes);
+        }, type);
+    }
+
     private void registerDefaultProviders() {
         registerProvider((GuiProvider<Boolean>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
@@ -137,6 +156,51 @@ public class GuiRegistry {
                 .build(),
                 (field, extras) -> Enum.class.isAssignableFrom(field.getType())
         );
+        registerGenericProvider((GuiProvider<List<Integer>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
+                        .create()
+                        .startIntList(text, value)
+                        .setDefaultValue(defaultValue)
+                        .setTooltip(tooltip)
+                        .setSaveConsumer(saveConsumer)
+                        .build(),
+                List.class, Integer.class
+        );
+        registerGenericProvider((GuiProvider<List<Long>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
+                        .create()
+                        .startLongList(text, value)
+                        .setDefaultValue(defaultValue)
+                        .setTooltip(tooltip)
+                        .setSaveConsumer(saveConsumer)
+                        .build(),
+                List.class, Long.class
+        );
+        registerGenericProvider((GuiProvider<List<Float>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
+                        .create()
+                        .startFloatList(text, value)
+                        .setDefaultValue(defaultValue)
+                        .setTooltip(tooltip)
+                        .setSaveConsumer(saveConsumer)
+                        .build(),
+                List.class, Float.class
+        );
+        registerGenericProvider((GuiProvider<List<Double>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
+                        .create()
+                        .startDoubleList(text, value)
+                        .setDefaultValue(defaultValue)
+                        .setTooltip(tooltip)
+                        .setSaveConsumer(saveConsumer)
+                        .build(),
+                List.class, Double.class
+        );
+        registerGenericProvider((GuiProvider<List<String>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
+                .create()
+                .startStrList(text, value)
+                .setDefaultValue(defaultValue)
+                .setTooltip(tooltip)
+                .setSaveConsumer(saveConsumer)
+                .build(),
+                List.class, String.class
+        );
     }
 
     <T> Optional<GuiProvider<T>> getProvider(Entry<T> entry) {