From 6f8ef7daaafd71090b2c334c10eadc8dedc738d9 Mon Sep 17 00:00:00 2001 From: xander Date: Thu, 1 Sep 2022 08:57:59 +0100 Subject: GUI Implementation Added groups Added button "option" Added test mod --- .../isxander/yacl/gui/controllers/EnumControl.java | 77 ++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 src/main/java/dev/isxander/yacl/gui/controllers/EnumControl.java (limited to 'src/main/java/dev/isxander/yacl/gui/controllers/EnumControl.java') diff --git a/src/main/java/dev/isxander/yacl/gui/controllers/EnumControl.java b/src/main/java/dev/isxander/yacl/gui/controllers/EnumControl.java new file mode 100644 index 0000000..d032937 --- /dev/null +++ b/src/main/java/dev/isxander/yacl/gui/controllers/EnumControl.java @@ -0,0 +1,77 @@ +package dev.isxander.yacl.gui.controllers; + +import dev.isxander.yacl.api.Control; +import dev.isxander.yacl.api.NameableEnum; +import dev.isxander.yacl.api.Option; +import dev.isxander.yacl.api.utils.Dimension; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.text.Text; + +import java.util.function.Function; + +public class EnumControl> implements Control { + private final Option option; + private final Function valueFormatter; + private final Class enumClass; + + public EnumControl(Option option, Class enumClass) { + this(option, enumClass, value -> { + if (value instanceof NameableEnum nameableEnum) + return nameableEnum.getDisplayName(); + return Text.of(value.name()); + }); + } + + public EnumControl(Option option, Class enumClass, Function valueFormatter) { + this.option = option; + this.valueFormatter = valueFormatter; + this.enumClass = enumClass; + } + + @Override + public Option option() { + return option; + } + + @Override + public Text formatValue() { + return valueFormatter.apply(option().pendingValue()); + } + + @Override + public ControlWidget> provideWidget(Screen screen, Dimension widgetDimension) { + return new EnumControlElement<>(this, screen, widgetDimension, enumClass.getEnumConstants()); + } + + public static class EnumControlElement> extends ControlWidget> { + private final T[] values; + + public EnumControlElement(EnumControl control, Screen screen, Dimension dim, T[] values) { + super(control, screen, dim); + this.values = values; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (!isMouseOver(mouseX, mouseY) || (button != 0 && button != 1)) + return false; + + playDownSound(); + + int change = button == 1 || Screen.hasShiftDown() ? -1 : 1; + int targetIdx = control.option().pendingValue().ordinal() + change; + if (targetIdx >= values.length) { + targetIdx -= values.length; + } else if (targetIdx < 0) { + targetIdx += values.length; + } + control.option().requestSet(values[targetIdx]); + return true; + } + + @Override + protected int getHoveredControlWidth() { + return getUnhoveredControlWidth(); + } + } +} -- cgit