aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorKevin <92656833+kevinthegreat1@users.noreply.github.com>2023-10-08 00:01:34 -0400
committerGitHub <noreply@github.com>2023-10-08 00:01:34 -0400
commit0c9381191663a74a9ec3cff9aae1c8b523215f0e (patch)
treea649e4800fb2ef497b7f6986a2832f8ba9cda881 /src/main/java
parentaed9c89764b84da3944e450e877a5707f430fe8b (diff)
downloadSkyblocker-0c9381191663a74a9ec3cff9aae1c8b523215f0e.tar.gz
Skyblocker-0c9381191663a74a9ec3cff9aae1c8b523215f0e.tar.bz2
Skyblocker-0c9381191663a74a9ec3cff9aae1c8b523215f0e.zip
Add Support for Custom toString Function for Enum Dropdowns (#344)
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java53
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java19
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownController.java25
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilder.java17
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/config/controllers/EnumDropdownControllerBuilderImpl.java12
-rw-r--r--src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java2
7 files changed, 68 insertions, 72 deletions
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
index 766b0643..552ed091 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/ConfigUtils.java
@@ -4,11 +4,15 @@ import dev.isxander.yacl3.api.Option;
import dev.isxander.yacl3.api.controller.BooleanControllerBuilder;
import dev.isxander.yacl3.api.controller.EnumControllerBuilder;
import dev.isxander.yacl3.api.controller.ValueFormatter;
-import me.xmrvizzy.skyblocker.config.controllers.EnumDropdownControllerBuilder;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
+import org.apache.commons.lang3.StringUtils;
+
+import java.util.function.Function;
public class ConfigUtils {
- public static final ValueFormatter<Float> FLOAT_TWO_FORMATTER = value -> Text.literal(String.format("%,.2f", value).replaceAll("[\u00a0\u202F]", " "));
+ public static final Function<Formatting, String> FORMATTING_TO_STRING = formatting -> StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
+ public static final ValueFormatter<Float> FLOAT_TWO_FORMATTER = value -> Text.literal(String.format("%,.2f", value).replaceAll("[\u00a0\u202F]", " "));
public static BooleanControllerBuilder createBooleanController(Option<Boolean> opt) {
return BooleanControllerBuilder.create(opt).yesNoFormatter().coloured(true);
@@ -18,8 +22,4 @@ public class ConfigUtils {
public static <E extends Enum<E>> EnumControllerBuilder<E> createEnumCyclingListController(Option<E> opt) {
return EnumControllerBuilder.create(opt).enumClass((Class<E>) opt.binding().defaultValue().getClass());
}
-
- public static <E extends Enum<E>> EnumDropdownControllerBuilder<E> createEnumDropdownController(Option<E> opt) {
- return EnumDropdownControllerBuilder.create(opt);
- }
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
index 3cb2ce5d..a32dcbfe 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/SkyblockerConfig.java
@@ -1,10 +1,5 @@
package me.xmrvizzy.skyblocker.config;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.apache.commons.lang3.StringUtils;
-
import dev.isxander.yacl3.config.v2.api.SerialEntry;
import it.unimi.dsi.fastutil.objects.Object2IntOpenHashMap;
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
@@ -15,6 +10,9 @@ import net.minecraft.client.resource.language.I18n;
import net.minecraft.text.Text;
import net.minecraft.util.Formatting;
+import java.util.ArrayList;
+import java.util.List;
+
public class SkyblockerConfig {
@SerialEntry
public int version = 1;
@@ -587,55 +585,18 @@ public class SkyblockerConfig {
public int neutralThreshold = 1000;
@SerialEntry
- public FormattingOption neutralColor = FormattingOption.DARK_GRAY;
+ public Formatting neutralColor = Formatting.DARK_GRAY;
@SerialEntry
- public FormattingOption profitColor = FormattingOption.DARK_GREEN;
+ public Formatting profitColor = Formatting.DARK_GREEN;
@SerialEntry
- public FormattingOption lossColor = FormattingOption.RED;
+ public Formatting lossColor = Formatting.RED;
@SerialEntry
- public FormattingOption incompleteColor = FormattingOption.BLUE;
+ public Formatting incompleteColor = Formatting.BLUE;
}
-
- public enum FormattingOption {
- BLACK(Formatting.BLACK),
- DARK_BLUE(Formatting.DARK_BLUE),
- DARK_GREEN(Formatting.DARK_GREEN),
- DARK_AQUA(Formatting.DARK_AQUA),
- DARK_RED(Formatting.DARK_RED),
- DARK_PURPLE(Formatting.DARK_PURPLE),
- GOLD(Formatting.GOLD),
- GRAY(Formatting.GRAY),
- DARK_GRAY(Formatting.DARK_GRAY),
- BLUE(Formatting.BLUE),
- GREEN(Formatting.GREEN),
- AQUA(Formatting.AQUA),
- RED(Formatting.RED),
- LIGHT_PURPLE(Formatting.LIGHT_PURPLE),
- YELLOW(Formatting.YELLOW),
- WHITE(Formatting.WHITE),
- OBFUSCATED(Formatting.OBFUSCATED),
- BOLD(Formatting.BOLD),
- STRIKETHROUGH(Formatting.STRIKETHROUGH),
- UNDERLINE(Formatting.UNDERLINE),
- ITALIC(Formatting.ITALIC),
- RESET(Formatting.RESET);
-
- public final Formatting formatting;
-
-
- FormattingOption(Formatting formatting) {
- this.formatting = formatting;
- }
-
- @Override
- public String toString() {
- return StringUtils.capitalize(formatting.getName().replaceAll("_", " "));
- }
- }
public static class LividColor {
@SerialEntry
diff --git a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
index 16439cb5..2d641ac1 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/config/categories/DungeonsCategory.java
@@ -10,11 +10,12 @@ import dev.isxander.yacl3.api.controller.FloatFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.IntegerFieldControllerBuilder;
import dev.isxander.yacl3.api.controller.StringControllerBuilder;
import me.xmrvizzy.skyblocker.config.SkyblockerConfig;
-import me.xmrvizzy.skyblocker.config.SkyblockerConfig.FormattingOption;
import me.xmrvizzy.skyblocker.config.ConfigUtils;
+import me.xmrvizzy.skyblocker.config.controllers.EnumDropdownControllerBuilder;
import me.xmrvizzy.skyblocker.skyblock.dungeon.DungeonMapConfigScreen;
import net.minecraft.client.MinecraftClient;
import net.minecraft.text.Text;
+import net.minecraft.util.Formatting;
public class DungeonsCategory {
@@ -150,34 +151,34 @@ public class DungeonsCategory {
newValue -> config.locations.dungeons.dungeonChestProfit.neutralThreshold = newValue)
.controller(IntegerFieldControllerBuilder::create)
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.neutralColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.neutralColor,
() -> config.locations.dungeons.dungeonChestProfit.neutralColor,
newValue -> config.locations.dungeons.dungeonChestProfit.neutralColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.profitColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.profitColor,
() -> config.locations.dungeons.dungeonChestProfit.profitColor,
newValue -> config.locations.dungeons.dungeonChestProfit.profitColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.lossColor"))
.binding(defaults.locations.dungeons.dungeonChestProfit.lossColor,
() -> config.locations.dungeons.dungeonChestProfit.lossColor,
newValue -> config.locations.dungeons.dungeonChestProfit.lossColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
- .option(Option.<FormattingOption>createBuilder()
+ .option(Option.<Formatting>createBuilder()
.name(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor"))
.description(OptionDescription.of(Text.translatable("text.autoconfig.skyblocker.option.locations.dungeons.dungeonChestProfit.incompleteColor.@Tooltip")))
.binding(defaults.locations.dungeons.dungeonChestProfit.incompleteColor,
() -> config.locations.dungeons.dungeonChestProfit.incompleteColor,
newValue -> config.locations.dungeons.dungeonChestProfit.incompleteColor = newValue)
- .controller(ConfigUtils::createEnumDropdownController)
+ .controller(EnumDropdownControllerBuilder.getFactory(ConfigUtils.FORMATTING_TO_STRING))
.build())
.build())
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);
}
}
diff --git a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
index 91be5248..ea54ff32 100644
--- a/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
+++ b/src/main/java/me/xmrvizzy/skyblocker/skyblock/dungeon/DungeonChestProfit.java
@@ -160,7 +160,7 @@ public class DungeonChestProfit {
private static Text getProfitText(int profit, boolean hasIncompleteData) {
SkyblockerConfig.DungeonChestProfit config = SkyblockerConfigManager.get().locations.dungeons.dungeonChestProfit;
- return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor.formatting, config.profitColor.formatting, config.lossColor.formatting, config.incompleteColor.formatting);
+ return getProfitText(profit, hasIncompleteData, config.neutralThreshold, config.neutralColor, config.profitColor, config.lossColor, config.incompleteColor);
}
static Text getProfitText(int profit, boolean hasIncompleteData, int neutralThreshold, Formatting neutralColor, Formatting profitColor, Formatting lossColor, Formatting incompleteColor) {