diff options
Diffstat (limited to 'src/testmod/kotlin/dev')
-rw-r--r-- | src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt | 177 |
1 files changed, 96 insertions, 81 deletions
diff --git a/src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt b/src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt index a3ed7cc..9335fb4 100644 --- a/src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt +++ b/src/testmod/kotlin/dev/isxander/yacl3/test/DslTest.kt @@ -1,131 +1,146 @@ package dev.isxander.yacl3.test +import com.mojang.serialization.Codec import dev.isxander.yacl3.api.OptionFlag -import dev.isxander.yacl3.api.controller.BooleanControllerBuilder -import dev.isxander.yacl3.api.controller.IntegerSliderControllerBuilder +import dev.isxander.yacl3.config.v3.JsonFileCodecConfig +import dev.isxander.yacl3.config.v3.register 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.network.chat.ComponentSerialization import net.minecraft.resources.ResourceLocation -object Foo { - var bar = true - var baz = 0 -} +object CodecConfigKt : JsonFileCodecConfig(YACLPlatform.getConfigDir().resolve("codec_config_kt.json")) { + val myInt by register<Int>(0, Codec.INT) -fun kotlinDslGui(parent: Screen?) = YetAnotherConfigLib("namespace") { - // default title with translation key: - // `yacl3.config.namespace.title` - /* NO CODE REQUIRED */ + val myString by register<String>("default", Codec.STRING) - // or set the title - title(Component.literal("A cool title")) + val myBoolean by register<Boolean>(false, Codec.BOOL) + val myIdentifier by register<ResourceLocation>(YACLPlatform.rl("test"), ResourceLocation.CODEC) - // usual save function - save { - // run your save function! - } + val myText by register<Component>(Component.literal("Hello, World!"), ComponentSerialization.CODEC) - // get access to an option from the very root of the dsl! - categories["testCategory"]["testGroup"].getOption("testOption").onReady { - // do something with it + init { + if (!loadFromFile()) { + saveToFile() + } } - val testCategory by categories.registering { - // default name with translation key: - // `yacl3.config.namespace.testCategory.testGroup.name` + fun generateConfigScreen(lastScreen: Screen?) = YetAnotherConfigLib("namespace") { + // default title with translation key: + // `yacl3.config.namespace.title` /* NO CODE REQUIRED */ - // or set the name - name { Component.literal("A cool category") } + // or set the title + title(Component.literal("A cool title")) - // custom tooltip - tooltipBuilder { - // add a line like this - +Component.translatable("somecustomkey") - // or like this - text(Component.translatable("somecustomkey")) + // usual save function + save { + // run your save function! + saveToFile() + } - // or like this - text { Component.translatable("somecustomkey") } + // get access to an option from the very root of the dsl! + categories["testCategory"]["testGroup"].futureRef<String>("myIntOption").onReady { + // do something with it } - // you can declare things with strings - group("testGroup") { + 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 group") } + name { Component.literal("A cool category") } + + // custom tooltip + tooltip { + // add a line like this + +Component.translatable("somecustomkey") + // or like this + text(Component.translatable("somecustomkey")) - // custom description builder: - descriptionBuilder { - // blah blah blah + // or like this + text { Component.translatable("somecustomkey") } } - // default description with translation key: - // `yacl3.config.namespace.testCategory.testGroup.description.1-5` - // not compatible with custom description builder - useDefaultDescription(lines = 5) + // creates a label with the id `testLabel` + val testLabel by rootOptions.registeringLabel - // you can define opts/groups/categories using this delegate syntax - val testOption by options.registering { // type is automatically inferred from binding + // you can declare things with strings + groups.register("testGroup") { // default name with translation key: - // `yacl3.config.namespace.testCategory.testGroup.testOption.name` + // `yacl3.config.namespace.testCategory.testGroup.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) + // or set the name + name { Component.literal("A cool group") } + - text { Component.translatable("somecustomkey") } - webpImage(YACLPlatform.rl("namespace", "image.png")) + // custom description builder: + descriptionBuilder { + // default description with translation key: + // `yacl3.config.namespace.testCategory.testGroup.description.1-5` + // not compatible with custom description builder + addDefaultText(lines = 5) } - // KProperties are cool! - binding(Foo::bar, Foo.bar) + // you can define opts/groups/categories using this delegate syntax + val myIntOption by options.registering<Int> { // type is automatically inferred from binding + // default name with translation key: + // `yacl3.config.namespace.testCategory.testGroup.testOption.name` + /* NO CODE REQUIRED */ - // 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) } - } + // custom description builder: + descriptionBuilderDyn { value -> // changes the desc based on the current value + // description with translation key: + // `yacl3.config.namespace.testCategory.testGroup.testOption.description.1-5` + addDefaultText(lines = 5) - // or even get an access to them before creation - options.get<Int>("otherTestOption").onReady { - // do something with it - } + text { Component.translatable("somecustomkey") } + webpImage(YACLPlatform.rl("namespace", "image.png")) + } - // you can set available with a block - available { true } + // Codecs! + binding = myInt.asBinding() - // regular controller stuff - // this will be DSLed at some point - controller(BooleanControllerBuilder::create) { - // blah blah blah - } + // you can access other options like this! + // `options` field is from the enclosing group dsl + listener { opt, newVal -> + options.futureRef<String>("myString").onReady { - // flags as usual - flag(OptionFlag.ASSET_RELOAD) - } + } + } + + // or use a delegated property to create a reference to an option + val myStringOption by options.ref<String>() // nullable + + // you can set available with a property + available = true + // ...or a block + available { true } + + // cool custom controller functions + controller = slider(range = 5..10, step = 1) - val otherTestOption by options.registering { // type is automatically inferred from binding - controller(IntegerSliderControllerBuilder::create) { - range(0, 100) - step(5) + // flags as usual + flag(OptionFlag.ASSET_RELOAD) } - binding(Foo::baz, Foo.baz) + // codec config api automatically sets binding and name + val myStringOption = options.register(myString) { + controller = stringField() + } - // blah blah blah other stuff + val myBooleanOption = options.register(myBoolean) { + // custom formatters for these cool controller functions + controller = textSwitch { bool -> Component.literal(bool.toString()) } + } } } - } -}.generateScreen(parent) + }.generateScreen(lastScreen) +} |