diff options
-rw-r--r-- | src/client/java/dev/isxander/yacl/api/LabelOption.java | 27 | ||||
-rw-r--r-- | src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java | 45 |
2 files changed, 67 insertions, 5 deletions
diff --git a/src/client/java/dev/isxander/yacl/api/LabelOption.java b/src/client/java/dev/isxander/yacl/api/LabelOption.java index a1bbe28..0e8202b 100644 --- a/src/client/java/dev/isxander/yacl/api/LabelOption.java +++ b/src/client/java/dev/isxander/yacl/api/LabelOption.java @@ -2,6 +2,9 @@ package dev.isxander.yacl.api; import dev.isxander.yacl.impl.LabelOptionImpl; import net.minecraft.text.Text; +import org.jetbrains.annotations.NotNull; + +import java.util.Collection; /** * A label option is an easier way of creating a label with a {@link dev.isxander.yacl.gui.controllers.LabelController}. @@ -9,12 +12,30 @@ import net.minecraft.text.Text; * {@link Text} styling. */ public interface LabelOption extends Option<Text> { - Text label(); + @NotNull Text label(); /** - * Creates a new label option with the given label. + * Creates a new label option with the given label, skipping a builder for ease. */ - static LabelOption create(Text label) { + static LabelOption create(@NotNull Text label) { return new LabelOptionImpl(label); } + + static Builder createBuilder() { + return new LabelOptionImpl.BuilderImpl(); + } + + interface Builder { + /** + * Appends a line to the label + */ + Builder line(@NotNull Text line); + + /** + * Appends multiple lines to the label + */ + Builder lines(@NotNull Collection<? extends Text> lines); + + LabelOption build(); + } } diff --git a/src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java b/src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java index 314c2ad..a816b82 100644 --- a/src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java +++ b/src/client/java/dev/isxander/yacl/impl/LabelOptionImpl.java @@ -3,12 +3,20 @@ package dev.isxander.yacl.impl; import com.google.common.collect.ImmutableSet; import dev.isxander.yacl.api.*; import dev.isxander.yacl.gui.controllers.LabelController; +import net.minecraft.text.MutableText; import net.minecraft.text.Text; +import org.apache.commons.lang3.Validate; +import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Iterator; +import java.util.List; import java.util.function.BiConsumer; -public class LabelOptionImpl implements LabelOption { +@ApiStatus.Internal +public final class LabelOptionImpl implements LabelOption { private final Text label; private final Text name = Text.literal("Label Option"); private final Text tooltip = Text.empty(); @@ -22,7 +30,7 @@ public class LabelOptionImpl implements LabelOption { } @Override - public Text label() { + public @NotNull Text label() { return label; } @@ -110,4 +118,37 @@ public class LabelOptionImpl implements LabelOption { public void addListener(BiConsumer<Option<Text>, Text> changedListener) { } + + @ApiStatus.Internal + public static final class BuilderImpl implements LabelOption.Builder { + private final List<Text> lines = new ArrayList<>(); + + @Override + public Builder line(@NotNull Text line) { + Validate.notNull(line, "`line` must not be null"); + + this.lines.add(line); + return this; + } + + @Override + public Builder lines(@NotNull Collection<? extends Text> lines) { + this.lines.addAll(lines); + return this; + } + + @Override + public LabelOption build() { + MutableText text = Text.empty(); + Iterator<Text> iterator = lines.iterator(); + while (iterator.hasNext()) { + text.append(iterator.next()); + + if (iterator.hasNext()) + text.append("\n"); + } + + return new LabelOptionImpl(text); + } + } } |