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(); } } }