diff options
author | xander <xander@isxander.dev> | 2022-09-03 14:08:53 +0100 |
---|---|---|
committer | xander <xander@isxander.dev> | 2022-09-03 14:08:53 +0100 |
commit | 3027527637373d7df682bf56368cf176ffcc19a8 (patch) | |
tree | 7d06ac25b09b1944626e3007ef6831f455c36ec0 /src | |
parent | be878535f0cd82fe3a0a7c7268e1e6fff5c76a2e (diff) | |
download | YetAnotherConfigLib-3027527637373d7df682bf56368cf176ffcc19a8.tar.gz YetAnotherConfigLib-3027527637373d7df682bf56368cf176ffcc19a8.tar.bz2 YetAnotherConfigLib-3027527637373d7df682bf56368cf176ffcc19a8.zip |
pass through type class to option for controllers to use
Diffstat (limited to 'src')
6 files changed, 47 insertions, 13 deletions
diff --git a/src/main/java/dev/isxander/yacl/api/Option.java b/src/main/java/dev/isxander/yacl/api/Option.java index 65eae23..9d6ebe2 100644 --- a/src/main/java/dev/isxander/yacl/api/Option.java +++ b/src/main/java/dev/isxander/yacl/api/Option.java @@ -40,6 +40,12 @@ public interface Option<T> { @NotNull Binding<T> binding(); /** + * Class of the option type. + * Used by some controllers. + */ + @NotNull Class<T> typeClass(); + + /** * Checks if the pending value is not equal to the current set value */ boolean changed(); @@ -77,7 +83,7 @@ public interface Option<T> { * @param typeClass used to capture the type */ static <T> Builder<T> createBuilder(Class<T> typeClass) { - return new Builder<>(); + return new Builder<>(typeClass); } class Builder<T> { @@ -89,8 +95,10 @@ public interface Option<T> { private Binding<T> binding; - private Builder() { + private final Class<T> typeClass; + private Builder(Class<T> typeClass) { + this.typeClass = typeClass; } /** @@ -177,7 +185,7 @@ public interface Option<T> { concatenatedTooltip.append(line); } - return new OptionImpl<>(name, concatenatedTooltip, controlGetter, binding); + return new OptionImpl<>(name, concatenatedTooltip, controlGetter, binding, typeClass); } } } diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java b/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java index 5bb3caf..75d2bca 100644 --- a/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java +++ b/src/main/java/dev/isxander/yacl/gui/controllers/EnumController.java @@ -22,7 +22,6 @@ import java.util.function.Function; public class EnumController<T extends Enum<T>> implements Controller<T> { private final Option<T> option; private final Function<T, Text> valueFormatter; - private final Class<T> enumClass; /** * Constructs a cycling enum controller with a default value formatter. @@ -30,10 +29,9 @@ public class EnumController<T extends Enum<T>> implements Controller<T> { * enum is a {@link NameableEnum} else, just use {@link Enum#name()} * * @param option bound option - * @param enumClass class of enum */ - public EnumController(Option<T> option, Class<T> enumClass) { - this(option, enumClass, value -> { + public EnumController(Option<T> option) { + this(option, value -> { if (value instanceof NameableEnum nameableEnum) return nameableEnum.getDisplayName(); return Text.of(value.name()); @@ -44,13 +42,11 @@ public class EnumController<T extends Enum<T>> implements Controller<T> { * Constructs a cycling enum controller. * * @param option bound option - * @param enumClass class of enum * @param valueFormatter format the enum into any {@link Text} */ - public EnumController(Option<T> option, Class<T> enumClass, Function<T, Text> valueFormatter) { + public EnumController(Option<T> option, Function<T, Text> valueFormatter) { this.option = option; this.valueFormatter = valueFormatter; - this.enumClass = enumClass; } /** @@ -74,7 +70,7 @@ public class EnumController<T extends Enum<T>> implements Controller<T> { */ @Override public ControllerWidget<EnumController<T>> provideWidget(YACLScreen screen, Dimension<Integer> widgetDimension) { - return new EnumControllerElement<>(this, screen, widgetDimension, enumClass.getEnumConstants()); + return new EnumControllerElement<>(this, screen, widgetDimension, option().typeClass().getEnumConstants()); } @ApiStatus.Internal diff --git a/src/main/java/dev/isxander/yacl/impl/ButtonOptionImpl.java b/src/main/java/dev/isxander/yacl/impl/ButtonOptionImpl.java index 748dd0c..d3fbaa6 100644 --- a/src/main/java/dev/isxander/yacl/impl/ButtonOptionImpl.java +++ b/src/main/java/dev/isxander/yacl/impl/ButtonOptionImpl.java @@ -59,6 +59,11 @@ public class ButtonOptionImpl implements ButtonOption { } @Override + public @NotNull Class<Consumer<YACLScreen>> typeClass() { + throw new UnsupportedOperationException(); + } + + @Override public boolean changed() { return false; } diff --git a/src/main/java/dev/isxander/yacl/impl/OptionImpl.java b/src/main/java/dev/isxander/yacl/impl/OptionImpl.java index 176bf93..2d66aee 100644 --- a/src/main/java/dev/isxander/yacl/impl/OptionImpl.java +++ b/src/main/java/dev/isxander/yacl/impl/OptionImpl.java @@ -17,18 +17,22 @@ public class OptionImpl<T> implements Option<T> { private final Controller<T> controller; private final Binding<T> binding; + private final Class<T> typeClass; + private T pendingValue; public OptionImpl( @NotNull Text name, @Nullable Text tooltip, @NotNull Function<Option<T>, Controller<T>> controlGetter, - @NotNull Binding<T> binding + @NotNull Binding<T> binding, + @NotNull Class<T> typeClass ) { this.name = name; this.tooltip = tooltip; this.controller = controlGetter.apply(this); this.binding = binding; + this.typeClass = typeClass; this.pendingValue = binding().getValue(); } @@ -53,6 +57,11 @@ public class OptionImpl<T> implements Option<T> { } @Override + public @NotNull Class<T> typeClass() { + return typeClass; + } + + @Override public boolean changed() { return !binding().getValue().equals(pendingValue); } diff --git a/src/main/resources/fabric.mod.json b/src/main/resources/fabric.mod.json index b40f7eb..dba6e5a 100644 --- a/src/main/resources/fabric.mod.json +++ b/src/main/resources/fabric.mod.json @@ -23,6 +23,9 @@ "minecraft": "1.19.x", "java": ">=17" }, + "mixins": [ + "yet-another-config-lib.mixins.json" + ], "custom": { "modmenu": { "badges": ["library"] diff --git a/src/testmod/java/dev/isxander/yacl/test/ModMenuIntegration.java b/src/testmod/java/dev/isxander/yacl/test/ModMenuIntegration.java index 57d809b..3ba2a73 100644 --- a/src/testmod/java/dev/isxander/yacl/test/ModMenuIntegration.java +++ b/src/testmod/java/dev/isxander/yacl/test/ModMenuIntegration.java @@ -12,6 +12,7 @@ import dev.isxander.yacl.gui.controllers.slider.FloatSliderController; import dev.isxander.yacl.gui.controllers.slider.IntegerSliderController; import dev.isxander.yacl.gui.controllers.slider.LongSliderController; import net.minecraft.client.MinecraftClient; +import net.minecraft.client.option.GraphicsMode; import net.minecraft.client.toast.SystemToast; import net.minecraft.text.Text; @@ -60,6 +61,12 @@ public class ModMenuIntegration implements ModMenuApi { ) .controller(TickBoxController::new) .build()) + .option(Option.createBuilder(boolean.class) + .name(Text.of("Minecraft AutoJump")) + .tooltip(Text.of("You can even bind minecraft options!")) + .binding(Binding.minecraft(MinecraftClient.getInstance().options.getAutoJump())) + .controller(TickBoxController::new) + .build()) .build()) .group(OptionGroup.createBuilder() .name(Text.of("Slider Controllers")) @@ -109,7 +116,12 @@ public class ModMenuIntegration implements ModMenuApi { () -> TestSettings.enumOption, (value) -> TestSettings.enumOption = value ) - .controller(opt -> new EnumController<>(opt, TestSettings.Alphabet.class)) + .controller(EnumController::new) + .build()) + .option(Option.createBuilder(GraphicsMode.class) + .name(Text.of("Minecraft Graphics Mode")) + .binding(Binding.minecraft(MinecraftClient.getInstance().options.getGraphicsMode())) + .controller(EnumController::new) .build()) .build()) .group(OptionGroup.createBuilder() @@ -243,6 +255,7 @@ public class ModMenuIntegration implements ModMenuApi { .controller(ActionController::new) .build()) .build()) + .save(() -> MinecraftClient.getInstance().options.write()) .build().generateScreen(parent); } |