aboutsummaryrefslogtreecommitdiff
path: root/src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt
blob: a3ed7cc7ade076aa5a326e2d62a6ad3b0f29b74a (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.test

import dev.isxander.yacl3.api.OptionFlag
import dev.isxander.yacl3.api.controller.BooleanControllerBuilder
import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder
import dev.isxander.yacl3.dsl.*
import dev.isxander.yacl3.platform.YACLPlatform
import net.minecraft.client.gui.screens.Screen
import net.minecraft.network.chat.Component
import net.minecraft.resources.ResourceLocation

object Foo {
    var bar = true
    var baz = 0
}

fun kotlinDslGui(parent: Screen?) = YetAnotherConfigLib("namespace") {
    // default title with translation key:
    // `yacl3.config.namespace.title`
    /* NO CODE REQUIRED */

    // or set the title
    title(Component.literal("A cool title"))


    // usual save function
    save {
        // run your save function!
    }

    // get access to an option from the very root of the dsl!
    categories["testCategory"]["testGroup"].getOption("testOption").onReady {
        // do something with it
    }

    val testCategory by categories.registering {
        // default name with translation key:
        // `yacl3.config.namespace.testCategory.testGroup.name`
        /* NO CODE REQUIRED */

        // or set the name
        name { Component.literal("A cool category") }

        // custom tooltip
        tooltipBuilder {
            // add a line like this
            +Component.translatable("somecustomkey")

            // or like this
            text(Component.translatable("somecustomkey"))

            // or like this
            text { Component.translatable("somecustomkey") }
        }

        // you can declare things with strings
        group("testGroup") {
            // default name with translation key:
            // `yacl3.config.namespace.testCategory.testGroup.name`
            /* NO CODE REQUIRED */

            // or set the name
            name { Component.literal("A cool group") }


            // custom description builder:
            descriptionBuilder {
                // blah blah blah
            }

            // default description with translation key:
            // `yacl3.config.namespace.testCategory.testGroup.description.1-5`
            // not compatible with custom description builder
            useDefaultDescription(lines = 5)

            // you can define opts/groups/categories using this delegate syntax
            val testOption by options.registering { // type is automatically inferred from binding
                // default name with translation key:
                // `yacl3.config.namespace.testCategory.testGroup.testOption.name`
                /* NO CODE REQUIRED */

                // custom description builder:
                descriptionBuilder { value -> // changes the desc based on the current value
                    // description with translation key:
                    // `yacl3.config.namespace.testCategory.testGroup.testOption.description.1-5`
                    addDefaultDescription(lines = 5)

                    text { Component.translatable("somecustomkey") }
                    webpImage(YACLPlatform.rl("namespace", "image.png"))
                }

                // KProperties are cool!
                binding(Foo::bar, Foo.bar)

                // you can access other options like this!
                // `options` field is from the enclosing group dsl
                listener { opt, newVal ->
                    options.get<Int>("otherTestOption").onReady { it.setAvailable(newVal) }
                }

                // or even get an access to them before creation
                options.get<Int>("otherTestOption").onReady {
                    // do something with it
                }

                // you can set available with a block
                available { true }

                // regular controller stuff
                // this will be DSLed at some point
                controller(BooleanControllerBuilder::create) {
                    // blah blah blah
                }

                // flags as usual
                flag(OptionFlag.ASSET_RELOAD)
            }

            val otherTestOption by options.registering { // type is automatically inferred from binding
                controller(IntegerSliderControllerBuilder::create) {
                    range(0, 100)
                    step(5)
                }

                binding(Foo::baz, Foo.baz)

                // blah blah blah other stuff
            }
        }
    }
}.generateScreen(parent)