ClothConfigScreenBuilder.java 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778
  1. package me.lortseam.completeconfig.gui.cloth;
  2. import me.lortseam.completeconfig.data.Collection;
  3. import me.lortseam.completeconfig.data.Config;
  4. import me.lortseam.completeconfig.data.Entry;
  5. import me.lortseam.completeconfig.data.text.TranslationIdentifier;
  6. import me.lortseam.completeconfig.gui.ConfigScreenBuilder;
  7. import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
  8. import me.shedaniel.clothconfig2.api.ConfigBuilder;
  9. import me.shedaniel.clothconfig2.api.ConfigCategory;
  10. import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
  11. import me.shedaniel.clothconfig2.impl.builders.SubCategoryBuilder;
  12. import net.fabricmc.api.EnvType;
  13. import net.fabricmc.api.Environment;
  14. import net.fabricmc.loader.api.FabricLoader;
  15. import net.minecraft.client.gui.screen.Screen;
  16. import net.minecraft.text.TranslatableText;
  17. import java.util.ArrayList;
  18. import java.util.List;
  19. import java.util.function.Supplier;
  20. @Environment(EnvType.CLIENT)
  21. public class ClothConfigScreenBuilder implements ConfigScreenBuilder {
  22. private final Supplier<ConfigBuilder> supplier;
  23. private final GuiRegistry registry = new GuiRegistry();
  24. public ClothConfigScreenBuilder(Supplier<ConfigBuilder> supplier) {
  25. this.supplier = supplier;
  26. }
  27. public ClothConfigScreenBuilder() {
  28. this(ConfigBuilder::create);
  29. }
  30. @Override
  31. public Screen build(Screen parentScreen, Config config) {
  32. ConfigBuilder builder = supplier.get()
  33. .setParentScreen(parentScreen)
  34. .setSavingRunnable(config::save);
  35. TranslationIdentifier customTitle = config.getTranslation().append("title");
  36. builder.setTitle(customTitle.exists() ? customTitle.toText() : new TranslatableText("completeconfig.gui.defaultTitle", FabricLoader.getInstance().getModContainer(config.getModID()).get().getMetadata().getName()));
  37. if (!config.getEntries().isEmpty()) {
  38. ConfigCategory category = builder.getOrCreateCategory(config.getText());
  39. for (Entry<?> entry : config.getEntries()) {
  40. category.addEntry(buildEntry(entry));
  41. }
  42. }
  43. for(Collection collection : config.getCollections()) {
  44. ConfigCategory category = builder.getOrCreateCategory(collection.getText());
  45. for (AbstractConfigListEntry<?> entry : buildCollection(collection)) {
  46. category.addEntry(entry);
  47. }
  48. }
  49. return builder.build();
  50. }
  51. private AbstractConfigListEntry<?> buildEntry(Entry<?> entry) {
  52. return registry.getProvider(entry).orElseThrow(() -> {
  53. return new UnsupportedOperationException("Could not find GUI provider for field " + entry.getField());
  54. }).build(entry);
  55. }
  56. private List<AbstractConfigListEntry> buildCollection(Collection collection) {
  57. List<AbstractConfigListEntry> collectionGui = new ArrayList<>();
  58. for (Entry<?> entry : collection.getEntries()) {
  59. collectionGui.add(buildEntry(entry));
  60. }
  61. for (Collection c : collection.getCollections()) {
  62. SubCategoryBuilder subBuilder = ConfigEntryBuilder.create().startSubCategory(c.getText());
  63. subBuilder.addAll(buildCollection(c));
  64. collectionGui.add(subBuilder.build());
  65. }
  66. return collectionGui;
  67. }
  68. }