aboutsummaryrefslogtreecommitdiff
path: root/common/src/main/java/dev/isxander/yacl/api/Option.java
diff options
context:
space:
mode:
authorXander <xander@isxander.dev>2023-04-25 16:28:41 +0100
committerGitHub <noreply@github.com>2023-04-25 16:28:41 +0100
commit13c7ba45ff201423eb8dba8a40cfb66ebb531439 (patch)
tree1e799aa9da11fbc0833bc6b7c6e6799633c2ec50 /common/src/main/java/dev/isxander/yacl/api/Option.java
parent8ba7196ae990fe9aa98680aba1b387e385fff99c (diff)
downloadYetAnotherConfigLib-13c7ba45ff201423eb8dba8a40cfb66ebb531439.tar.gz
YetAnotherConfigLib-13c7ba45ff201423eb8dba8a40cfb66ebb531439.tar.bz2
YetAnotherConfigLib-13c7ba45ff201423eb8dba8a40cfb66ebb531439.zip
Architectury! (#61)
Diffstat (limited to 'common/src/main/java/dev/isxander/yacl/api/Option.java')
-rw-r--r--common/src/main/java/dev/isxander/yacl/api/Option.java227
1 files changed, 227 insertions, 0 deletions
diff --git a/common/src/main/java/dev/isxander/yacl/api/Option.java b/common/src/main/java/dev/isxander/yacl/api/Option.java
new file mode 100644
index 0000000..a6c0311
--- /dev/null
+++ b/common/src/main/java/dev/isxander/yacl/api/Option.java
@@ -0,0 +1,227 @@
+package dev.isxander.yacl.api;
+
+import com.google.common.collect.ImmutableSet;
+import dev.isxander.yacl.impl.OptionImpl;
+import net.minecraft.network.chat.Component;
+import org.jetbrains.annotations.NotNull;
+
+import java.util.*;
+import java.util.function.BiConsumer;
+import java.util.function.Consumer;
+import java.util.function.Function;
+import java.util.function.Supplier;
+
+public interface Option<T> {
+ /**
+ * Name of the option
+ */
+ @NotNull Component name();
+
+ /**
+ * Tooltip (or description) of the option.
+ * Rendered on hover.
+ */
+ @NotNull Component tooltip();
+
+ /**
+ * Widget provider for a type of option.
+ *
+ * @see dev.isxander.yacl.gui.controllers
+ */
+ @NotNull Controller<T> controller();
+
+ /**
+ * Binding for the option.
+ * Controls setting, getting and default value.
+ *
+ * @see Binding
+ */
+ @NotNull Binding<T> binding();
+
+ /**
+ * If the option can be configured
+ */
+ boolean available();
+
+ /**
+ * Sets if the option can be configured after being built
+ *
+ * @see Option#available()
+ */
+ void setAvailable(boolean available);
+
+ /**
+ * Class of the option type.
+ * Used by some controllers.
+ */
+ @NotNull Class<T> typeClass();
+
+ /**
+ * Tasks that needs to be executed upon applying changes.
+ */
+ @NotNull ImmutableSet<OptionFlag> flags();
+
+ /**
+ * Checks if the pending value is not equal to the current set value
+ */
+ boolean changed();
+
+ /**
+ * Value in the GUI, ready to set the actual bound value or be undone.
+ */
+ @NotNull T pendingValue();
+
+ /**
+ * Sets the pending value
+ */
+ void requestSet(T value);
+
+ /**
+ * Applies the pending value to the bound value.
+ * Cannot be undone.
+ *
+ * @return if there were changes to apply {@link Option#changed()}
+ */
+ boolean applyValue();
+
+ /**
+ * Sets the pending value to the bound value.
+ */
+ void forgetPendingValue();
+
+ /**
+ * Sets the pending value to the default bound value.
+ */
+ void requestSetDefault();
+
+ /**
+ * Checks if the current pending value is equal to its default value
+ */
+ boolean isPendingValueDefault();
+
+ default boolean canResetToDefault() {
+ return true;
+ }
+
+ /**
+ * Adds a listener for when the pending value changes
+ */
+ void addListener(BiConsumer<Option<T>, T> changedListener);
+
+ /**
+ * Creates a builder to construct an {@link Option}
+ *
+ * @param <T> type of the option's value
+ * @param typeClass used to capture the type
+ */
+ static <T> Builder<T> createBuilder(Class<T> typeClass) {
+ return new OptionImpl.BuilderImpl<>(typeClass);
+ }
+
+ interface Builder<T> {
+ /**
+ * Sets the name to be used by the option.
+ *
+ * @see Option#name()
+ */
+ Builder<T> name(@NotNull Component name);
+
+ /**
+ * Sets the tooltip to be used by the option.
+ * No need to wrap the text yourself, the gui does this itself.
+ *
+ * @param tooltipGetter function to get tooltip depending on value {@link Builder#build()}.
+ */
+ Builder<T> tooltip(@NotNull Function<T, Component> tooltipGetter);
+
+ /**
+ * Sets the tooltip to be used by the option.
+ * No need to wrap the text yourself, the gui does this itself.
+ *
+ * @param tooltipGetter function to get tooltip depending on value {@link Builder#build()}.
+ */
+ @Deprecated
+ Builder<T> tooltip(@NotNull Function<T, Component>... tooltipGetter);
+
+ /**
+ * Sets the tooltip to be used by the option.
+ * Can be invoked twice to append more lines.
+ * No need to wrap the text yourself, the gui does this itself.
+ *
+ * @param tooltips text lines - merged with a new-line on {@link Builder#build()}.
+ */
+ Builder<T> tooltip(@NotNull Component... tooltips);
+
+ /**
+ * Sets the controller for the option.
+ * This is how you interact and change the options.
+ *
+ * @see dev.isxander.yacl.gui.controllers
+ */
+ Builder<T> controller(@NotNull Function<Option<T>, Controller<T>> control);
+
+ /**
+ * Sets the binding for the option.
+ * Used for default, getter and setter.
+ *
+ * @see Binding
+ */
+ Builder<T> binding(@NotNull Binding<T> binding);
+
+ /**
+ * Sets the binding for the option.
+ * Shorthand of {@link Binding#generic(Object, Supplier, Consumer)}
+ *
+ * @param def default value of the option, used to reset
+ * @param getter should return the current value of the option
+ * @param setter should set the option to the supplied value
+ * @see Binding
+ */
+ Builder<T> binding(@NotNull T def, @NotNull Supplier<@NotNull T> getter, @NotNull Consumer<@NotNull T> setter);
+
+ /**
+ * Sets if the option can be configured
+ *
+ * @see Option#available()
+ */
+ Builder<T> available(boolean available);
+
+ /**
+ * Adds a flag to the option.
+ * Upon applying changes, all flags are executed.
+ * {@link Option#flags()}
+ */
+ Builder<T> flag(@NotNull OptionFlag... flag);
+
+ /**
+ * Adds a flag to the option.
+ * Upon applying changes, all flags are executed.
+ * {@link Option#flags()}
+ */
+ Builder<T> flags(@NotNull Collection<OptionFlag> flags);
+
+ /**
+ * Instantly invokes the binder's setter when modified in the GUI.
+ * Prevents the user from undoing the change
+ * <p>
+ * Does not support {@link Option#flags()}!
+ */
+ Builder<T> instant(boolean instant);
+
+ /**
+ * Adds a listener to the option. Invoked upon changing the pending value.
+ *
+ * @see Option#addListener(BiConsumer)
+ */
+ Builder<T> listener(@NotNull BiConsumer<Option<T>, T> listener);
+
+ /**
+ * Adds multiple listeners to the option. Invoked upon changing the pending value.
+ *
+ * @see Option#addListener(BiConsumer)
+ */
+ Builder<T> listeners(@NotNull Collection<BiConsumer<Option<T>, T>> listeners);
+
+ Option<T> build();
+ }
+}