diff options
Diffstat (limited to 'src/main/java/me/xmrvizzy/skyblocker/config/controllers')
3 files changed, 44 insertions, 10 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java index cf40c7d5..6db0028c 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java @@ -8,16 +8,23 @@ import dev.isxander.yacl3.gui.controllers.dropdown.AbstractDropdownController; import org.jetbrains.annotations.NotNull; import java.util.Arrays; +import java.util.function.Function; import java.util.stream.Stream; public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownController<E> { - protected EnumDropdownController(Option<E> option) { + /** + * The function used to convert enum constants to strings used for display, suggestion, and validation. Defaults to {@link Enum#toString}. + */ + protected final Function<E, String> toString; + + protected EnumDropdownController(Option<E> option, Function<E, String> toString) { super(option); + this.toString = toString; } @Override public String getString() { - return option().pendingValue().toString(); + return toString.apply(option().pendingValue()); } @Override @@ -26,15 +33,15 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC } /** - * Searches through enum constants for one whose {@link Enum#toString()} result equals {@code value} + * Searches through enum constants for one whose {@link #toString} result equals {@code value} * * @return The enum constant associated with the {@code value} or the pending value if none are found - * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy + * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy */ private E getEnumFromString(String value) { value = value.toLowerCase(); for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) { - if (constant.toString().toLowerCase().equals(value)) return constant; + if (toString.apply(constant).toLowerCase().equals(value)) return constant; } return option().pendingValue(); @@ -44,7 +51,7 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC public boolean isValueValid(String value) { value = value.toLowerCase(); for (E constant : option().pendingValue().getDeclaringClass().getEnumConstants()) { - if (constant.toString().equals(value)) return true; + if (toString.apply(constant).equals(value)) return true; } return false; @@ -59,16 +66,16 @@ public class EnumDropdownController<E extends Enum<E>> extends AbstractDropdownC } /** - * Filters and sorts through enum constants for those whose {@link Enum#toString()} result equals {@code value} + * Filters and sorts through enum constants for those whose {@link #toString} result equals {@code value} * * @return a sorted stream containing enum constants associated with the {@code value} - * @implNote The return value of {@link Enum#toString()} on each enum constant should be unique in order to ensure accuracy + * @implNote The return value of {@link #toString} on each enum constant should be unique in order to ensure accuracy */ @NotNull protected Stream<String> getValidEnumConstants(String value) { String valueLowerCase = value.toLowerCase(); return Arrays.stream(option().pendingValue().getDeclaringClass().getEnumConstants()) - .map(Enum::toString) + .map(this.toString) .filter(constant -> constant.toLowerCase().contains(valueLowerCase)) .sorted((s1, s2) -> { String s1LowerCase = s1.toLowerCase(); diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java index baadb8b3..a17f58d6 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java @@ -3,8 +3,25 @@ package me.xmrvizzy.skyblocker.config.controllers; import dev.isxander.yacl3.api.Option; import dev.isxander.yacl3.api.controller.ControllerBuilder; +import java.util.function.Function; + public interface EnumDropdownControllerBuilder<E extends Enum<E>> extends ControllerBuilder<E> { + EnumDropdownControllerBuilder<E> toString(Function<E, String> toString); + static <E extends Enum<E>> EnumDropdownControllerBuilder<E> create(Option<E> option) { return new EnumDropdownControllerBuilderImpl<>(option); } + + /** + * Creates a factory for {@link EnumDropdownControllerBuilder}s with the given function for converting enum constants to strings. + * Use this if a custom toString function for an enum is needed. + * Use it like this: + * <pre>{@code Option.<MyEnum>createBuilder().controller(createEnumDropdownControllerBuilder.getFactory(MY_CUSTOM_ENUM_TO_STRING_FUNCTION))}</pre> + * @param toString The function used to convert enum constants to strings used for display, suggestion, and validation + * @return a factory for {@link EnumDropdownControllerBuilder}s + * @param <E> the enum type + */ + static <E extends Enum<E>> Function<Option<E>, ControllerBuilder<E>> getFactory(Function<E, String> toString) { + return opt -> EnumDropdownControllerBuilder.create(opt).toString(toString); + } } diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java index ea30d1da..27878c86 100644 --- a/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java +++ b/src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java @@ -4,14 +4,24 @@ import dev.isxander.yacl3.api.Controller; import dev.isxander.yacl3.api.Option; import dev.isxander.yacl3.impl.controller.AbstractControllerBuilderImpl; +import java.util.function.Function; + public class EnumDropdownControllerBuilderImpl<E extends Enum<E>> extends AbstractControllerBuilderImpl<E> implements EnumDropdownControllerBuilder<E> { + private Function<E, String> toString = Enum::toString; + public EnumDropdownControllerBuilderImpl(Option<E> option) { super(option); } + @Override + public EnumDropdownControllerBuilder<E> toString(Function<E, String> toString) { + this.toString = toString; + return this; + } + @SuppressWarnings("UnstableApiUsage") @Override public Controller<E> build() { - return new EnumDropdownController<>(option); + return new EnumDropdownController<>(option, toString); } } |