GuiRegistry.java 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package me.lortseam.completeconfig.gui;
  2. import com.google.common.base.CaseFormat;
  3. import me.lortseam.completeconfig.entry.Entry;
  4. import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
  5. import net.minecraft.client.resource.language.I18n;
  6. import net.minecraft.text.TranslatableText;
  7. import org.apache.commons.lang3.ArrayUtils;
  8. import java.util.Iterator;
  9. import java.util.LinkedHashMap;
  10. import java.util.LinkedList;
  11. import java.util.Map;
  12. public class GuiRegistry {
  13. private final LinkedHashMap<GuiProviderPredicate, GuiProvider> guiProviders = new LinkedHashMap<>();
  14. public GuiRegistry() {
  15. registerDefaultProviders();
  16. }
  17. public <T> void registerProvider(GuiProvider<T> provider, GuiProviderPredicate<T> predicate, Class... types) {
  18. guiProviders.put(predicate.and((field, extras) -> types.length == 0 || ArrayUtils.contains(types, field.getType())), provider);
  19. }
  20. public void registerProvider(GuiProvider<?> provider, Class... types) {
  21. if (types.length == 0) {
  22. throw new IllegalArgumentException("Types must not be empty");
  23. }
  24. registerProvider(provider, (field, extras) -> true, types);
  25. }
  26. public void registerBoundedProvider(GuiProvider<?> provider, Class... types) {
  27. registerProvider(provider, (field, extras) -> extras.getBounds() != null, types);
  28. }
  29. private void registerDefaultProviders() {
  30. registerProvider((GuiProvider<Boolean>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  31. .create()
  32. .startBooleanToggle(new TranslatableText(translationKey), value)
  33. .setDefaultValue(defaultValue)
  34. .setSaveConsumer(saveConsumer)
  35. .build(),
  36. boolean.class, Boolean.class
  37. );
  38. registerProvider((GuiProvider<Integer>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  39. .create()
  40. .startIntField(new TranslatableText(translationKey), value)
  41. .setDefaultValue(defaultValue)
  42. .setSaveConsumer(saveConsumer)
  43. .build(),
  44. int.class, Integer.class
  45. );
  46. registerBoundedProvider((GuiProvider<Integer>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  47. .create()
  48. .startIntSlider(new TranslatableText(translationKey), value, extras.getBounds().getMin(), extras.getBounds().getMax())
  49. .setDefaultValue(defaultValue)
  50. .setSaveConsumer(saveConsumer)
  51. .build(),
  52. int.class, Integer.class
  53. );
  54. registerProvider((GuiProvider<Long>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  55. .create()
  56. .startLongField(new TranslatableText(translationKey), value)
  57. .setDefaultValue(defaultValue)
  58. .setSaveConsumer(saveConsumer)
  59. .build(),
  60. long.class, Long.class
  61. );
  62. registerBoundedProvider((GuiProvider<Long>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  63. .create()
  64. .startLongSlider(new TranslatableText(translationKey), value, extras.getBounds().getMin(), extras.getBounds().getMax())
  65. .setDefaultValue(defaultValue)
  66. .setSaveConsumer(saveConsumer)
  67. .build(),
  68. long.class, Long.class
  69. );
  70. registerProvider((GuiProvider<Float>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  71. .create()
  72. .startFloatField(new TranslatableText(translationKey), value)
  73. .setDefaultValue(defaultValue)
  74. .setSaveConsumer(saveConsumer)
  75. .build(),
  76. float.class, Float.class
  77. );
  78. registerBoundedProvider((GuiProvider<Float>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  79. .create()
  80. .startFloatField(new TranslatableText(translationKey), value)
  81. .setDefaultValue(defaultValue)
  82. .setMin(extras.getBounds().getMin())
  83. .setMax(extras.getBounds().getMax())
  84. .setSaveConsumer(saveConsumer)
  85. .build(),
  86. float.class, Float.class
  87. );
  88. registerProvider((GuiProvider<Double>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  89. .create()
  90. .startDoubleField(new TranslatableText(translationKey), value)
  91. .setDefaultValue(defaultValue)
  92. .setSaveConsumer(saveConsumer)
  93. .build(),
  94. double.class, Double.class
  95. );
  96. registerBoundedProvider((GuiProvider<Double>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  97. .create()
  98. .startDoubleField(new TranslatableText(translationKey), value)
  99. .setDefaultValue(defaultValue)
  100. .setMin(extras.getBounds().getMin())
  101. .setMax(extras.getBounds().getMax())
  102. .setSaveConsumer(saveConsumer)
  103. .build(),
  104. double.class, Double.class
  105. );
  106. registerProvider((GuiProvider<String>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  107. .create()
  108. .startStrField(new TranslatableText(translationKey), value)
  109. .setDefaultValue(defaultValue)
  110. .setSaveConsumer(saveConsumer)
  111. .build(),
  112. String.class
  113. );
  114. registerProvider((GuiProvider<? extends Enum>) (translationKey, field, value, defaultValue, extras, saveConsumer) -> ConfigEntryBuilder
  115. .create()
  116. .startEnumSelector(new TranslatableText(translationKey), (Class<Enum>) field.getType(), value)
  117. .setDefaultValue(defaultValue)
  118. .setEnumNameProvider(e -> new TranslatableText(translationKey + "." + CaseFormat.UPPER_UNDERSCORE.to(CaseFormat.LOWER_CAMEL, e.name())))
  119. .setSaveConsumer(saveConsumer)
  120. .build(),
  121. (field, extras) -> Enum.class.isAssignableFrom(field.getType())
  122. );
  123. }
  124. public <T> GuiProvider<T> getProvider(Entry<T> entry) {
  125. Iterator<Map.Entry<GuiProviderPredicate, GuiProvider>> iter = new LinkedList<>(guiProviders.entrySet()).descendingIterator();
  126. while (iter.hasNext()) {
  127. Map.Entry<GuiProviderPredicate, GuiProvider> mapEntry = iter.next();
  128. if (mapEntry.getKey().test(entry.getField(), entry.getExtras())) {
  129. return mapEntry.getValue();
  130. }
  131. }
  132. return null;
  133. }
  134. }