aboutsummaryrefslogtreecommitdiff
path: root/src/main/kotlin/gui/config/ManagedOption.kt
diff options
context:
space:
mode:
Diffstat (limited to 'src/main/kotlin/gui/config/ManagedOption.kt')
-rw-r--r--src/main/kotlin/gui/config/ManagedOption.kt62
1 files changed, 62 insertions, 0 deletions
diff --git a/src/main/kotlin/gui/config/ManagedOption.kt b/src/main/kotlin/gui/config/ManagedOption.kt
new file mode 100644
index 0000000..b7264e8
--- /dev/null
+++ b/src/main/kotlin/gui/config/ManagedOption.kt
@@ -0,0 +1,62 @@
+
+
+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
+
+class ManagedOption<T : Any>(
+ val element: ManagedConfigElement,
+ 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.translatable(rawLabelText)
+
+ 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) {
+ Firmament.logger.error(
+ "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)
+ }
+}