aboutsummaryrefslogtreecommitdiff
path: root/common/src/main/java/dev/isxander/yacl3/api/OptionGroup.java
blob: 8f183b9112e28e975047f74f51ae05a8f838e503 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
package dev.isxander.yacl3.api;

import com.google.common.collect.ImmutableList;
import dev.isxander.yacl3.impl.OptionGroupImpl;
import net.minecraft.network.chat.Component;
import org.jetbrains.annotations.NotNull;

import java.util.Collection;
import java.util.function.Supplier;

/**
 * Serves as a separator between multiple chunks of options
 * that may be too similar or too few to be placed in a separate {@link ConfigCategory}.
 * Or maybe you just want your config to feel less dense.
 */
public interface OptionGroup {
    /**
     * Name of the option group, displayed as a separator in the option lists.
     * Can be empty.
     */
    Component name();

    OptionDescription description();

    /**
     * Tooltip displayed on hover.
     */
    @Deprecated
    Component tooltip();

    /**
     * List of all options in the group
     */
    @NotNull ImmutableList<? extends Option<?>> options();

    /**
     * Dictates if the group should be collapsed by default.
     */
    boolean collapsed();

    /**
     * Always false when using the {@link Builder}
     * used to not render the separator if true
     */
    boolean isRoot();

    /**
     * Creates a builder to construct a {@link OptionGroup}
     */
    static Builder createBuilder() {
        return new OptionGroupImpl.BuilderImpl();
    }

    interface Builder extends OptionAddable {
        /**
         * Sets name of the group, can be {@link Component#empty()} to just separate options, like sodium.
         *
         * @see OptionGroup#name()
         */
        Builder name(@NotNull Component name);

        Builder description(@NotNull OptionDescription description);

        /**
         * Adds an option to group.
         * To construct an option, use {@link Option#createBuilder(Class)}
         *
         * @see OptionGroup#options()
         */
        @Override
        Builder option(@NotNull Option<?> option);

        /**
         * Adds an option to this group.
         * To construct an option, use {@link Option#createBuilder()}
         *
         * @param optionSupplier to be called to initialise the option. called immediately
         * @return this
         */
        @Override
        default Builder option(@NotNull Supplier<@NotNull Option<?>> optionSupplier) {
            OptionAddable.super.option(optionSupplier);
            return this;
        }

        /**
         * Adds an option to this group if a condition is met.
         * To construct an option, use {@link Option#createBuilder()}
         *
         * @param condition only if true is the option added
         * @return this
         */
        @Override
        default Builder optionIf(boolean condition, @NotNull Option<?> option) {
            OptionAddable.super.optionIf(condition, option);
            return this;
        }

        /**
         * Adds an option to this group if a condition is met.
         * To construct an option, use {@link Option#createBuilder()}
         *
         * @param condition only if true is the option added
         * @param optionSupplier to be called to initialise the option. called immediately only if condition is true
         * @return this
         */
        @Override
        default Builder optionIf(boolean condition, @NotNull Supplier<@NotNull Option<?>> optionSupplier) {
            OptionAddable.super.optionIf(condition, optionSupplier);
            return this;
        }

        /**
         * Adds multiple options to group.
         * To construct an option, use {@link Option#createBuilder()}
         *
         * @see OptionGroup#options()
         */
        @Override
        Builder options(@NotNull Collection<? extends Option<?>> options);

        /**
         * Dictates if the group should be collapsed by default
         *
         * @see OptionGroup#collapsed()
         */
        Builder collapsed(boolean collapsible);

        OptionGroup build();
    }
}