Add better key binding support

This commit is contained in:
nea
2023-08-25 14:18:43 +02:00
parent a79452c254
commit 7842319416
10 changed files with 262 additions and 26 deletions

View File

@@ -7,17 +7,24 @@
package moe.nea.firmament.keybindings
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper
import org.lwjgl.glfw.GLFW
import net.minecraft.client.option.KeyBinding
import net.minecraft.client.util.InputUtil
import moe.nea.firmament.features.inventory.SlotLocking
import moe.nea.firmament.gui.config.ManagedConfig
object FirmamentKeyBindings {
val SLOT_LOCKING = KeyBindingHelper.registerKeyBinding(
KeyBinding(
"firmament.key.slotlocking",
InputUtil.Type.KEYSYM,
GLFW.GLFW_KEY_L,
"firmament.key.category"
fun registerKeyBinding(name: String, config: ManagedConfig) {
val vanillaKeyBinding = KeyBindingHelper.registerKeyBinding(
KeyBinding(
name,
InputUtil.Type.KEYSYM,
-1,
"firmament.key.category"
)
)
)
keyBindings[vanillaKeyBinding] = config
}
val keyBindings = mutableMapOf<KeyBinding, ManagedConfig>()
}

View File

@@ -0,0 +1,36 @@
package moe.nea.firmament.keybindings
import kotlinx.serialization.Serializable
import org.lwjgl.glfw.GLFW
@Serializable
data class SavedKeyBinding(
val keyCode: Int,
val shift: Boolean = false,
val ctrl: Boolean = false,
val alt: Boolean = false,
) : IKeyBinding {
constructor(keyCode: Int, mods: Triple<Boolean, Boolean, Boolean>) : this(
keyCode,
mods.first && keyCode != GLFW.GLFW_KEY_LEFT_SHIFT && keyCode != GLFW.GLFW_KEY_RIGHT_SHIFT,
mods.second && keyCode != GLFW.GLFW_KEY_LEFT_CONTROL && keyCode != GLFW.GLFW_KEY_RIGHT_CONTROL,
mods.third && keyCode != GLFW.GLFW_KEY_LEFT_ALT && keyCode != GLFW.GLFW_KEY_RIGHT_ALT,
)
constructor(keyCode: Int, mods: Int) : this(keyCode, getMods(mods))
companion object {
fun getMods(modifiers: Int): Triple<Boolean, Boolean, Boolean> {
return Triple(
modifiers and GLFW.GLFW_MOD_SHIFT != 0,
modifiers and GLFW.GLFW_MOD_CONTROL != 0,
modifiers and GLFW.GLFW_MOD_ALT != 0
)
}
}
override fun matches(keyCode: Int, scanCode: Int, modifiers: Int): Boolean {
return keyCode == this.keyCode && getMods(modifiers) == Triple(shift, ctrl, alt)
}
}