فهرست منبع

Support entries at config root

Lortseam 4 سال پیش
والد
کامیت
bf72b99a44

+ 8 - 5
src/main/java/me/lortseam/completeconfig/data/Collection.java

@@ -16,24 +16,23 @@ import java.util.stream.Collectors;
 
 public class Collection implements FlatDataPart<ConfigMap> {
 
-    private final TranslationIdentifier translation;
+    protected final TranslationIdentifier translation;
     @Getter
     private final EntryMap entries;
     @Getter
     private final CollectionMap collections;
 
-    Collection(TranslationIdentifier parentTranslation, ConfigGroup group) {
-        translation = parentTranslation.append(group.getGroupID());
+    Collection(TranslationIdentifier translation) {
+        this.translation = translation;
         entries = new EntryMap(translation);
         collections = new CollectionMap(translation);
-        resolve(group);
     }
 
     public Text getText() {
         return translation.toText();
     }
 
-    private void resolve(ConfigEntryContainer container) {
+    void resolve(ConfigEntryContainer container) {
         entries.resolve(container);
         List<ConfigEntryContainer> containers = new ArrayList<>();
         for (Class<? extends ConfigEntryContainer> clazz : container.getConfigClasses()) {
@@ -63,6 +62,10 @@ public class Collection implements FlatDataPart<ConfigMap> {
             }).collect(Collectors.toList()));
         }
         containers.addAll(Arrays.asList(container.getTransitiveContainers()));
+        resolve(containers);
+    }
+
+    protected void resolve(java.util.Collection<ConfigEntryContainer> containers) {
         for (ConfigEntryContainer c : containers) {
             if (c instanceof ConfigGroup) {
                 collections.resolve((ConfigGroup) c);

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

@@ -13,7 +13,8 @@ public class CollectionMap extends ConfigMap<Collection> {
 
     void resolve(ConfigGroup group) {
         String groupID = group.getGroupID();
-        Collection collection = new Collection(translation, group);
+        Collection collection = new Collection(translation.append(groupID));
+        collection.resolve(group);
         if (collection.getEntries().isEmpty() && collection.getCollections().isEmpty()) {
             logger.warn("[CompleteConfig] Group " + groupID + " is empty!");
             return;

+ 18 - 16
src/main/java/me/lortseam/completeconfig/data/Config.java

@@ -3,7 +3,7 @@ package me.lortseam.completeconfig.data;
 import lombok.NonNull;
 import lombok.extern.log4j.Log4j2;
 import me.lortseam.completeconfig.ConfigHandler;
-import me.lortseam.completeconfig.api.ConfigGroup;
+import me.lortseam.completeconfig.api.ConfigEntryContainer;
 import me.lortseam.completeconfig.data.text.TranslationIdentifier;
 import me.lortseam.completeconfig.gui.GuiBuilder;
 import me.lortseam.completeconfig.io.ConfigSource;
@@ -11,12 +11,11 @@ import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
 import net.fabricmc.loader.api.FabricLoader;
 
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.List;
+import java.util.LinkedHashSet;
 import java.util.Objects;
 
-public class Config extends CollectionMap {
+public class Config extends Collection {
 
     /**
      * Creates a new config builder for the specified mod.
@@ -32,12 +31,10 @@ public class Config extends CollectionMap {
 
     private final ConfigSource source;
 
-    private Config(ConfigSource source, List<ConfigGroup> topLevelGroups) {
+    private Config(ConfigSource source, LinkedHashSet<ConfigEntryContainer> children) {
         super(new TranslationIdentifier(source.getModID()));
         this.source = source;
-        for (ConfigGroup group : topLevelGroups) {
-            resolve(group);
-        }
+        resolve(children);
     }
 
     public String getModID() {
@@ -61,7 +58,7 @@ public class Config extends CollectionMap {
 
         private final String modID;
         private String[] branch = new String[0];
-        private final List<ConfigGroup> topLevelGroups = new ArrayList<>();
+        private final LinkedHashSet<ConfigEntryContainer> children = new LinkedHashSet<>();
         private GuiBuilder guiBuilder;
 
         private Builder(String modID) {
@@ -83,14 +80,18 @@ public class Config extends CollectionMap {
         }
 
         /**
-         * Adds one or more top-level groups to the config.
+         * Adds one or more entry containers to the config.
          *
-         * @param groups one or more top-level groups
+         * @param containers one or more entry containers
          * @return this builder
          */
-        public Builder add(ConfigGroup... groups) {
-            Arrays.stream(groups).forEach(Objects::requireNonNull);
-            topLevelGroups.addAll(Arrays.asList(groups));
+        public Builder add(ConfigEntryContainer... containers) {
+            Arrays.stream(containers).forEach(Objects::requireNonNull);
+            for (ConfigEntryContainer container : containers) {
+                if (!children.add(container)) {
+                    throw new IllegalArgumentException("Duplicate container");
+                }
+            }
             return this;
         }
 
@@ -112,11 +113,12 @@ public class Config extends CollectionMap {
          * @return the handler associated with the created config
          */
         public ConfigHandler build() {
-            if (topLevelGroups.isEmpty()) {
+            if (children.isEmpty()) {
                 logger.warn("[CompleteConfig] Mod " + modID + " tried to create an empty config!");
                 return null;
             }
-            return new ConfigHandler(new Config(new ConfigSource(modID, branch), topLevelGroups), guiBuilder);
+
+            return new ConfigHandler(new Config(new ConfigSource(modID, branch), children), guiBuilder);
         }
 
     }

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

@@ -40,7 +40,13 @@ public class ClothGuiBuilder implements GuiBuilder {
                 .setSavingRunnable(savingRunnable);
         TranslationIdentifier customTitle = config.getTranslation().append("title");
         builder.setTitle(customTitle.exists() ? customTitle.toText() : new TranslatableText("completeconfig.gui.defaultTitle", FabricLoader.getInstance().getModContainer(config.getModID()).get().getMetadata().getName()));
-        for(Collection collection : config.values()) {
+        if (!config.getEntries().isEmpty()) {
+            ConfigCategory category = builder.getOrCreateCategory(config.getText());
+            for (Entry<?> entry : config.getEntries().values()) {
+                category.addEntry(buildEntry(entry));
+            }
+        }
+        for(Collection collection : config.getCollections().values()) {
             ConfigCategory category = builder.getOrCreateCategory(collection.getText());
             for (AbstractConfigListEntry<?> entry : buildCollection(collection)) {
                 category.addEntry(entry);
@@ -49,12 +55,16 @@ public class ClothGuiBuilder implements GuiBuilder {
         return builder.build();
     }
 
+    private AbstractConfigListEntry<?> buildEntry(Entry<?> entry) {
+        return GuiRegistry.getInstance().getProvider(entry).orElseThrow(() -> {
+            return new UnsupportedOperationException("Could not find GUI provider for field " + entry.getField());
+        }).build(entry);
+    }
+
     private List<AbstractConfigListEntry> buildCollection(Collection collection) {
         List<AbstractConfigListEntry> collectionGui = new ArrayList<>();
-        for (Entry entry : collection.getEntries().values()) {
-            collectionGui.add((GuiRegistry.getInstance().getProvider(entry)).orElseThrow(() -> {
-                return new UnsupportedOperationException("Could not find GUI provider for field " + entry.getField());
-            }).build(entry));
+        for (Entry<?> entry : collection.getEntries().values()) {
+            collectionGui.add(buildEntry(entry));
         }
         for (Collection c : collection.getCollections().values()) {
             SubCategoryBuilder subBuilder = ConfigEntryBuilder.create().startSubCategory(c.getText());

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

@@ -261,9 +261,9 @@ public final class GuiRegistry {
        ), false, TextColor.class);
     }
 
-    <E extends Entry<?>> Optional<GuiProvider<E>> getProvider(E entry) {
+    Optional<GuiProvider<Entry<?>>> getProvider(Entry<?> entry) {
         return registrations.stream().filter(registration -> registration.test(entry)).findFirst().map(registration -> {
-            return (GuiProvider<E>) registration.getProvider();
+            return (GuiProvider<Entry<?>>) registration.getProvider();
         });
     }