Răsfoiți Sursa

Add static config screen builder

Lortseam 4 ani în urmă
părinte
comite
d8f253c784

+ 14 - 1
lib/src/main/java/me/lortseam/completeconfig/gui/ConfigScreenBuilder.java

@@ -1,8 +1,10 @@
 package me.lortseam.completeconfig.gui;
 
 import me.lortseam.completeconfig.data.Config;
+import me.lortseam.completeconfig.gui.cloth.ClothConfigScreenBuilder;
 import net.fabricmc.api.EnvType;
 import net.fabricmc.api.Environment;
+import net.fabricmc.loader.api.FabricLoader;
 import net.minecraft.client.gui.screen.Screen;
 
 import java.util.HashMap;
@@ -11,6 +13,7 @@ import java.util.Optional;
 
 public abstract class ConfigScreenBuilder {
 
+    private static final ConfigScreenBuilder fallback = FabricLoader.getInstance().isModLoaded("cloth-config2") ? new ClothConfigScreenBuilder() : null;
     private static final Map<String, ConfigScreenBuilder> mainBuilders = new HashMap<>();
 
     public static void setMain(String modID, ConfigScreenBuilder screenBuilder) {
@@ -18,7 +21,17 @@ public abstract class ConfigScreenBuilder {
     }
 
     public static Optional<ConfigScreenBuilder> getMain(String modID) {
-        return Optional.ofNullable(mainBuilders.get(modID));
+        if (mainBuilders.containsKey(modID)) {
+            return Optional.of(mainBuilders.get(modID));
+        }
+        if (fallback != null) {
+            return Optional.of(fallback);
+        }
+        return Optional.empty();
+    }
+
+    public static Optional<Screen> tryBuild(Screen parentScreen, Config config) {
+        return getMain(config.getMod().getId()).map(builder -> builder.build(parentScreen, config));
     }
 
     /**

+ 9 - 7
lib/src/main/java/me/lortseam/completeconfig/gui/ModMenuIntegration.java

@@ -1,22 +1,24 @@
 package me.lortseam.completeconfig.gui;
 
-import com.google.common.collect.Maps;
 import com.terraformersmc.modmenu.api.ConfigScreenFactory;
 import com.terraformersmc.modmenu.api.ModMenuApi;
 import me.lortseam.completeconfig.data.Config;
-import me.lortseam.completeconfig.gui.cloth.ClothConfigScreenBuilder;
 
+import java.util.HashMap;
 import java.util.Map;
+import java.util.Optional;
 
 public final class ModMenuIntegration implements ModMenuApi {
 
-    private final ConfigScreenBuilder defaultScreenBuilder = new ClothConfigScreenBuilder();
-
     @Override
     public Map<String, ConfigScreenFactory<?>> getProvidedConfigScreenFactories() {
-        return Maps.transformValues(Config.getMainConfigs(), config -> parentScreen -> {
-            return ConfigScreenBuilder.getMain(config.getMod().getId()).orElse(defaultScreenBuilder).build(parentScreen, config);
-        });
+        Map<String, ConfigScreenFactory<?>> factories = new HashMap<>();
+        for (Map.Entry<String, Config> entry : Config.getMainConfigs().entrySet()) {
+            Optional<ConfigScreenBuilder> builder = ConfigScreenBuilder.getMain(entry.getKey());
+            if (!builder.isPresent()) continue;
+            factories.put(entry.getKey(), parentScreen -> builder.get().build(parentScreen, entry.getValue()));
+        }
+        return factories;
     }
 
 }