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)
|