feat: MoulConfig config gui

This commit is contained in:
Linnea Gräf
2024-11-12 17:02:08 +01:00
parent 9763a4caa4
commit b774daef5b
14 changed files with 691 additions and 22 deletions

View File

@@ -4,7 +4,6 @@ import io.github.notenoughupdates.moulconfig.observer.ObservableList
import io.github.notenoughupdates.moulconfig.xml.Bind
import net.minecraft.client.gui.screen.Screen
import net.minecraft.text.Text
import moe.nea.firmament.repo.RepoManager
import moe.nea.firmament.util.MC
import moe.nea.firmament.util.MoulConfigUtils
import moe.nea.firmament.util.ScreenUtil.setScreenLater
@@ -18,6 +17,7 @@ object AllConfigsGui {
object ConfigConfig : ManagedConfig("configconfig", Category.META) {
val enableYacl by toggle("enable-yacl") { false }
val enableMoulConfig by toggle("enable-moulconfig") { false }
}
fun <T> List<T>.toObservableList(): ObservableList<T> = ObservableList(this)
@@ -67,7 +67,11 @@ object AllConfigsGui {
}
fun makeScreen(parent: Screen? = null): Screen {
val wantedKey = if (ConfigConfig.enableYacl) "yacl" else "builtin"
val wantedKey = when {
ConfigConfig.enableMoulConfig -> "moulconfig"
ConfigConfig.enableYacl -> "yacl"
else -> "builtin"
}
val provider = FirmamentConfigScreenProvider.providers.find { it.key == wantedKey }
?: FirmamentConfigScreenProvider.providers.first()
return provider.open(parent)

View File

@@ -1,9 +1,7 @@
package moe.nea.firmament.gui.config
import java.util.ServiceLoader
import kotlin.streams.asSequence
import net.minecraft.client.gui.screen.Screen
import moe.nea.firmament.Firmament
import moe.nea.firmament.util.compatloader.CompatLoader
interface FirmamentConfigScreenProvider {
val key: String
@@ -11,17 +9,10 @@ interface FirmamentConfigScreenProvider {
fun open(parent: Screen?): Screen
companion object {
private val loader = ServiceLoader.load(FirmamentConfigScreenProvider::class.java)
companion object : CompatLoader<FirmamentConfigScreenProvider>(FirmamentConfigScreenProvider::class) {
val providers by lazy {
loader.stream().asSequence().mapNotNull { service ->
kotlin.runCatching { service.get() }
.getOrElse {
Firmament.logger.warn("Could not load config provider ${service.type()}", it)
null
}
}.filter { it.isEnabled }
allValidInstances
.filter { it.isEnabled }
.sortedWith(Comparator.comparing(
{ it.key },
Comparator<String> { left, right ->

View File

@@ -30,7 +30,7 @@ class KeyBindingHandler(val name: String, val managedConfig: ManagedConfig) :
return Json.decodeFromJsonElement(element)
}
override fun emitGuiElements(opt: ManagedOption<SavedKeyBinding>, guiAppender: GuiAppender) {
fun createButtonComponent(opt: ManagedOption<SavedKeyBinding>): FirmButtonComponent {
lateinit var button: FirmButtonComponent
val sm = KeyBindingStateManager(
{ opt.value },
@@ -67,7 +67,11 @@ class KeyBindingHandler(val name: String, val managedConfig: ManagedConfig) :
}
}
sm.updateLabel()
guiAppender.appendLabeledRow(opt.labelText, button)
return button
}
override fun emitGuiElements(opt: ManagedOption<SavedKeyBinding>, guiAppender: GuiAppender) {
guiAppender.appendLabeledRow(opt.labelText, createButtonComponent(opt))
}
}

View File

@@ -176,7 +176,7 @@ abstract class ManagedConfig(
}
val translationKey get() = "firmament.config.${name}"
val labelText = Text.translatable(translationKey)
val labelText: Text = Text.translatable(translationKey)
fun getConfigEditor(parent: Screen? = null): Screen {
var screen: Screen? = null

View File

@@ -234,6 +234,19 @@ object MoulConfigUtils {
// TODO: move this utility into moulconfig (also rework guicontext into an interface so i can make this mesh better into vanilla)
fun GuiContext.adopt(element: GuiComponent) = element.foldRecursive(Unit, { comp, unit -> comp.context = this })
inline fun <T, R> GetSetter<T>.xmap(crossinline fromT: (T) -> R, crossinline toT: (R) -> T): GetSetter<R> {
val outer = this
return object : GetSetter<R> {
override fun get(): R {
return fromT(outer.get())
}
override fun set(newValue: R) {
outer.set(toT(newValue))
}
}
}
fun clickMCComponentInPlace(
component: GuiComponent,
x: Int,