2424public class EnumController <T extends Enum <T >> implements Controller <T > {
2525 private final Option <T > option ;
2626 private final Function <T , Text > valueFormatter ;
27+ private final T [] availableValues ;
28+
29+ public static <T extends Enum <T >> Function <T , Text > getDefaultFormatter () {
30+ return value -> {
31+ if (value instanceof NameableEnum nameableEnum )
32+ return nameableEnum .getDisplayName ();
33+ if (value instanceof TranslatableOption translatableOption )
34+ return translatableOption .getText ();
35+ return Text .of (value .name ());
36+ };
37+ }
2738
2839 /**
29- * Constructs a cycling enum controller with a default value formatter.
40+ * Constructs a cycling enum controller with a default value formatter and all values being available .
3041 * The default value formatter first searches if the
3142 * enum is a {@link NameableEnum} else, just use {@link Enum#name()}
3243 *
3344 * @param option bound option
3445 */
3546 public EnumController (Option <T > option ) {
36- this (option , value -> {
37- if (value instanceof NameableEnum nameableEnum )
38- return nameableEnum .getDisplayName ();
39- if (value instanceof TranslatableOption translatableOption )
40- return translatableOption .getText ();
41- return Text .of (value .name ());
42- });
47+ this (option , getDefaultFormatter ());
4348 }
4449
4550 /**
46- * Constructs a cycling enum controller.
51+ * Constructs a cycling enum controller with all values being available .
4752 *
4853 * @param option bound option
4954 * @param valueFormatter format the enum into any {@link Text}
5055 */
5156 public EnumController (Option <T > option , Function <T , Text > valueFormatter ) {
57+ this (option , valueFormatter , option .typeClass ().getEnumConstants ());
58+ }
59+
60+ /**
61+ * Constructs a cycling enum controller.
62+ *
63+ * @param option bound option
64+ * @param valueFormatter format the enum into any {@link Text}
65+ * @param availableValues all enum constants that can be cycled through
66+ */
67+ public EnumController (Option <T > option , Function <T , Text > valueFormatter , T [] availableValues ) {
5268 this .option = option ;
5369 this .valueFormatter = valueFormatter ;
70+ this .availableValues = availableValues ;
5471 }
5572
5673 /**
@@ -74,7 +91,7 @@ public Text formatValue() {
7491 */
7592 @ Override
7693 public AbstractWidget provideWidget (YACLScreen screen , Dimension <Integer > widgetDimension ) {
77- return new EnumControllerElement <>(this , screen , widgetDimension , option (). typeClass (). getEnumConstants () );
94+ return new EnumControllerElement <>(this , screen , widgetDimension , availableValues );
7895 }
7996
8097 public static class EnumControllerElement <T extends Enum <T >> extends ControllerWidget <EnumController <T >> {
0 commit comments