aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/gui/config/ManagedOption.kt
blob: d1aba83dae86b9d55fe273f5a497c7d91eb33a5b (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
package moe.nea.firmament.gui.config

import io.github.notenoughupdates.moulconfig.observer.GetSetter
import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.JsonObject
import kotlin.properties.ReadWriteProperty
import kotlin.reflect.KProperty
import net.minecraft.text.Text
import moe.nea.firmament.Firmament
import moe.nea.firmament.util.ErrorUtil

class ManagedOption<T : Any>(
	val element: ManagedConfig,
	val propertyName: String,
	val default: () -> T,
	val handler: ManagedConfig.OptionHandler<T>
) : ReadWriteProperty<Any?, T>, GetSetter<T> {
	override fun set(newValue: T) {
		this.value = newValue
	}

	override fun get(): T {
		return this.value
	}

	val rawLabelText = "firmament.config.${element.name}.${propertyName}"
	val labelText: Text = Text.translatable(rawLabelText)
	val descriptionTranslationKey = "firmament.config.${element.name}.${propertyName}.description"
	val labelDescription: Text = Text.translatable(descriptionTranslationKey)

	lateinit var value: T

	override fun setValue(thisRef: Any?, property: KProperty<*>, value: T) {
		this.value = value
	}

	override fun getValue(thisRef: Any?, property: KProperty<*>): T {
		return value
	}

	fun load(root: JsonElement) {
		if (root is JsonObject && root.containsKey(propertyName)) {
			try {
				value = handler.fromJson(root[propertyName]!!)
				return
			} catch (e: Exception) {
				ErrorUtil.softError(
					"Exception during loading of config file ${element.name}. This will reset this config.",
					e
				)
			}
		}
		value = default()
	}

	fun toJson(): JsonElement? {
		return handler.toJson(value)
	}

	fun appendToGui(guiapp: GuiAppender) {
		handler.emitGuiElements(this, guiapp)
	}
}