Sfoglia il codice sorgente

Added requires restart option

Lortseam 4 anni fa
parent
commit
f1ce2ca2c5

+ 2 - 0
src/main/java/me/lortseam/completeconfig/api/ConfigEntry.java

@@ -19,6 +19,8 @@ public @interface ConfigEntry {
 
     boolean forceUpdate() default false;
 
+    boolean requiresRestart() default false;
+
     @NoArgsConstructor(access = AccessLevel.PRIVATE)
     class Bounded {
 

+ 1 - 0
src/main/java/me/lortseam/completeconfig/collection/EntryMap.java

@@ -87,6 +87,7 @@ public class EntryMap extends ConfigMap<Entry> {
                         entry.setCustomTooltipTranslationKeys(Arrays.stream(customTooltipKeys).map(key -> modTranslationKey + "." + key).toArray(String[]::new));
                     }
                     entry.setForceUpdate(entryAnnotation.forceUpdate());
+                    entry.setRequiresRestart(entryAnnotation.requiresRestart());
                 }
                 if (field.isAnnotationPresent(ConfigEntry.Bounded.Integer.class)) {
                     if (field.getType() != int.class && field.getType() != Integer.class) {

+ 6 - 0
src/main/java/me/lortseam/completeconfig/entry/Entry.java

@@ -67,6 +67,8 @@ public class Entry<T> {
     private final List<Listener> listeners = new ArrayList<>();
     @Setter
     private boolean forceUpdate;
+    @Setter
+    private boolean requiresRestart;
 
     private Entry(Collection parent, Field field, Class<T> type) {
         translationKey = parent.getTranslationKey() + "." + field.getName();
@@ -178,6 +180,10 @@ public class Entry<T> {
         extras.setEnumOptions(displayType);
     }
 
+    public boolean requiresRestart() {
+        return requiresRestart;
+    }
+
     @AllArgsConstructor
     private static class Listener {
 

+ 1 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiBuilder.java

@@ -50,7 +50,7 @@ public class GuiBuilder {
         List<AbstractConfigListEntry> collectionGui = new ArrayList<>();
         collection.getEntries().values().forEach(entry -> collectionGui.add(((Optional<GuiProvider>) manager.getGuiRegistry().getProvider(entry)).orElseGet(() -> {
             throw new UnsupportedOperationException("Could not find gui provider for field " + entry.getField());
-        }).build(entry.getText(), entry.getField(), entry.getValue(), entry.getDefaultValue(), entry.getTooltip(), entry.getExtras(), entry::setValue)));
+        }).build(entry.getText(), entry.getField(), entry.getValue(), entry.getDefaultValue(), entry.getTooltip(), entry.getExtras(), entry::setValue, entry.requiresRestart())));
         collection.getCollections().values().forEach(c -> {
             SubCategoryBuilder subBuilder = ConfigEntryBuilder.create().startSubCategory(c.getText());
             subBuilder.addAll(buildCollection(c));

+ 1 - 1
src/main/java/me/lortseam/completeconfig/gui/GuiProvider.java

@@ -11,6 +11,6 @@ import java.util.function.Consumer;
 @FunctionalInterface
 public interface GuiProvider<T> {
 
-    AbstractConfigListEntry<T> build(Text text, Field field, T value, T defaultValue, Optional<Text[]> tooltip, Extras<T> extras, Consumer<T> saveConsumer);
+    AbstractConfigListEntry<T> build(Text text, Field field, T value, T defaultValue, Optional<Text[]> tooltip, Extras<T> extras, Consumer<T> saveConsumer, boolean requiresRestart);
 
 }

+ 182 - 187
src/main/java/me/lortseam/completeconfig/gui/GuiRegistry.java

@@ -4,16 +4,29 @@ import com.google.common.collect.Lists;
 import com.google.common.collect.MoreCollectors;
 import me.lortseam.completeconfig.entry.Entry;
 import me.lortseam.completeconfig.entry.EnumOptions;
+import me.shedaniel.clothconfig2.api.AbstractConfigListEntry;
 import me.shedaniel.clothconfig2.api.ConfigEntryBuilder;
 import me.shedaniel.clothconfig2.impl.builders.DropdownMenuBuilder;
+import me.shedaniel.clothconfig2.impl.builders.FieldBuilder;
 import org.apache.commons.lang3.ArrayUtils;
 
 import java.lang.reflect.ParameterizedType;
 import java.lang.reflect.Type;
-import java.util.*;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Optional;
+import java.util.function.Consumer;
+import java.util.function.Function;
 
 public class GuiRegistry {
 
+    public static <T, A extends AbstractConfigListEntry> A build(Consumer<FieldBuilder<T, A>> fieldBuilderModifier, Function<ConfigEntryBuilder, FieldBuilder<T, A>> builder) {
+        FieldBuilder<T, A> fieldBuilder = builder.apply(ConfigEntryBuilder.create());
+        fieldBuilderModifier.accept(fieldBuilder);
+        return fieldBuilder.build();
+    }
+
     private final List<Registration> registrations = new ArrayList<>();
 
     GuiRegistry() {
@@ -56,192 +69,174 @@ public class GuiRegistry {
     }
 
     private void registerDefaultProviders() {
-        registerProvider((GuiProvider<Boolean>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startBooleanToggle(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                boolean.class, Boolean.class
-        );
-        registerProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startIntField(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                int.class, Integer.class
-        );
-        registerBoundedProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startIntField(text, value)
-                .setDefaultValue(defaultValue)
-                .setMin(extras.getBounds().getMin())
-                .setMax(extras.getBounds().getMax())
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                false, int.class, Integer.class
-        );
-        registerBoundedProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startIntSlider(text, value, extras.getBounds().getMin(), extras.getBounds().getMax())
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                true, int.class, Integer.class
-        );
-        registerProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startLongField(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                long.class, Long.class
-        );
-        registerBoundedProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startLongField(text, value)
-                .setDefaultValue(defaultValue)
-                .setMin(extras.getBounds().getMin())
-                .setMax(extras.getBounds().getMax())
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                false, long.class, Long.class
-        );
-        registerBoundedProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startLongSlider(text, value, extras.getBounds().getMin(), extras.getBounds().getMax())
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                true, long.class, Long.class
-        );
-        registerProvider((GuiProvider<Float>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startFloatField(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                float.class, Float.class
-        );
-        registerBoundedProvider((GuiProvider<Float>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startFloatField(text, value)
-                .setDefaultValue(defaultValue)
-                .setMin(extras.getBounds().getMin())
-                .setMax(extras.getBounds().getMax())
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                false, float.class, Float.class
-        );
-        registerProvider((GuiProvider<Double>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startDoubleField(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                double.class, Double.class
-        );
-        registerBoundedProvider((GuiProvider<Double>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startDoubleField(text, value)
-                .setDefaultValue(defaultValue)
-                .setMin(extras.getBounds().getMin())
-                .setMax(extras.getBounds().getMax())
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                false, double.class, Double.class
-        );
-        registerProvider((GuiProvider<String>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startStrField(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                String.class
-        );
-        registerEnumProvider((GuiProvider<? extends Enum>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startEnumSelector(text, (Class<Enum>) field.getType(), value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setEnumNameProvider(extras.getEnumOptions().getNameProvider())
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                EnumOptions.DisplayType.BUTTON
-        );
-        registerEnumProvider((GuiProvider<? extends Enum>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> {
-            List<Enum> enumValues = Arrays.asList(((Class<? extends Enum>) field.getType()).getEnumConstants());
-            return ConfigEntryBuilder
-                    .create()
-                    .startDropdownMenu(text, DropdownMenuBuilder.TopCellElementBuilder.of(
-                            value,
-                            enumTranslation -> enumValues.stream().filter(enumValue -> extras.getEnumOptions().getNameProvider().apply(enumValue).getString().equals(enumTranslation)).collect(MoreCollectors.toOptional()).orElse(null),
-                            extras.getEnumOptions().getNameProvider()
-                    ), DropdownMenuBuilder.CellCreatorBuilder.of(extras.getEnumOptions().getNameProvider()))
-                    .setSelections(enumValues)
-                    .setDefaultValue(defaultValue)
-                    .setSaveConsumer(saveConsumer)
-                    .build();
-            }, EnumOptions.DisplayType.DROPDOWN
-        );
-        registerGenericProvider((GuiProvider<List<Integer>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startIntList(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                List.class, Integer.class
-        );
-        registerGenericProvider((GuiProvider<List<Long>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startLongList(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                List.class, Long.class
-        );
-        registerGenericProvider((GuiProvider<List<Float>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startFloatList(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                List.class, Float.class
-        );
-        registerGenericProvider((GuiProvider<List<Double>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startDoubleList(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                List.class, Double.class
-        );
-        registerGenericProvider((GuiProvider<List<String>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer) -> ConfigEntryBuilder
-                .create()
-                .startStrList(text, value)
-                .setDefaultValue(defaultValue)
-                .setTooltip(tooltip)
-                .setSaveConsumer(saveConsumer)
-                .build(),
-                List.class, String.class
-        );
+       registerProvider((GuiProvider<Boolean>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startBooleanToggle(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), boolean.class, Boolean.class);
+       registerProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startIntField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), int.class, Integer.class);
+       registerBoundedProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startIntField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setMin(extras.getBounds().getMin())
+                       .setMax(extras.getBounds().getMax())
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), false, int.class, Integer.class);
+       registerBoundedProvider((GuiProvider<Integer>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startIntSlider(text, value, extras.getBounds().getMin(), extras.getBounds().getMax())
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), true, int.class, Integer.class);
+       registerProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startLongField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), long.class, Long.class);
+       registerBoundedProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startLongField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setMin(extras.getBounds().getMin())
+                       .setMax(extras.getBounds().getMax())
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), false, long.class, Long.class);
+       registerBoundedProvider((GuiProvider<Long>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startLongSlider(text, value, extras.getBounds().getMin(), extras.getBounds().getMax())
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), true, long.class, Long.class);
+       registerProvider((GuiProvider<Float>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startFloatField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), float.class, Float.class);
+       registerBoundedProvider((GuiProvider<Float>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startFloatField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setMin(extras.getBounds().getMin())
+                       .setMax(extras.getBounds().getMax())
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), false, float.class, Float.class);
+       registerProvider((GuiProvider<Double>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startDoubleField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), double.class, Double.class);
+       registerBoundedProvider((GuiProvider<Double>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startDoubleField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setMin(extras.getBounds().getMin())
+                       .setMax(extras.getBounds().getMax())
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), false, double.class, Double.class);
+       registerProvider((GuiProvider<String>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startStrField(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), String.class);
+       registerEnumProvider((GuiProvider<? extends Enum<?>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startEnumSelector(text, (Class<Enum<?>>) field.getType(), value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setEnumNameProvider(extras.getEnumOptions().getNameProvider())
+                       .setSaveConsumer(saveConsumer)
+       ), EnumOptions.DisplayType.BUTTON);
+       registerEnumProvider((GuiProvider<? extends Enum>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> {
+           List<Enum> enumValues = Arrays.asList(((Class<? extends Enum>) field.getType()).getEnumConstants());
+           return build(
+                   builder -> builder.requireRestart(requiresRestart),
+                   builder -> builder
+                           .startDropdownMenu(text, DropdownMenuBuilder.TopCellElementBuilder.of(
+                                   value,
+                                   enumTranslation -> enumValues.stream().filter(enumValue -> extras.getEnumOptions().getNameProvider().apply(enumValue).getString().equals(enumTranslation)).collect(MoreCollectors.toOptional()).orElse(null),
+                                   extras.getEnumOptions().getNameProvider()
+                           ), DropdownMenuBuilder.CellCreatorBuilder.of(extras.getEnumOptions().getNameProvider()))
+                           .setSelections(enumValues)
+                           .setDefaultValue(defaultValue)
+                           .setSaveConsumer(saveConsumer)
+           );
+       }, EnumOptions.DisplayType.DROPDOWN);
+       registerGenericProvider((GuiProvider<List<Integer>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startIntList(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), List.class, Integer.class);
+       registerGenericProvider((GuiProvider<List<Long>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startLongList(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), List.class, Long.class);
+       registerGenericProvider((GuiProvider<List<Float>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startFloatList(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), List.class, Float.class);
+       registerGenericProvider((GuiProvider<List<Double>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startDoubleList(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), List.class, Double.class);
+       registerGenericProvider((GuiProvider<List<String>>) (text, field, value, defaultValue, tooltip, extras, saveConsumer, requiresRestart) -> build(
+               builder -> builder.requireRestart(requiresRestart),
+               builder -> builder
+                       .startStrList(text, value)
+                       .setDefaultValue(defaultValue)
+                       .setTooltip(tooltip)
+                       .setSaveConsumer(saveConsumer)
+       ), List.class, String.class);
     }
 
     <T> Optional<GuiProvider<T>> getProvider(Entry<T> entry) {