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

import io.github.notenoughupdates.moulconfig.ChromaColour
import io.github.notenoughupdates.moulconfig.gui.component.ColorSelectComponent
import kotlinx.serialization.KSerializer
import kotlinx.serialization.SerialName
import kotlinx.serialization.Serializable
import kotlinx.serialization.descriptors.SerialDescriptor
import kotlinx.serialization.encoding.Decoder
import kotlinx.serialization.encoding.Encoder
import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement

class ColourHandler(val config: ManagedConfig) :
	ManagedConfig.OptionHandler<ChromaColour> {
	@Serializable
	data class ChromaDelegate(
		@SerialName("h")
		val hue: Float,
		@SerialName("s")
		val saturation: Float,
		@SerialName("b")
		val brightness: Float,
		@SerialName("a")
		val alpha: Int,
		@SerialName("c")
		val timeForFullRotationInMillis: Int,
	) {
		constructor(delegate: ChromaColour) : this(
			delegate.hue,
			delegate.saturation,
			delegate.brightness,
			delegate.alpha,
			delegate.timeForFullRotationInMillis
		)

		fun into(): ChromaColour = ChromaColour(hue, saturation, brightness, alpha, timeForFullRotationInMillis)
	}

	object ChromaSerializer : KSerializer<ChromaColour> {
		override val descriptor: SerialDescriptor
			get() = SerialDescriptor("FirmChromaColour", ChromaDelegate.serializer().descriptor)

		override fun serialize(
			encoder: Encoder,
			value: ChromaColour
		) {
			encoder.encodeSerializableValue(ChromaDelegate.serializer(), ChromaDelegate(value))
		}

		override fun deserialize(decoder: Decoder): ChromaColour {
			return decoder.decodeSerializableValue(ChromaDelegate.serializer()).into()
		}
	}

	override fun toJson(element: ChromaColour): JsonElement? {
		return Json.encodeToJsonElement(ChromaSerializer, element)
	}

	override fun fromJson(element: JsonElement): ChromaColour {
		return Json.decodeFromJsonElement(ChromaSerializer, element)
	}

	override fun emitGuiElements(
		opt: ManagedOption<ChromaColour>,
		guiAppender: GuiAppender
	) {
		guiAppender.appendLabeledRow(
			opt.labelText,
			ColorSelectComponent(
				0,
				0,
				opt.value.toLegacyString(),
				{
					opt.value = ChromaColour.forLegacyString(it)
					config.save()
				},
				{ }
			)
		)
	}
}