Improve keybinding support

This commit is contained in:
Linnea Gräf
2024-07-05 22:52:06 +02:00
parent 3d792dbef7
commit dc3adecc1b
6 changed files with 56 additions and 25 deletions

View File

@@ -6,6 +6,7 @@
package moe.nea.firmament.mixins; package moe.nea.firmament.mixins;
import moe.nea.firmament.gui.config.KeyBindingHandler;
import moe.nea.firmament.gui.config.ManagedConfig; import moe.nea.firmament.gui.config.ManagedConfig;
import moe.nea.firmament.keybindings.FirmamentKeyBindings; import moe.nea.firmament.keybindings.FirmamentKeyBindings;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
@@ -40,19 +41,21 @@ public class FirmKeybindsInVanillaControlsPatch {
@ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;builder(Lnet/minecraft/text/Text;Lnet/minecraft/client/gui/widget/ButtonWidget$PressAction;)Lnet/minecraft/client/gui/widget/ButtonWidget$Builder;")) @ModifyArg(method = "<init>", at = @At(value = "INVOKE", target = "Lnet/minecraft/client/gui/widget/ButtonWidget;builder(Lnet/minecraft/text/Text;Lnet/minecraft/client/gui/widget/ButtonWidget$PressAction;)Lnet/minecraft/client/gui/widget/ButtonWidget$Builder;"))
public ButtonWidget.PressAction onInit(ButtonWidget.PressAction action) { public ButtonWidget.PressAction onInit(ButtonWidget.PressAction action) {
ManagedConfig config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding); var config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding);
if (config == null) return action; if (config == null) return action;
return button -> { return button -> {
config.showConfigEditor(MinecraftClient.getInstance().currentScreen); ((KeyBindingHandler) config.getHandler())
.getManagedConfig()
.showConfigEditor(MinecraftClient.getInstance().currentScreen);
}; };
} }
@Inject(method = "update", at = @At("HEAD"), cancellable = true) @Inject(method = "update", at = @At("HEAD"), cancellable = true)
public void onUpdate(CallbackInfo ci) { public void onUpdate(CallbackInfo ci) {
ManagedConfig config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding); var config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding);
if (config == null) return; if (config == null) return;
resetButton.active = false; resetButton.active = false;
editButton.setMessage(Text.translatable("firmament.keybinding.external")); editButton.setMessage(Text.translatable("firmament.keybinding.external", config.value.format()));
ci.cancel(); ci.cancel();
} }

View File

@@ -17,16 +17,17 @@ import kotlinx.serialization.json.Json
import kotlinx.serialization.json.JsonElement import kotlinx.serialization.json.JsonElement
import kotlinx.serialization.json.decodeFromJsonElement import kotlinx.serialization.json.decodeFromJsonElement
import kotlinx.serialization.json.encodeToJsonElement import kotlinx.serialization.json.encodeToJsonElement
import net.minecraft.client.util.InputUtil
import net.minecraft.text.Text import net.minecraft.text.Text
import net.minecraft.util.Formatting import net.minecraft.util.Formatting
import moe.nea.firmament.gui.FirmButtonComponent import moe.nea.firmament.gui.FirmButtonComponent
import moe.nea.firmament.keybindings.FirmamentKeyBindings import moe.nea.firmament.keybindings.FirmamentKeyBindings
import moe.nea.firmament.keybindings.SavedKeyBinding import moe.nea.firmament.keybindings.SavedKeyBinding
class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : ManagedConfig.OptionHandler<SavedKeyBinding> { class KeyBindingHandler(val name: String, val managedConfig: ManagedConfig) :
init { ManagedConfig.OptionHandler<SavedKeyBinding> {
FirmamentKeyBindings.registerKeyBinding(name, managedConfig)
override fun initOption(opt: ManagedOption<SavedKeyBinding>) {
FirmamentKeyBindings.registerKeyBinding(name, opt)
} }
override fun toJson(element: SavedKeyBinding): JsonElement? { override fun toJson(element: SavedKeyBinding): JsonElement? {
@@ -44,19 +45,22 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
var label: String = "" var label: String = ""
var button: FirmButtonComponent? = null var button: FirmButtonComponent? = null
fun updateLabel() { fun updateLabel() {
val stroke = Text.literal("") var stroke = opt.value.format()
if (opt.value.shift) { if (editing) {
stroke.append("SHIFT + ") // TODO: translations? stroke = Text.literal("")
} val (shift, alt, ctrl) = SavedKeyBinding.getMods(SavedKeyBinding.getModInt())
if (opt.value.alt) { if (shift) {
stroke.append("ALT + ") stroke.append("SHIFT + ")
} }
if (opt.value.ctrl) { if (alt) {
stroke.append("CTRL + ") stroke.append("ALT + ")
} }
stroke.append(InputUtil.Type.KEYSYM.createFromCode(opt.value.keyCode).localizedText) if (ctrl) {
if (editing) stroke.append("CTRL + ")
}
stroke.append("???")
stroke.styled { it.withColor(Formatting.YELLOW) } stroke.styled { it.withColor(Formatting.YELLOW) }
}
label = (stroke).string label = (stroke).string
managedConfig.save() managedConfig.save()
} }
@@ -79,7 +83,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
}) { }) {
override fun keyboardEvent(event: KeyboardEvent, context: GuiImmediateContext): Boolean { override fun keyboardEvent(event: KeyboardEvent, context: GuiImmediateContext): Boolean {
if (event is KeyboardEvent.KeyPressed) { if (event is KeyboardEvent.KeyPressed) {
if (event.pressed) onKeyPressed(event.keycode, SavedKeyBinding.getModInt()) return if (event.pressed) onKeyPressed(event.keycode, SavedKeyBinding.getModInt())
else onKeyReleased(event.keycode, SavedKeyBinding.getModInt()) else onKeyReleased(event.keycode, SavedKeyBinding.getModInt())
} }
return super.keyboardEvent(event, context) return super.keyboardEvent(event, context)
@@ -100,6 +104,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
lastPressed = 0 lastPressed = 0
opt.value = SavedKeyBinding(GLFW.GLFW_KEY_UNKNOWN) opt.value = SavedKeyBinding(GLFW.GLFW_KEY_UNKNOWN)
updateLabel() updateLabel()
blur()
return true return true
} }
if (ch == GLFW.GLFW_KEY_LEFT_SHIFT || ch == GLFW.GLFW_KEY_RIGHT_SHIFT if (ch == GLFW.GLFW_KEY_LEFT_SHIFT || ch == GLFW.GLFW_KEY_RIGHT_SHIFT
@@ -112,6 +117,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
ch, modifiers ch, modifiers
) )
editing = false editing = false
blur()
lastPressed = 0 lastPressed = 0
lastPressedNonModifier = 0 lastPressedNonModifier = 0
} }
@@ -132,6 +138,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
if (lastPressedNonModifier == ch || (lastPressedNonModifier == 0 && ch == lastPressed)) { if (lastPressedNonModifier == ch || (lastPressedNonModifier == 0 && ch == lastPressed)) {
opt.value = SavedKeyBinding(ch, modifiers) opt.value = SavedKeyBinding(ch, modifiers)
editing = false editing = false
blur()
lastPressed = 0 lastPressed = 0
lastPressedNonModifier = 0 lastPressedNonModifier = 0
} }

View File

@@ -34,6 +34,7 @@ import moe.nea.firmament.util.ScreenUtil.setScreenLater
abstract class ManagedConfig(override val name: String) : ManagedConfigElement() { abstract class ManagedConfig(override val name: String) : ManagedConfigElement() {
interface OptionHandler<T : Any> { interface OptionHandler<T : Any> {
fun initOption(opt: ManagedOption<T>) {}
fun toJson(element: T): JsonElement? fun toJson(element: T): JsonElement?
fun fromJson(element: JsonElement): T fun fromJson(element: JsonElement): T
fun emitGuiElements(opt: ManagedOption<T>, guiAppender: GuiAppender) fun emitGuiElements(opt: ManagedOption<T>, guiAppender: GuiAppender)
@@ -74,6 +75,7 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement()
): ManagedOption<T> { ): ManagedOption<T> {
if (propertyName in allOptions) error("Cannot register the same name twice") if (propertyName in allOptions) error("Cannot register the same name twice")
return ManagedOption(this, propertyName, default, handler).also { return ManagedOption(this, propertyName, default, handler).also {
it.handler.initOption(it)
it.load(data) it.load(data)
allOptions[propertyName] = it allOptions[propertyName] = it
sortedOptions.add(it) sortedOptions.add(it)

View File

@@ -9,10 +9,11 @@ package moe.nea.firmament.keybindings
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper
import net.minecraft.client.option.KeyBinding import net.minecraft.client.option.KeyBinding
import net.minecraft.client.util.InputUtil import net.minecraft.client.util.InputUtil
import moe.nea.firmament.gui.config.ManagedConfig import moe.nea.firmament.gui.config.KeyBindingHandler
import moe.nea.firmament.gui.config.ManagedOption
object FirmamentKeyBindings { object FirmamentKeyBindings {
fun registerKeyBinding(name: String, config: ManagedConfig) { fun registerKeyBinding(name: String, config: ManagedOption<SavedKeyBinding>) {
val vanillaKeyBinding = KeyBindingHelper.registerKeyBinding( val vanillaKeyBinding = KeyBindingHelper.registerKeyBinding(
KeyBinding( KeyBinding(
name, name,
@@ -24,6 +25,6 @@ object FirmamentKeyBindings {
keyBindings[vanillaKeyBinding] = config keyBindings[vanillaKeyBinding] = config
} }
val keyBindings = mutableMapOf<KeyBinding, ManagedConfig>() val keyBindings = mutableMapOf<KeyBinding, ManagedOption<SavedKeyBinding>>()
} }

View File

@@ -10,6 +10,7 @@ import org.lwjgl.glfw.GLFW
import kotlinx.serialization.Serializable import kotlinx.serialization.Serializable
import net.minecraft.client.MinecraftClient import net.minecraft.client.MinecraftClient
import net.minecraft.client.util.InputUtil import net.minecraft.client.util.InputUtil
import net.minecraft.text.Text
import moe.nea.firmament.util.MC import moe.nea.firmament.util.MC
@Serializable @Serializable
@@ -87,4 +88,20 @@ data class SavedKeyBinding(
return keyCode == this.keyCode && getMods(modifiers) == Triple(shift, ctrl, alt) return keyCode == this.keyCode && getMods(modifiers) == Triple(shift, ctrl, alt)
} }
fun format(): Text {
val stroke = Text.literal("")
if (ctrl) {
stroke.append("CTRL + ")
}
if (alt) {
stroke.append("ALT + ")
}
if (shift) {
stroke.append("SHIFT + ") // TODO: translations?
}
stroke.append(InputUtil.Type.KEYSYM.createFromCode(keyCode).localizedText)
return stroke
}
} }

View File

@@ -142,7 +142,7 @@
"firmament.config.item-rarity-cosmetics.background-hotbar": "Hotbar Background Rarity", "firmament.config.item-rarity-cosmetics.background-hotbar": "Hotbar Background Rarity",
"firmament.hud.edit": "Edit %s", "firmament.hud.edit": "Edit %s",
"firmament.key.category": "Firmament", "firmament.key.category": "Firmament",
"firmament.keybinding.external": "External", "firmament.keybinding.external": "%s",
"firmament.config.slot-locking": "Slot Locking", "firmament.config.slot-locking": "Slot Locking",
"firmament.config.slot-locking.lock": "Lock Slot", "firmament.config.slot-locking.lock": "Lock Slot",
"firmament.config.slot-locking.lock-uuid": "Lock UUID (Lock Item)", "firmament.config.slot-locking.lock-uuid": "Lock UUID (Lock Item)",
@@ -150,6 +150,7 @@
"firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding", "firmament.config.fixes.auto-sprint-keybinding": "Auto Sprint KeyBinding",
"firmament.config.fixes.auto-sprint-hud": "Sprint State Hud", "firmament.config.fixes.auto-sprint-hud": "Sprint State Hud",
"firmament.config.fixes.peek-chat": "Peek Chat", "firmament.config.fixes.peek-chat": "Peek Chat",
"firmament.config.fixes.clientside-lefthand": "Fix Left Handed",
"firmament.fixes.auto-sprint.on": "Sprint toggled", "firmament.fixes.auto-sprint.on": "Sprint toggled",
"firmament.fixes.auto-sprint.sprinting": "Sprinting", "firmament.fixes.auto-sprint.sprinting": "Sprinting",
"firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting", "firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting",