From 8a4d6df67917fee4b600cfad1afb7d39a75d75f1 Mon Sep 17 00:00:00 2001 From: Crendgrim Date: Fri, 21 Jul 2023 23:57:05 +0200 Subject: Small improvements to ListOption (#89) --- .../java/dev/isxander/yacl3/api/ListOption.java | 29 +++++++++++- .../dev/isxander/yacl3/gui/OptionListWidget.java | 4 +- .../yacl3/gui/controllers/ListEntryWidget.java | 2 +- .../dev/isxander/yacl3/impl/ListOptionImpl.java | 53 ++++++++++++++++++++-- 4 files changed, 80 insertions(+), 8 deletions(-) (limited to 'common/src/main/java/dev') diff --git a/common/src/main/java/dev/isxander/yacl3/api/ListOption.java b/common/src/main/java/dev/isxander/yacl3/api/ListOption.java index 8094ee7..0371c35 100644 --- a/common/src/main/java/dev/isxander/yacl3/api/ListOption.java +++ b/common/src/main/java/dev/isxander/yacl3/api/ListOption.java @@ -30,7 +30,16 @@ public interface ListOption extends OptionGroup, Option> { @NotNull ImmutableList> options(); @ApiStatus.Internal - ListOptionEntry insertNewEntryToTop(); + int numberOfEntries(); + + @ApiStatus.Internal + int maximumNumberOfEntries(); + + @ApiStatus.Internal + int minimumNumberOfEntries(); + + @ApiStatus.Internal + ListOptionEntry insertNewEntry(); @ApiStatus.Internal void insertEntry(int index, ListOptionEntry entry); @@ -105,6 +114,24 @@ public interface ListOption extends OptionGroup, Option> { */ Builder available(boolean available); + /** + * Sets a minimum size for the list. Once this size is reached, + * no further entries may be removed. + */ + Builder minimumNumberOfEntries(int number); + + /** + * Sets a maximum size for the list. Once this size is reached, + * no further entries may be added. + */ + Builder maximumNumberOfEntries(int number); + + /** + * Dictates if new entries should be added to the end of the list + * rather than the top. + */ + Builder insertEntriesAtEnd(boolean insertAtEnd); + /** * Adds a flag to the option. * Upon applying changes, all flags are executed. diff --git a/common/src/main/java/dev/isxander/yacl3/gui/OptionListWidget.java b/common/src/main/java/dev/isxander/yacl3/gui/OptionListWidget.java index 54d58f4..3197c44 100644 --- a/common/src/main/java/dev/isxander/yacl3/gui/OptionListWidget.java +++ b/common/src/main/java/dev/isxander/yacl3/gui/OptionListWidget.java @@ -485,7 +485,7 @@ public class OptionListWidget extends ElementListWidgetExt { - group.insertNewEntryToTop(); + group.insertNewEntry(); setExpanded(true); }); @@ -519,7 +519,7 @@ public class OptionListWidget extends ElementListWidgetExt listOption.minimumNumberOfEntries(); moveUpButton.active = listOption.indexOf(listOptionEntry) > 0 && listOption.available(); moveDownButton.active = listOption.indexOf(listOptionEntry) < listOption.options().size() - 1 && listOption.available(); } diff --git a/common/src/main/java/dev/isxander/yacl3/impl/ListOptionImpl.java b/common/src/main/java/dev/isxander/yacl3/impl/ListOptionImpl.java index 82f5576..25ff7ba 100644 --- a/common/src/main/java/dev/isxander/yacl3/impl/ListOptionImpl.java +++ b/common/src/main/java/dev/isxander/yacl3/impl/ListOptionImpl.java @@ -25,12 +25,15 @@ public final class ListOptionImpl implements ListOption { private final List> entries; private final boolean collapsed; private boolean available; + private final int minimumNumberOfEntries; + private final int maximumNumberOfEntries; + private final boolean insertEntriesAtEnd; private final ImmutableSet flags; private final EntryFactory entryFactory; private final List>, List>> listeners; private final List refreshListeners; - public ListOptionImpl(@NotNull Component name, @NotNull OptionDescription description, @NotNull Binding> binding, @NotNull T initialValue, @NotNull Function, Controller> controllerFunction, ImmutableSet flags, boolean collapsed, boolean available, Collection>, List>> listeners) { + public ListOptionImpl(@NotNull Component name, @NotNull OptionDescription description, @NotNull Binding> binding, @NotNull T initialValue, @NotNull Function, Controller> controllerFunction, ImmutableSet flags, boolean collapsed, boolean available, int minimumNumberOfEntries, int maximumNumberOfEntries, boolean insertEntriesAtEnd, Collection>, List>> listeners) { this.name = name; this.description = description; this.binding = binding; @@ -40,6 +43,9 @@ public final class ListOptionImpl implements ListOption { this.collapsed = collapsed; this.flags = flags; this.available = available; + this.minimumNumberOfEntries = minimumNumberOfEntries; + this.maximumNumberOfEntries = maximumNumberOfEntries; + this.insertEntriesAtEnd = insertEntriesAtEnd; this.listeners = new ArrayList<>(); this.listeners.addAll(listeners); this.refreshListeners = new ArrayList<>(); @@ -98,9 +104,14 @@ public final class ListOptionImpl implements ListOption { } @Override - public ListOptionEntry insertNewEntryToTop() { + public ListOptionEntry insertNewEntry() { ListOptionEntry newEntry = entryFactory.create(initialValue); - entries.add(0, newEntry); + if (insertEntriesAtEnd) { + entries.add(newEntry); + } else { + // insert at top + entries.add(0, newEntry); + } onRefresh(); return newEntry; } @@ -162,6 +173,19 @@ public final class ListOptionImpl implements ListOption { this.available = available; } + @Override + public int numberOfEntries() { + return this.entries.size(); + } + @Override + public int maximumNumberOfEntries() { + return this.maximumNumberOfEntries; + } + @Override + public int minimumNumberOfEntries() { + return this.minimumNumberOfEntries; + } + @Override public void addListener(BiConsumer>, List> changedListener) { this.listeners.add(changedListener); @@ -213,6 +237,9 @@ public final class ListOptionImpl implements ListOption { private T initialValue; private boolean collapsed = false; private boolean available = true; + private int minimumNumberOfEntries = 0; + private int maximumNumberOfEntries = Integer.MAX_VALUE; + private boolean insertEntriesAtEnd = false; private final List>, List>> listeners = new ArrayList<>(); @Override @@ -279,6 +306,24 @@ public final class ListOptionImpl implements ListOption { return this; } + @Override + public Builder minimumNumberOfEntries(int number) { + this.minimumNumberOfEntries = number; + return this; + } + + @Override + public Builder maximumNumberOfEntries(int number) { + this.maximumNumberOfEntries = number; + return this; + } + + @Override + public Builder insertEntriesAtEnd(boolean insertAtEnd) { + this.insertEntriesAtEnd = insertAtEnd; + return this; + } + @Override public Builder flag(@NotNull OptionFlag... flag) { Validate.notNull(flag, "`flag` must not be null"); @@ -319,7 +364,7 @@ public final class ListOptionImpl implements ListOption { Validate.notNull(binding, "`binding` must not be null"); Validate.notNull(initialValue, "`initialValue` must not be null"); - return new ListOptionImpl<>(name, description, binding, initialValue, controllerFunction, ImmutableSet.copyOf(flags), collapsed, available, listeners); + return new ListOptionImpl<>(name, description, binding, initialValue, controllerFunction, ImmutableSet.copyOf(flags), collapsed, available, minimumNumberOfEntries, maximumNumberOfEntries, insertEntriesAtEnd, listeners); } } } -- cgit