소스 검색

Custom config entry ID + refactor

Lortseam 4 년 전
부모
커밋
41acd20dff
20개의 변경된 파일76개의 추가작업 그리고 59개의 파일을 삭제
  1. 1 1
      src/main/java/me/lortseam/completeconfig/Config.java
  2. 9 2
      src/main/java/me/lortseam/completeconfig/api/ConfigEntry.java
  3. 1 1
      src/main/java/me/lortseam/completeconfig/data/Bounds.java
  4. 3 2
      src/main/java/me/lortseam/completeconfig/data/Collection.java
  5. 1 1
      src/main/java/me/lortseam/completeconfig/data/CollectionMap.java
  6. 24 18
      src/main/java/me/lortseam/completeconfig/data/Entry.java
  7. 13 11
      src/main/java/me/lortseam/completeconfig/data/EntryMap.java
  8. 7 6
      src/main/java/me/lortseam/completeconfig/data/EnumOptions.java
  9. 1 1
      src/main/java/me/lortseam/completeconfig/data/Extras.java
  10. 1 1
      src/main/java/me/lortseam/completeconfig/gui/cloth/ClothGuiBuilder.java
  11. 1 1
      src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProvider.java
  12. 1 1
      src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderPredicate.java
  13. 1 1
      src/main/java/me/lortseam/completeconfig/gui/cloth/GuiProviderRegistration.java
  14. 2 2
      src/main/java/me/lortseam/completeconfig/gui/cloth/GuiRegistry.java
  15. 3 3
      src/main/java/me/lortseam/completeconfig/serialization/CollectionDeserializer.java
  16. 2 2
      src/main/java/me/lortseam/completeconfig/serialization/CollectionMapDeserializer.java
  17. 1 1
      src/main/java/me/lortseam/completeconfig/serialization/CollectionSerializer.java
  18. 1 1
      src/main/java/me/lortseam/completeconfig/serialization/EntryDeserializer.java
  19. 2 2
      src/main/java/me/lortseam/completeconfig/serialization/EntryMapDeserializer.java
  20. 1 1
      src/main/java/me/lortseam/completeconfig/serialization/EntrySerializer.java

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

@@ -4,7 +4,7 @@ import com.google.gson.GsonBuilder;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonSyntaxException;
 import me.lortseam.completeconfig.api.ConfigCategory;
-import me.lortseam.completeconfig.collection.CollectionMap;
+import me.lortseam.completeconfig.data.CollectionMap;
 import me.lortseam.completeconfig.serialization.CollectionMapDeserializer;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;

+ 9 - 2
src/main/java/me/lortseam/completeconfig/api/ConfigEntry.java

@@ -2,7 +2,7 @@ package me.lortseam.completeconfig.api;
 
 import lombok.AccessLevel;
 import lombok.NoArgsConstructor;
-import me.lortseam.completeconfig.entry.EnumOptions.DisplayType;
+import me.lortseam.completeconfig.data.EnumOptions.DisplayType;
 
 import java.lang.annotation.ElementType;
 import java.lang.annotation.Retention;
@@ -20,6 +20,13 @@ import java.lang.annotation.Target;
 @Retention(RetentionPolicy.RUNTIME)
 public @interface ConfigEntry {
 
+    /**
+     * Specifies the ID of this entry. If empty, the field name will be used by default.
+     *
+     * @return the ID
+     */
+    String value() default "";
+
     /**
      * Specifies a custom translation key for this entry. If empty, the default key will be used.
      *
@@ -177,7 +184,7 @@ public @interface ConfigEntry {
          */
         DisplayType displayType() default DisplayType.BUTTON;
 
-        //TODO: Add gui suggestionMode option
+        //TODO: Add boolean suggestionMode for DisplayType.DROPDOWN
 
     }
 

+ 1 - 1
src/main/java/me/lortseam/completeconfig/entry/Bounds.java → src/main/java/me/lortseam/completeconfig/data/Bounds.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.entry;
+package me.lortseam.completeconfig.data;
 
 import lombok.AccessLevel;
 import lombok.Getter;

+ 3 - 2
src/main/java/me/lortseam/completeconfig/collection/Collection.java → src/main/java/me/lortseam/completeconfig/data/Collection.java

@@ -1,5 +1,6 @@
-package me.lortseam.completeconfig.collection;
+package me.lortseam.completeconfig.data;
 
+import lombok.AccessLevel;
 import lombok.Getter;
 import me.lortseam.completeconfig.api.ConfigCategory;
 import me.lortseam.completeconfig.api.ConfigEntryContainer;
@@ -15,7 +16,7 @@ import java.util.stream.Collectors;
 
 public class Collection {
 
-    @Getter
+    @Getter(AccessLevel.PACKAGE)
     private final String translationKey;
     @Getter
     private final EntryMap entries;

+ 1 - 1
src/main/java/me/lortseam/completeconfig/collection/CollectionMap.java → src/main/java/me/lortseam/completeconfig/data/CollectionMap.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.collection;
+package me.lortseam.completeconfig.data;
 
 import me.lortseam.completeconfig.ConfigMap;
 import me.lortseam.completeconfig.api.ConfigCategory;

+ 24 - 18
src/main/java/me/lortseam/completeconfig/entry/Entry.java → src/main/java/me/lortseam/completeconfig/data/Entry.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.entry;
+package me.lortseam.completeconfig.data;
 
 import com.google.common.collect.MoreCollectors;
 import lombok.AccessLevel;
@@ -6,7 +6,6 @@ import lombok.AllArgsConstructor;
 import lombok.Getter;
 import lombok.Setter;
 import me.lortseam.completeconfig.api.ConfigEntryContainer;
-import me.lortseam.completeconfig.collection.Collection;
 import net.minecraft.client.resource.language.I18n;
 import net.minecraft.text.Text;
 import net.minecraft.text.TranslatableText;
@@ -24,7 +23,7 @@ public class Entry<T> {
     private static final Logger LOGGER = LogManager.getLogger();
     private static final Set<Entry> ENTRIES = new HashSet<>();
 
-    public static Entry<?> of(Collection parent, String fieldName, Class<? extends ConfigEntryContainer> parentClass) {
+    static Entry<?> of(Collection parent, String fieldName, Class<? extends ConfigEntryContainer> parentClass) {
         try {
             Field field = parentClass.getDeclaredField(fieldName);
             if (!field.isAccessible()) {
@@ -44,34 +43,37 @@ public class Entry<T> {
         });
     }
 
-    public static <T> Entry<T> of(Collection parent, Field field, ConfigEntryContainer parentObject) {
+    static <T> Entry<T> of(Collection parent, Field field, ConfigEntryContainer parentObject) {
         Entry<T> entry = of(parent, field);
         entry.parentObject = parentObject;
         entry.defaultValue = entry.getValue();
         return entry;
     }
 
+    @Getter(AccessLevel.PACKAGE)
+    private final Collection parent;
     @Getter
     private final Field field;
+    @Setter(AccessLevel.PACKAGE)
+    private String customID;
     @Getter
     private final Class<T> type;
-    @Getter
     private ConfigEntryContainer parentObject;
     @Getter
     private T defaultValue;
-    @Getter(AccessLevel.PACKAGE)
-    private String translationKey;
+    @Setter(AccessLevel.PACKAGE)
+    private String customTranslationKey;
     private String[] tooltipTranslationKeys;
     @Getter
     private final Extras<T> extras = new Extras<>(this);
     private final List<Listener> listeners = new ArrayList<>();
-    @Setter
+    @Setter(AccessLevel.PACKAGE)
     private boolean forceUpdate;
-    @Setter
+    @Setter(AccessLevel.PACKAGE)
     private boolean requiresRestart;
 
     private Entry(Collection parent, Field field, Class<T> type) {
-        translationKey = parent.getTranslationKey() + "." + field.getName();
+        this.parent = parent;
         this.field = field;
         this.type = type;
     }
@@ -133,25 +135,29 @@ public class Entry<T> {
         }
     }
 
-    public void addListener(Method method, ConfigEntryContainer parentObject) {
+    void addListener(Method method, ConfigEntryContainer parentObject) {
         listeners.add(new Listener(method, parentObject));
     }
 
-    public void setCustomTranslationKey(String translationKey) {
-        this.translationKey = translationKey;
+    String getID() {
+        return customID != null ? customID : field.getName();
+    }
+
+    String getTranslationKey() {
+        return customTranslationKey != null ? customTranslationKey : parent.getTranslationKey() + "." + getID();
     }
 
     public Text getText() {
-        return new TranslatableText(translationKey);
+        return new TranslatableText(getTranslationKey());
     }
 
-    public void setCustomTooltipTranslationKeys(String[] tooltipTranslationKeys) {
+    void setCustomTooltipTranslationKeys(String[] tooltipTranslationKeys) {
         this.tooltipTranslationKeys = tooltipTranslationKeys;
     }
 
     public Optional<Text[]> getTooltip() {
         if (tooltipTranslationKeys == null) {
-            String defaultTooltipTranslationKey = translationKey + ".tooltip";
+            String defaultTooltipTranslationKey = getTranslationKey() + ".tooltip";
             if (I18n.hasTranslation(defaultTooltipTranslationKey)) {
                 tooltipTranslationKeys = new String[] {defaultTooltipTranslationKey};
             } else {
@@ -172,11 +178,11 @@ public class Entry<T> {
         return tooltipTranslationKeys != null ? Optional.of(Arrays.stream(tooltipTranslationKeys).map(TranslatableText::new).toArray(Text[]::new)) : Optional.empty();
     }
 
-    public <N extends Number> void setBounds(N min, N max, boolean slider) {
+    <N extends Number> void setBounds(N min, N max, boolean slider) {
         extras.setBounds(min, max, slider);
     }
 
-    public void setEnumOptions(EnumOptions.DisplayType displayType) {
+    void setEnumOptions(EnumOptions.DisplayType displayType) {
         extras.setEnumOptions(displayType);
     }
 

+ 13 - 11
src/main/java/me/lortseam/completeconfig/collection/EntryMap.java → src/main/java/me/lortseam/completeconfig/data/EntryMap.java

@@ -1,12 +1,10 @@
-package me.lortseam.completeconfig.collection;
+package me.lortseam.completeconfig.data;
 
 import com.google.common.base.CaseFormat;
 import me.lortseam.completeconfig.ConfigMap;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import me.lortseam.completeconfig.api.ConfigEntryContainer;
 import me.lortseam.completeconfig.api.ConfigEntryListener;
-import me.lortseam.completeconfig.entry.Entry;
-import me.lortseam.completeconfig.entry.EnumOptions;
 import me.lortseam.completeconfig.exception.IllegalAnnotationParameterException;
 import me.lortseam.completeconfig.exception.IllegalAnnotationTargetException;
 import me.lortseam.completeconfig.exception.IllegalModifierException;
@@ -14,8 +12,10 @@ import me.lortseam.completeconfig.exception.IllegalReturnTypeException;
 import org.apache.commons.lang3.StringUtils;
 
 import java.lang.reflect.Modifier;
+import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.stream.Collectors;
 
 public class EntryMap extends ConfigMap<Entry> {
 
@@ -24,7 +24,7 @@ public class EntryMap extends ConfigMap<Entry> {
     }
 
     void fill(Collection parent, ConfigEntryContainer container) {
-        LinkedHashMap<String, Entry> containerEntries = new LinkedHashMap<>();
+        List<Entry> containerEntries = new ArrayList<>();
         for (Class<? extends ConfigEntryContainer> clazz : container.getConfigClasses()) {
             Arrays.stream(clazz.getDeclaredMethods()).filter(method -> !Modifier.isStatic(method.getModifiers()) && method.isAnnotationPresent(ConfigEntryListener.class)).forEach(method -> {
                 ConfigEntryListener listener = method.getDeclaredAnnotation(ConfigEntryListener.class);
@@ -54,7 +54,7 @@ public class EntryMap extends ConfigMap<Entry> {
                 }
                 entry.addListener(method, container);
             });
-            LinkedHashMap<String, Entry> clazzEntries = new LinkedHashMap<>();
+            List<Entry> clazzEntries = new ArrayList<>();
             Arrays.stream(clazz.getDeclaredFields()).filter(field -> {
                 if (Modifier.isStatic(field.getModifiers())) {
                     return false;
@@ -73,6 +73,10 @@ public class EntryMap extends ConfigMap<Entry> {
                 Entry<?> entry = Entry.of(parent, field, container);
                 if (field.isAnnotationPresent(ConfigEntry.class)) {
                     ConfigEntry entryAnnotation = field.getDeclaredAnnotation(ConfigEntry.class);
+                    String id = entryAnnotation.value();
+                    if (!StringUtils.isBlank(id)) {
+                        entry.setCustomID(id);
+                    }
                     String customTranslationKey = entryAnnotation.customTranslationKey();
                     if (!StringUtils.isBlank(customTranslationKey)) {
                         entry.setCustomTranslationKey(modTranslationKey + "."  + customTranslationKey);
@@ -126,13 +130,11 @@ public class EntryMap extends ConfigMap<Entry> {
                 } else if (field.isAnnotationPresent(ConfigEntry.EnumOptions.class)) {
                     throw new IllegalAnnotationTargetException("Cannot apply enum options to non enum field " + field);
                 }
-                clazzEntries.put(field.getName(), entry);
+                clazzEntries.add(entry);
             });
-            //TODO: Quite hacky solution to sort the entries (superclasses first)
-            clazzEntries.putAll(containerEntries);
-            containerEntries = clazzEntries;
+            containerEntries.addAll(0, clazzEntries);
         }
-        putAll(containerEntries);
+        putAll(containerEntries.stream().collect(Collectors.toMap(Entry::getID, entry -> entry)));
     }
 
 }

+ 7 - 6
src/main/java/me/lortseam/completeconfig/entry/EnumOptions.java → src/main/java/me/lortseam/completeconfig/data/EnumOptions.java

@@ -1,23 +1,24 @@
-package me.lortseam.completeconfig.entry;
+package me.lortseam.completeconfig.data;
 
 import com.google.common.base.CaseFormat;
+import lombok.AccessLevel;
 import lombok.Getter;
+import lombok.RequiredArgsConstructor;
 import me.lortseam.completeconfig.api.ConfigEntry;
 import net.minecraft.text.Text;
 import net.minecraft.text.TranslatableText;
 
 import java.util.function.Function;
 
+@RequiredArgsConstructor(access = AccessLevel.PACKAGE)
 public class EnumOptions {
 
+    private final Entry<?> parent;
     @Getter
     private final DisplayType displayType;
-    @Getter
-    private final Function<Enum, Text> nameProvider;
 
-    EnumOptions(Entry<?> entry, DisplayType displayType) {
-        this.displayType = displayType;
-        nameProvider = enumValue -> new TranslatableText(entry.getTranslationKey() + "." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, enumValue.name()));
+    public Function<Enum, Text> getNameProvider() {
+        return enumValue -> new TranslatableText(parent.getTranslationKey() + "." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, enumValue.name()));
     }
 
     public enum DisplayType {

+ 1 - 1
src/main/java/me/lortseam/completeconfig/entry/Extras.java → src/main/java/me/lortseam/completeconfig/data/Extras.java

@@ -1,4 +1,4 @@
-package me.lortseam.completeconfig.entry;
+package me.lortseam.completeconfig.data;
 
 import lombok.AccessLevel;
 import lombok.Getter;

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

@@ -2,7 +2,7 @@ package me.lortseam.completeconfig.gui.cloth;
 
 import lombok.Getter;
 import me.lortseam.completeconfig.Config;
-import me.lortseam.completeconfig.collection.Collection;
+import me.lortseam.completeconfig.data.Collection;
 import me.lortseam.completeconfig.gui.GuiBuilder;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.ConfigBuilder;

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

@@ -1,6 +1,6 @@
 package me.lortseam.completeconfig.gui.cloth;
 
-import me.lortseam.completeconfig.entry.Extras;
+import me.lortseam.completeconfig.data.Extras;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;

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

@@ -1,6 +1,6 @@
 package me.lortseam.completeconfig.gui.cloth;
 
-import me.lortseam.completeconfig.entry.Extras;
+import me.lortseam.completeconfig.data.Extras;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 

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

@@ -3,7 +3,7 @@ package me.lortseam.completeconfig.gui.cloth;
 import lombok.AccessLevel;
 import lombok.Getter;
 import lombok.RequiredArgsConstructor;
-import me.lortseam.completeconfig.entry.Entry;
+import me.lortseam.completeconfig.data.Entry;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 

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

@@ -2,8 +2,8 @@ package me.lortseam.completeconfig.gui.cloth;
 
 import com.google.common.collect.Lists;
 import com.google.common.collect.MoreCollectors;
-import me.lortseam.completeconfig.entry.Entry;
-import me.lortseam.completeconfig.entry.EnumOptions;
+import me.lortseam.completeconfig.data.Entry;
+import me.lortseam.completeconfig.data.EnumOptions;
 import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;

+ 3 - 3
src/main/java/me/lortseam/completeconfig/serialization/CollectionDeserializer.java

@@ -2,9 +2,9 @@ package me.lortseam.completeconfig.serialization;
 
 import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
-import me.lortseam.completeconfig.collection.Collection;
-import me.lortseam.completeconfig.collection.CollectionMap;
-import me.lortseam.completeconfig.collection.EntryMap;
+import me.lortseam.completeconfig.data.Collection;
+import me.lortseam.completeconfig.data.CollectionMap;
+import me.lortseam.completeconfig.data.EntryMap;
 
 import java.lang.reflect.Type;
 import java.util.Map;

+ 2 - 2
src/main/java/me/lortseam/completeconfig/serialization/CollectionMapDeserializer.java

@@ -2,8 +2,8 @@ package me.lortseam.completeconfig.serialization;
 
 import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
-import me.lortseam.completeconfig.collection.Collection;
-import me.lortseam.completeconfig.collection.CollectionMap;
+import me.lortseam.completeconfig.data.Collection;
+import me.lortseam.completeconfig.data.CollectionMap;
 
 import java.lang.reflect.Type;
 import java.util.LinkedHashMap;

+ 1 - 1
src/main/java/me/lortseam/completeconfig/serialization/CollectionSerializer.java

@@ -2,7 +2,7 @@ package me.lortseam.completeconfig.serialization;
 
 import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
-import me.lortseam.completeconfig.collection.Collection;
+import me.lortseam.completeconfig.data.Collection;
 
 import java.lang.reflect.Type;
 

+ 1 - 1
src/main/java/me/lortseam/completeconfig/serialization/EntryDeserializer.java

@@ -5,7 +5,7 @@ import com.google.gson.JsonDeserializer;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonParseException;
 import com.google.gson.reflect.TypeToken;
-import me.lortseam.completeconfig.entry.Entry;
+import me.lortseam.completeconfig.data.Entry;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 

+ 2 - 2
src/main/java/me/lortseam/completeconfig/serialization/EntryMapDeserializer.java

@@ -3,8 +3,8 @@ package me.lortseam.completeconfig.serialization;
 import com.google.gson.*;
 import com.google.gson.reflect.TypeToken;
 import lombok.RequiredArgsConstructor;
-import me.lortseam.completeconfig.collection.EntryMap;
-import me.lortseam.completeconfig.entry.Entry;
+import me.lortseam.completeconfig.data.EntryMap;
+import me.lortseam.completeconfig.data.Entry;
 
 import java.lang.reflect.Type;
 import java.util.LinkedHashMap;

+ 1 - 1
src/main/java/me/lortseam/completeconfig/serialization/EntrySerializer.java

@@ -3,7 +3,7 @@ package me.lortseam.completeconfig.serialization;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonSerializationContext;
 import com.google.gson.JsonSerializer;
-import me.lortseam.completeconfig.entry.Entry;
+import me.lortseam.completeconfig.data.Entry;
 
 import java.lang.reflect.Type;