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.client.gui.Click import net.minecraft.client.input.KeyInput 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.GenericInputButton 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(keyEvent: KeyInput): Boolean { return sm.keyboardEvent(GenericInputButton.of(keyEvent), true) } override fun keyReleased(keyEvent: KeyInput): Boolean { return sm.keyboardEvent(GenericInputButton.of(keyEvent), false) } override fun unfocus() { sm.onLostFocus() } override fun setFocused(focused: Boolean) { super.setFocused(focused) if (!focused) sm.onLostFocus() } override fun mouseClicked(mouseButtonEvent: Click, doubleClick: Boolean): Boolean { if (isHovered) { sm.onClick(mouseButtonEvent.button()) return true } return super.mouseClicked(mouseButtonEvent, doubleClick) } }