Ver código fonte

Improved gui providers structure

Lortseam 5 anos atrás
pai
commit
dd056b0deb

+ 1 - 1
gradle.properties

@@ -8,7 +8,7 @@ org.gradle.jvmargs=-Xmx1G
 	loader_version=0.8.2+build.194
 
 # Mod Properties
-	mod_version = 0.1.4
+	mod_version = 0.1.5
 	maven_group = com.gitlab.Lortseam
 	archives_base_name = completeconfig
 

+ 6 - 6
src/main/java/me/lortseam/completeconfig/ConfigManager.java

@@ -12,7 +12,7 @@ import me.lortseam.completeconfig.api.ConfigEntryContainer;
 import me.lortseam.completeconfig.api.ConfigEntrySaveConsumer;
 import me.lortseam.completeconfig.collection.Collection;
 import me.lortseam.completeconfig.entry.Entry;
-import me.lortseam.completeconfig.entry.GuiRegistry;
+import me.lortseam.completeconfig.gui.GuiRegistry;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import me.lortseam.completeconfig.exception.IllegalReturnValueException;
@@ -120,25 +120,25 @@ public class ConfigManager {
                     builder.setCustomTranslationKey(customTranslationKey);
                 }
                 if (field.isAnnotationPresent(ConfigEntry.Integer.Bounded.class)) {
-                    if (field.getType() != Integer.TYPE) {
+                    if (field.getType() != int.class && field.getType() != Integer.class) {
                         throw new IllegalAnnotationTargetException("Cannot apply Integer bound to non Integer field " + field);
                     }
                     ConfigEntry.Integer.Bounded bounds = field.getDeclaredAnnotation(ConfigEntry.Integer.Bounded.class);
                     builder.setBounds(bounds.min(), bounds.max());
                 } else if (field.isAnnotationPresent(ConfigEntry.Long.Bounded.class)) {
-                    if (field.getType() != Long.TYPE) {
+                    if (field.getType() != long.class && field.getType() != Long.class) {
                         throw new IllegalAnnotationTargetException("Cannot apply Long bound to non Long field " + field);
                     }
                     ConfigEntry.Long.Bounded bounds = field.getDeclaredAnnotation(ConfigEntry.Long.Bounded.class);
                     builder.setBounds(bounds.min(), bounds.max());
                 } else if (field.isAnnotationPresent(ConfigEntry.Float.Bounded.class)) {
-                    if (field.getType() != Float.TYPE) {
+                    if (field.getType() != float.class && field.getType() != Float.class) {
                         throw new IllegalAnnotationTargetException("Cannot apply Float bound to non Float field " + field);
                     }
                     ConfigEntry.Float.Bounded bounds = field.getDeclaredAnnotation(ConfigEntry.Float.Bounded.class);
                     builder.setBounds(bounds.min(), bounds.max());
                 } else if (field.isAnnotationPresent(ConfigEntry.Double.Bounded.class)) {
-                    if (field.getType() != Double.TYPE) {
+                    if (field.getType() != double.class && field.getType() != Double.class) {
                         throw new IllegalAnnotationTargetException("Cannot apply Double bound to non Double field " + field);
                     }
                     ConfigEntry.Double.Bounded bounds = field.getDeclaredAnnotation(ConfigEntry.Double.Bounded.class);
@@ -280,7 +280,7 @@ public class ConfigManager {
         List<AbstractConfigListEntry> list = new ArrayList<>();
         collection.getEntries().forEach((entryID, entry) -> {
             String translationKey = entry.getCustomTranslationKey() != null ? buildTranslationKey(entry.getCustomTranslationKey()) : buildTranslationKey(parentID, entryID);
-            list.add(guiRegistry.getProvider(entry).build(translationKey, entry.getType(), entry.getValue(), entry.getDefaultValue(), entry.getExtras(), entry::setValue));
+            list.add(guiRegistry.getProvider(entry).build(translationKey, entry.getField(), entry.getValue(), entry.getDefaultValue(), entry.getExtras(), entry::setValue));
         });
         collection.getCollections().forEach((subcategoryID, c) -> {
             String id = joinIDs(parentID, subcategoryID);

+ 1 - 1
src/main/java/me/lortseam/completeconfig/entry/Entry.java

@@ -17,7 +17,7 @@ public class Entry<T> {
 
     private static final Logger LOGGER = LogManager.getLogger();
 
-    @Getter(AccessLevel.PACKAGE)
+    @Getter
     private final Field field;
     @Getter
     private final Class<T> type;

+ 0 - 12
src/main/java/me/lortseam/completeconfig/entry/GuiProvider.java

@@ -1,12 +0,0 @@
-package me.lortseam.completeconfig.entry;
-
-import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
-
-import java.util.function.Consumer;
-
-@FunctionalInterface
-public interface GuiProvider<T> {
-
-    AbstractConfigListEntry<T> build(String translationKey, Class<T> type, T value, T defaultValue, Extras<T> extras, Consumer<T> saveConsumer);
-
-}

+ 0 - 11
src/main/java/me/lortseam/completeconfig/entry/GuiProviderPredicate.java

@@ -1,11 +0,0 @@
-package me.lortseam.completeconfig.entry;
-
-import java.lang.reflect.Field;
-
-@FunctionalInterface
-public interface GuiProviderPredicate<T> {
-
-    //TODO: Also provide object of field (T)
-    boolean test(Field field, Class<T> type, Extras<T> extras);
-
-}

+ 14 - 0
src/main/java/me/lortseam/completeconfig/gui/GuiProvider.java

@@ -0,0 +1,14 @@
+package me.lortseam.completeconfig.gui;
+
+import me.lortseam.completeconfig.entry.Extras;
+import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
+
+import java.lang.reflect.Field;
+import java.util.function.Consumer;
+
+@FunctionalInterface
+public interface GuiProvider<T> {
+
+    AbstractConfigListEntry<T> build(String translationKey, Field field, T value, T defaultValue, Extras<T> extras, Consumer<T> saveConsumer);
+
+}

+ 18 - 0
src/main/java/me/lortseam/completeconfig/gui/GuiProviderPredicate.java

@@ -0,0 +1,18 @@
+package me.lortseam.completeconfig.gui;
+
+import me.lortseam.completeconfig.entry.Extras;
+
+import java.lang.reflect.Field;
+import java.util.Objects;
+
+@FunctionalInterface
+public interface GuiProviderPredicate<T> {
+
+    boolean test(Field field, Extras<T> extras);
+
+    default GuiProviderPredicate<T> and(GuiProviderPredicate<T> other) {
+        Objects.requireNonNull(other);
+        return (field, extras) -> this.test(field, extras) && other.test(field, extras);
+    }
+
+}

+ 45 - 30
src/main/java/me/lortseam/completeconfig/entry/GuiRegistry.java → src/main/java/me/lortseam/completeconfig/gui/GuiRegistry.java

@@ -1,9 +1,10 @@
-package me.lortseam.completeconfig.entry;
+package me.lortseam.completeconfig.gui;
 
 import com.google.common.base.CaseFormat;
-import me.lortseam.completeconfig.api.ConfigEntry;
+import me.lortseam.completeconfig.entry.Entry;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import net.minecraft.client.resource.language.I18n;
+import org.apache.commons.lang3.ArrayUtils;
 
 import java.lang.reflect.Field;
 import java.util.LinkedHashMap;
@@ -17,100 +18,114 @@ public class GuiRegistry {
         registerDefaultProviders();
     }
 
-    public void registerProvider(GuiProviderPredicate predicate, GuiProvider provider) {
-        guiProviders.put(predicate, provider);
+    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);
     }
 
-    public <T> void registerTypeProvider(Class<T> type, GuiProvider<T> provider) {
-        registerProvider((field, fieldType, extras) -> fieldType == type, provider);
+    public void registerProvider(GuiProvider<?> provider, Class... types) {
+        if (types.length == 0) {
+            throw new IllegalArgumentException("Types must not be empty");
+        }
+        registerProvider(provider, (field, extras) -> true, types);
     }
 
-    public <T> void registerBoundedTypeProvider(Class<T> type, GuiProvider<T> provider) {
-        registerProvider((field, fieldType, extras) -> fieldType == type && extras.getBounds() != null, provider);
+    public void registerBoundedProvider(GuiProvider<?> provider, Class... types) {
+        registerProvider(provider, (field, extras) -> extras.getBounds() != null, types);
     }
 
     private void registerDefaultProviders() {
-        registerTypeProvider(Boolean.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<Boolean>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startBooleanToggle(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                boolean.class, Boolean.class
         );
-        registerTypeProvider(Integer.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<Integer>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startIntField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                int.class, Integer.class
         );
-        registerBoundedTypeProvider(Integer.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerBoundedProvider((GuiProvider<Integer>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startIntSlider(translationKey, value, extras.getBounds().getMin(), extras.getBounds().getMax())
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                int.class, Integer.class
         );
-        registerTypeProvider(Long.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<Long>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startLongField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                long.class, Long.class
         );
-        registerBoundedTypeProvider(Long.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerBoundedProvider((GuiProvider<Long>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startLongSlider(translationKey, value, extras.getBounds().getMin(), extras.getBounds().getMax())
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                long.class, Long.class
         );
-        registerTypeProvider(Float.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<Float>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startFloatField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                float.class, Float.class
         );
-        registerBoundedTypeProvider(Float.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerBoundedProvider((GuiProvider<Float>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startFloatField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setMin(extras.getBounds().getMin())
                 .setMax(extras.getBounds().getMax())
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                float.class, Float.class
         );
-        registerTypeProvider(Double.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<Double>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startDoubleField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                double.class, Double.class
         );
-        registerBoundedTypeProvider(Double.TYPE, (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerBoundedProvider((GuiProvider<Double>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
                 .startDoubleField(translationKey, value)
                 .setDefaultValue(defaultValue)
                 .setMin(extras.getBounds().getMin())
                 .setMax(extras.getBounds().getMax())
                 .setSaveConsumer(saveConsumer)
-                .build()
+                .build(),
+                double.class, Double.class
         );
-        registerProvider((field, type, extras) -> Enum.class.isAssignableFrom(type), (GuiProvider<? extends Enum>) (translationKey, type, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
+        registerProvider((GuiProvider<? extends Enum>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
                 .create()
-                .startEnumSelector(translationKey, type, value)
+                .startEnumSelector(translationKey, (Class<Enum>) field.getType(), value)
                 .setDefaultValue(defaultValue)
                 .setEnumNameProvider(e -> I18n.translate(translationKey + "." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, e.name())))
                 .setSaveConsumer(saveConsumer)
-                .build());
+                .build(),
+                (field, extras) -> Enum.class.isAssignableFrom(field.getType())
+        );
     }
 
     public <T> GuiProvider<T> getProvider(Entry<T> entry) {
         GuiProvider<T> guiProvider = null;
         for (Map.Entry<GuiProviderPredicate, GuiProvider> mapEntry : guiProviders.entrySet()) {
             Field field = entry.getField();
-            if (mapEntry.getKey().test(field, field.getType(), entry.getExtras())) {
+            if (mapEntry.getKey().test(field, entry.getExtras())) {
                 guiProvider = mapEntry.getValue();
             }
         }