From 909f62d19f6c2bfa921a9e479dacef0aec6f8840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?K=C3=A4seToatz?= Date: Fri, 7 Nov 2025 12:44:53 +0100 Subject: [PATCH] add int & sub options --- .../dumbassconfig/DumbassConfig.java | 8 ++ .../com/kasetoatz/dumbassconfig/Test.java | 17 ++++ .../options/AbstractInputOption.java | 23 ++++- .../dumbassconfig/options/AbstractOption.java | 5 ++ .../dumbassconfig/options/FloatOption.java | 8 +- .../dumbassconfig/options/IntOption.java | 46 ++++++++++ .../dumbassconfig/options/SubOption.java | 85 +++++++++++++++++++ ...{Validator.java => AbstractValidator.java} | 2 +- .../options/validators/RangeValidator.java | 2 +- .../dumbassconfig/ui/ConfigScreen.java | 2 +- 10 files changed, 188 insertions(+), 10 deletions(-) create mode 100644 src/main/java/com/kasetoatz/dumbassconfig/options/IntOption.java create mode 100644 src/main/java/com/kasetoatz/dumbassconfig/options/SubOption.java rename src/main/java/com/kasetoatz/dumbassconfig/options/validators/{Validator.java => AbstractValidator.java} (78%) diff --git a/src/main/java/com/kasetoatz/dumbassconfig/DumbassConfig.java b/src/main/java/com/kasetoatz/dumbassconfig/DumbassConfig.java index 9a9be70..2d7dc39 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/DumbassConfig.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/DumbassConfig.java @@ -2,7 +2,9 @@ package com.kasetoatz.dumbassconfig; import com.google.gson.Gson; import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; +import com.kasetoatz.dumbassconfig.options.AbstractInputOption; import com.kasetoatz.dumbassconfig.options.AbstractOption; import com.kasetoatz.dumbassconfig.ui.ConfigScreen; import net.fabricmc.loader.api.FabricLoader; @@ -64,6 +66,12 @@ public class DumbassConfig { if (data.has(option.getKey())) { + JsonElement value = data.get(option.getKey()); + if (option instanceof AbstractInputOption inputOption && !inputOption.isValid(value)) + { + option.reset(); + continue; + } option.fromJson(data.get(option.getKey())); } } diff --git a/src/main/java/com/kasetoatz/dumbassconfig/Test.java b/src/main/java/com/kasetoatz/dumbassconfig/Test.java index 0a7b368..8aca484 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/Test.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/Test.java @@ -2,6 +2,8 @@ package com.kasetoatz.dumbassconfig; import com.kasetoatz.dumbassconfig.options.BoolOption; import com.kasetoatz.dumbassconfig.options.FloatOption; +import com.kasetoatz.dumbassconfig.options.IntOption; +import com.kasetoatz.dumbassconfig.options.SubOption; import com.terraformersmc.modmenu.api.ConfigScreenFactory; import com.terraformersmc.modmenu.api.ModMenuApi; import net.minecraft.text.Text; @@ -10,9 +12,24 @@ public class Test implements ModMenuApi { public static final BoolOption TEST_BOOL_OPT = new BoolOption("TEST", "test_bool_opt", false); public static final FloatOption TEST_FLOAT_OPT = new FloatOption("TEST", "test_float_opt", 1.F); + public static final IntOption TEST_INT_OPT = new IntOption("TEST", "test_int_opt", 1); + + public static final IntOption SUB_SUB_INT_OPT = new IntOption("SUB SUB", "sub_sub_int_opt", 1); + public static final SubOption SUB_SUB_OPT = SubOption.builder("SUB SUB SCREEN", "sub_sub_opt") + .withOption(SUB_SUB_INT_OPT) + .build(); + + public static final IntOption SUB_INT_OPT = new IntOption("SUB", "sub_int_opt", 0); + public static final SubOption TEST_SUB_OPT = SubOption.builder("SUB SCREEN", "sub_opt") + .withOption(SUB_INT_OPT) + .withOption(SUB_SUB_OPT) + .build(); + DumbassConfig config = DumbassConfig.builder(Text.literal("Test Screen"), "test.json") .withOption(TEST_BOOL_OPT) .withOption(TEST_FLOAT_OPT) + .withOption(TEST_INT_OPT) + .withOption(TEST_SUB_OPT) .build(); @Override diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractInputOption.java b/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractInputOption.java index ee56f66..a2d99a2 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractInputOption.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractInputOption.java @@ -1,7 +1,8 @@ package com.kasetoatz.dumbassconfig.options; +import com.google.gson.JsonElement; import com.kasetoatz.dumbassconfig.ui.InputField; -import com.kasetoatz.dumbassconfig.options.validators.Validator; +import com.kasetoatz.dumbassconfig.options.validators.AbstractValidator; import net.minecraft.client.gui.tooltip.Tooltip; import net.minecraft.text.Text; @@ -11,9 +12,9 @@ import static com.kasetoatz.dumbassconfig.DumbassConfig.VALID_INPUT_COLOR; public abstract class AbstractInputOption extends AbstractOption { public InputField textField; - private Validator validator; + private AbstractValidator validator; - public AbstractInputOption(String text, String key, T defaultValue, Validator validator) + public AbstractInputOption(String text, String key, T defaultValue, AbstractValidator validator) { super(text, key, defaultValue); this.validator = validator; @@ -24,6 +25,15 @@ public abstract class AbstractInputOption extends AbstractOption super(text, key, defaultValue); } + public boolean isValid(JsonElement element) + { + if (!this.predicate(element.getAsString())) + { + return false; + } + return this.validator == null || this.validator.isValid(this.asPrimitive(element)); + } + public void onChange(T value) { if (validator != null && !validator.isValid(value)) @@ -44,6 +54,13 @@ public abstract class AbstractInputOption extends AbstractOption this.textField.setTooltip(Tooltip.of(Text.literal(message).withColor(INVALID_INPUT_COLOR))); } + @Override + public void fromJson(JsonElement element) + { + this.setValue(this.asPrimitive(element)); + } + public abstract boolean predicate(String value); public abstract void changeListener(String value); + public abstract T asPrimitive(JsonElement element); } diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractOption.java b/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractOption.java index 463cb73..23b6de8 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractOption.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/AbstractOption.java @@ -43,5 +43,10 @@ public abstract class AbstractOption this.value = value; } + public void reset() + { + this.value = this.defaultValue; + } + public abstract void fromJson(JsonElement element); } diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/FloatOption.java b/src/main/java/com/kasetoatz/dumbassconfig/options/FloatOption.java index 8a84644..f68c97e 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/options/FloatOption.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/FloatOption.java @@ -1,11 +1,11 @@ package com.kasetoatz.dumbassconfig.options; import com.google.gson.JsonElement; -import com.kasetoatz.dumbassconfig.options.validators.Validator; +import com.kasetoatz.dumbassconfig.options.validators.AbstractValidator; public class FloatOption extends AbstractInputOption { - public FloatOption(String text, String key, Float defaultValue, Validator validator) + public FloatOption(String text, String key, Float defaultValue, AbstractValidator validator) { super(text, key, defaultValue, validator); } @@ -40,8 +40,8 @@ public class FloatOption extends AbstractInputOption } @Override - public void fromJson(JsonElement element) + public Float asPrimitive(JsonElement element) { - this.setValue(element.getAsFloat()); + return element.getAsFloat(); } } diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/IntOption.java b/src/main/java/com/kasetoatz/dumbassconfig/options/IntOption.java new file mode 100644 index 0000000..ef96104 --- /dev/null +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/IntOption.java @@ -0,0 +1,46 @@ +package com.kasetoatz.dumbassconfig.options; + +import com.google.gson.JsonElement; +import com.kasetoatz.dumbassconfig.options.validators.AbstractValidator; + +public class IntOption extends AbstractInputOption +{ + public IntOption(String text, String key, Integer defaultValue, AbstractValidator validator) + { + super(text, key, defaultValue, validator); + } + + public IntOption(String text, String key, Integer defaultValue) + { + super(text, key, defaultValue); + } + + @Override + public boolean predicate(String text) + { + if (text.isEmpty() || text.equals("-")) { + return true; + } + try + { + Integer.parseInt(text); + return true; + } + catch (NumberFormatException exc) + { + return false; + } + } + + @Override + public void changeListener(String text) + { + this.onChange((text.isEmpty() || text.equals("-")) ? 0 : Integer.parseInt(text)); + } + + @Override + public Integer asPrimitive(JsonElement element) + { + return element.getAsInt(); + } +} diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/SubOption.java b/src/main/java/com/kasetoatz/dumbassconfig/options/SubOption.java new file mode 100644 index 0000000..8ed0104 --- /dev/null +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/SubOption.java @@ -0,0 +1,85 @@ +package com.kasetoatz.dumbassconfig.options; + +import com.google.gson.Gson; +import com.google.gson.GsonBuilder; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.kasetoatz.dumbassconfig.ui.ConfigScreen; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.text.Text; + +import java.util.ArrayList; + +public class SubOption extends AbstractButtonOption +{ + private final ArrayList> options = new ArrayList<>(); + private final Gson gson = new GsonBuilder().setPrettyPrinting().create(); + private ConfigScreen ui; + + private SubOption(String text, String key) + { + super(text, key, null); + } + + @Override + public Text getButtonText() + { + return Text.literal("Open"); + } + + @Override + public void onClick(ButtonWidget button) + { + this.ui.setParent(MinecraftClient.getInstance().currentScreen); + MinecraftClient.getInstance().setScreen(this.ui); + } + + @Override + public JsonObject getValue() + { + JsonObject data = new JsonObject(); + for (AbstractOption option : this.options) + { + data.add(option.getKey(), this.gson.toJsonTree(option.getValue())); + } + return data; + } + + @Override + public void fromJson(JsonElement element) + { + JsonObject data = element.getAsJsonObject(); + for (AbstractOption option : this.options) + { + option.fromJson(data.get(option.getKey())); + } + } + + public static Builder builder(String text, String key) + { + return new Builder(text, key); + } + + public static class Builder + { + private final SubOption option; + + private Builder(String text, String key) + { + this.option = new SubOption(text, key); + } + + public Builder withOption(AbstractOption option) + { + this.option.options.add(option); + return this; + } + + public SubOption build() + { + this.option.ui = new ConfigScreen(this.option.getText(), this.option.options); + return this.option; + } + } +} diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/validators/Validator.java b/src/main/java/com/kasetoatz/dumbassconfig/options/validators/AbstractValidator.java similarity index 78% rename from src/main/java/com/kasetoatz/dumbassconfig/options/validators/Validator.java rename to src/main/java/com/kasetoatz/dumbassconfig/options/validators/AbstractValidator.java index 724db84..7387177 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/options/validators/Validator.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/validators/AbstractValidator.java @@ -1,6 +1,6 @@ package com.kasetoatz.dumbassconfig.options.validators; -public abstract class Validator +public abstract class AbstractValidator { public abstract boolean isValid(T value); public abstract String getErrorMessage(); diff --git a/src/main/java/com/kasetoatz/dumbassconfig/options/validators/RangeValidator.java b/src/main/java/com/kasetoatz/dumbassconfig/options/validators/RangeValidator.java index 8fdc269..07e2b3b 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/options/validators/RangeValidator.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/options/validators/RangeValidator.java @@ -1,6 +1,6 @@ package com.kasetoatz.dumbassconfig.options.validators; -public class RangeValidator> extends Validator +public class RangeValidator> extends AbstractValidator { private final T min; private final T max; diff --git a/src/main/java/com/kasetoatz/dumbassconfig/ui/ConfigScreen.java b/src/main/java/com/kasetoatz/dumbassconfig/ui/ConfigScreen.java index a799b6f..57f9cb7 100644 --- a/src/main/java/com/kasetoatz/dumbassconfig/ui/ConfigScreen.java +++ b/src/main/java/com/kasetoatz/dumbassconfig/ui/ConfigScreen.java @@ -18,7 +18,7 @@ public class ConfigScreen extends Screen private final List> options; private final ThreePartsLayoutWidget layout = new ThreePartsLayoutWidget(this); private ConfigEntryList body; - private Runnable saveCallback; + private Runnable saveCallback = () -> {}; public ConfigScreen(Text title, List> options) {