GuiRegistry.java 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273
  1. package me.lortseam.completeconfig.gui.cloth;
  2. import com.google.common.collect.Lists;
  3. import com.google.common.collect.MoreCollectors;
  4. import com.google.common.reflect.TypeToken;
  5. import me.lortseam.completeconfig.data.BoundedEntry;
  6. import me.lortseam.completeconfig.data.ColorEntry;
  7. import me.lortseam.completeconfig.data.Entry;
  8. import me.lortseam.completeconfig.data.EnumEntry;
  9. import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
  10. import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
  11. import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
  12. import me.shedaniel.clothconfig2.impl.builders.FieldBuilder;
  13. import net.fabricmc.api.EnvType;
  14. import net.fabricmc.api.Environment;
  15. import net.minecraft.text.TextColor;
  16. import org.apache.commons.lang3.ArrayUtils;
  17. import java.lang.reflect.Type;
  18. import java.util.ArrayList;
  19. import java.util.Arrays;
  20. import java.util.List;
  21. import java.util.Optional;
  22. import java.util.function.Consumer;
  23. import java.util.function.Function;
  24. import java.util.function.Predicate;
  25. @Environment(EnvType.CLIENT)
  26. public final class GuiRegistry {
  27. private static final List<Consumer<GuiRegistry>> globalProviders = Lists.newArrayList(GuiRegistry::registerDefaultProviders);
  28. public static void addGlobalProviders(Consumer<GuiRegistry> registrations) {
  29. globalProviders.add(registrations);
  30. }
  31. public static <T, A extends AbstractConfigListEntry> A build(Function<ConfigEntryBuilder, FieldBuilder<T, A>> builder, boolean requiresRestart) {
  32. FieldBuilder<T, A> fieldBuilder = builder.apply(ConfigEntryBuilder.create());
  33. fieldBuilder.requireRestart(requiresRestart);
  34. return fieldBuilder.build();
  35. }
  36. private final List<GuiProviderRegistration> registrations = new ArrayList<>();
  37. GuiRegistry() {
  38. for (Consumer<GuiRegistry> registrations : globalProviders) {
  39. registrations.accept(this);
  40. }
  41. }
  42. public void registerProvider(GuiProvider<?> provider, Predicate<Entry<?>> predicate, Type... types) {
  43. registrations.add(0, new GuiProviderRegistration(predicate.and(entry -> {
  44. if (types.length == 0) {
  45. return true;
  46. }
  47. return ArrayUtils.contains(types, entry.getType());
  48. }), provider));
  49. }
  50. public void registerProvider(GuiProvider<?> provider, Type... types) {
  51. if (types.length == 0) {
  52. throw new IllegalArgumentException("Types must not be empty");
  53. }
  54. registerProvider(provider, entry -> true, types);
  55. }
  56. public void registerBoundedProvider(GuiProvider<? extends BoundedEntry<?>> provider, boolean slider, Type... types) {
  57. registerProvider(provider, entry -> entry instanceof BoundedEntry && ((BoundedEntry<?>) entry).isSlider() == slider, types);
  58. }
  59. public void registerEnumProvider(GuiProvider<? extends EnumEntry<?>> provider, EnumEntry.DisplayType enumDisplayType) {
  60. registerProvider(provider, entry -> entry instanceof EnumEntry && ((EnumEntry<?>) entry).getDisplayType() == enumDisplayType);
  61. }
  62. public void registerColorProvider(GuiProvider<? extends ColorEntry<?>> provider, boolean alphaModeSupported, Type... types) {
  63. registerProvider(provider, entry -> entry instanceof ColorEntry<?> && (!((ColorEntry<?>) entry).isAlphaMode() || alphaModeSupported), types);
  64. }
  65. private void registerDefaultProviders() {
  66. registerProvider((Entry<Boolean> entry) -> build(
  67. builder -> builder
  68. .startBooleanToggle(entry.getText(), entry.getValue())
  69. .setDefaultValue(entry.getDefaultValue())
  70. .setTooltip(entry.getTooltip())
  71. .setSaveConsumer(entry::setValue),
  72. entry.requiresRestart()
  73. ), boolean.class, Boolean.class);
  74. registerProvider((Entry<Integer> entry) -> build(
  75. builder -> builder
  76. .startIntField(entry.getText(), entry.getValue())
  77. .setDefaultValue(entry.getDefaultValue())
  78. .setTooltip(entry.getTooltip())
  79. .setSaveConsumer(entry::setValue),
  80. entry.requiresRestart()
  81. ), int.class, Integer.class);
  82. registerBoundedProvider((BoundedEntry<Integer> entry) -> build(
  83. builder -> builder
  84. .startIntField(entry.getText(), entry.getValue())
  85. .setDefaultValue(entry.getDefaultValue())
  86. .setMin(entry.getMin())
  87. .setMax(entry.getMax())
  88. .setTooltip(entry.getTooltip())
  89. .setSaveConsumer(entry::setValue),
  90. entry.requiresRestart()
  91. ), false, int.class, Integer.class);
  92. registerBoundedProvider((BoundedEntry<Integer> entry) -> build(
  93. builder -> builder
  94. .startIntSlider(entry.getText(), entry.getValue(), entry.getMin(), entry.getMax())
  95. .setDefaultValue(entry.getDefaultValue())
  96. .setTooltip(entry.getTooltip())
  97. .setSaveConsumer(entry::setValue),
  98. entry.requiresRestart()
  99. ), true, int.class, Integer.class);
  100. registerColorProvider((ColorEntry<Integer> entry) -> build(
  101. builder -> builder
  102. .startColorField(entry.getText(), entry.getValue())
  103. .setDefaultValue(entry.getDefaultValue())
  104. .setAlphaMode(entry.isAlphaMode())
  105. .setTooltip(entry.getTooltip())
  106. .setSaveConsumer(entry::setValue),
  107. entry.requiresRestart()
  108. ), true, int.class, Integer.class);
  109. registerProvider((Entry<Long> entry) -> build(
  110. builder -> builder
  111. .startLongField(entry.getText(), entry.getValue())
  112. .setDefaultValue(entry.getDefaultValue())
  113. .setTooltip(entry.getTooltip())
  114. .setSaveConsumer(entry::setValue),
  115. entry.requiresRestart()
  116. ), long.class, Long.class);
  117. registerBoundedProvider((BoundedEntry<Long> entry) -> build(
  118. builder -> builder
  119. .startLongField(entry.getText(), entry.getValue())
  120. .setDefaultValue(entry.getDefaultValue())
  121. .setMin(entry.getMin())
  122. .setMax(entry.getMax())
  123. .setTooltip(entry.getTooltip())
  124. .setSaveConsumer(entry::setValue),
  125. entry.requiresRestart()
  126. ), false, long.class, Long.class);
  127. registerBoundedProvider((BoundedEntry<Long> entry) -> build(
  128. builder -> builder
  129. .startLongSlider(entry.getText(), entry.getValue(), entry.getMin(), entry.getMax())
  130. .setDefaultValue(entry.getDefaultValue())
  131. .setTooltip(entry.getTooltip())
  132. .setSaveConsumer(entry::setValue),
  133. entry.requiresRestart()
  134. ), true, long.class, Long.class);
  135. registerProvider((Entry<Float> entry) -> build(
  136. builder -> builder
  137. .startFloatField(entry.getText(), entry.getValue())
  138. .setDefaultValue(entry.getDefaultValue())
  139. .setTooltip(entry.getTooltip())
  140. .setSaveConsumer(entry::setValue),
  141. entry.requiresRestart()
  142. ), float.class, Float.class);
  143. registerBoundedProvider((BoundedEntry<Float> entry) -> build(
  144. builder -> builder
  145. .startFloatField(entry.getText(), entry.getValue())
  146. .setDefaultValue(entry.getDefaultValue())
  147. .setMin(entry.getMin())
  148. .setMax(entry.getMax())
  149. .setTooltip(entry.getTooltip())
  150. .setSaveConsumer(entry::setValue),
  151. entry.requiresRestart()
  152. ), false, float.class, Float.class);
  153. registerProvider((Entry<Double> entry) -> build(
  154. builder -> builder
  155. .startDoubleField(entry.getText(), entry.getValue())
  156. .setDefaultValue(entry.getDefaultValue())
  157. .setTooltip(entry.getTooltip())
  158. .setSaveConsumer(entry::setValue),
  159. entry.requiresRestart()
  160. ), double.class, Double.class);
  161. registerBoundedProvider((BoundedEntry<Double> entry) -> build(
  162. builder -> builder
  163. .startDoubleField(entry.getText(), entry.getValue())
  164. .setDefaultValue(entry.getDefaultValue())
  165. .setMin(entry.getMin())
  166. .setMax(entry.getMax())
  167. .setTooltip(entry.getTooltip())
  168. .setSaveConsumer(entry::setValue),
  169. entry.requiresRestart()
  170. ), false, double.class, Double.class);
  171. registerProvider((Entry<String> entry) -> build(
  172. builder -> builder
  173. .startStrField(entry.getText(), entry.getValue())
  174. .setDefaultValue(entry.getDefaultValue())
  175. .setTooltip(entry.getTooltip())
  176. .setSaveConsumer(entry::setValue),
  177. entry.requiresRestart()
  178. ), String.class);
  179. registerEnumProvider((EnumEntry<Enum<?>> entry) -> build(
  180. builder -> builder
  181. .startEnumSelector(entry.getText(), entry.getTypeClass(), entry.getValue())
  182. .setDefaultValue(entry.getDefaultValue())
  183. .setTooltip(entry.getTooltip())
  184. .setEnumNameProvider(entry.getEnumNameProvider())
  185. .setSaveConsumer(entry::setValue),
  186. entry.requiresRestart()
  187. ), EnumEntry.DisplayType.BUTTON);
  188. registerEnumProvider((EnumEntry<Enum<?>> entry) -> {
  189. List<Enum> enumValues = Arrays.asList(((Class<? extends Enum<?>>) entry.getTypeClass()).getEnumConstants());
  190. return build(
  191. builder -> builder
  192. .startDropdownMenu(entry.getText(), DropdownMenuBuilder.TopCellElementBuilder.of(
  193. entry.getValue(),
  194. enumTranslation -> enumValues.stream().filter(enumValue -> entry.getEnumNameProvider().apply(enumValue).getString().equals(enumTranslation)).collect(MoreCollectors.toOptional()).orElse(null),
  195. entry.getEnumNameProvider()
  196. ), DropdownMenuBuilder.CellCreatorBuilder.of(entry.getEnumNameProvider()))
  197. .setSelections(enumValues)
  198. .setDefaultValue(entry.getDefaultValue())
  199. .setSaveConsumer(entry::setValue),
  200. entry.requiresRestart()
  201. );
  202. }, EnumEntry.DisplayType.DROPDOWN);
  203. registerProvider((Entry<List<Integer>> entry) -> build(
  204. builder -> builder
  205. .startIntList(entry.getText(), entry.getValue())
  206. .setDefaultValue(entry.getDefaultValue())
  207. .setTooltip(entry.getTooltip())
  208. .setSaveConsumer(entry::setValue),
  209. entry.requiresRestart()
  210. ), new TypeToken<List<Integer>>() {}.getType());
  211. registerProvider((Entry<List<Long>> entry) -> build(
  212. builder -> builder
  213. .startLongList(entry.getText(), entry.getValue())
  214. .setDefaultValue(entry.getDefaultValue())
  215. .setTooltip(entry.getTooltip())
  216. .setSaveConsumer(entry::setValue),
  217. entry.requiresRestart()
  218. ), new TypeToken<List<Long>>() {}.getType());
  219. registerProvider((Entry<List<Float>> entry) -> build(
  220. builder -> builder
  221. .startFloatList(entry.getText(), entry.getValue())
  222. .setDefaultValue(entry.getDefaultValue())
  223. .setTooltip(entry.getTooltip())
  224. .setSaveConsumer(entry::setValue),
  225. entry.requiresRestart()
  226. ), new TypeToken<List<Float>>() {}.getType());
  227. registerProvider((Entry<List<Double>> entry) -> build(
  228. builder -> builder
  229. .startDoubleList(entry.getText(), entry.getValue())
  230. .setDefaultValue(entry.getDefaultValue())
  231. .setTooltip(entry.getTooltip())
  232. .setSaveConsumer(entry::setValue),
  233. entry.requiresRestart()
  234. ), new TypeToken<List<Double>>() {}.getType());
  235. registerProvider((Entry<List<String>> entry) -> build(
  236. builder -> builder
  237. .startStrList(entry.getText(), entry.getValue())
  238. .setDefaultValue(entry.getDefaultValue())
  239. .setTooltip(entry.getTooltip())
  240. .setSaveConsumer(entry::setValue),
  241. entry.requiresRestart()
  242. ), new TypeToken<List<String>>() {}.getType());
  243. registerColorProvider((ColorEntry<TextColor> entry) -> build(
  244. builder -> builder
  245. .startColorField(entry.getText(), entry.getValue())
  246. .setDefaultValue(entry.getDefaultValue())
  247. .setTooltip(entry.getTooltip())
  248. .setSaveConsumer3(entry::setValue),
  249. entry.requiresRestart()
  250. ), false, TextColor.class);
  251. }
  252. Optional<GuiProvider<Entry<?>>> getProvider(Entry<?> entry) {
  253. return registrations.stream().filter(registration -> registration.test(entry)).findFirst().map(registration -> {
  254. return (GuiProvider<Entry<?>>) registration.getProvider();
  255. });
  256. }
  257. }