package moe.nea.firmament.compat.yacl import dev.isxander.yacl3.api.Controller import dev.isxander.yacl3.api.Option import dev.isxander.yacl3.api.utils.Dimension import dev.isxander.yacl3.gui.AbstractWidget import dev.isxander.yacl3.gui.YACLScreen import dev.isxander.yacl3.gui.controllers.ControllerWidget import net.minecraft.text.Text import moe.nea.firmament.gui.config.KeyBindingHandler import moe.nea.firmament.gui.config.KeyBindingStateManager import moe.nea.firmament.gui.config.ManagedOption import moe.nea.firmament.keybindings.SavedKeyBinding class KeybindingController( val option: Option, val managedOption: ManagedOption, ) : Controller { val handler = managedOption.handler as KeyBindingHandler override fun option(): Option { return option } override fun formatValue(): Text { return option.pendingValue().format() } override fun provideWidget(screen: YACLScreen, widgetDimension: Dimension): AbstractWidget { lateinit var button: ControllerWidget val sm = KeyBindingStateManager( { option.pendingValue() }, { option.requestSet(it) }, { screen.focused = null }, { screen.focused = button }, ) button = KeybindingWidget(sm, this, screen, widgetDimension) option.addListener { t, u -> sm.updateLabel() } sm.updateLabel() return button } } class KeybindingWidget( val sm: KeyBindingStateManager, controller: KeybindingController, screen: YACLScreen, dimension: Dimension ) : ControllerWidget(controller, screen, dimension) { override fun getHoveredControlWidth(): Int { return 130 } override fun getValueText(): Text { return sm.label } override fun keyPressed(keyCode: Int, scanCode: Int, modifiers: Int): Boolean { return sm.keyboardEvent(keyCode, true) } override fun keyReleased(keyCode: Int, scanCode: Int, modifiers: Int): Boolean { return sm.keyboardEvent(keyCode, false) } override fun unfocus() { sm.onLostFocus() } override fun setFocused(focused: Boolean) { super.setFocused(focused) if (!focused) sm.onLostFocus() } override fun mouseClicked(mouseX: Double, mouseY: Double, button: Int): Boolean { if (button == 0 && isHovered) { sm.onClick() return true } return super.mouseClicked(mouseX, mouseY, button) } }