Improve keybinding support
This commit is contained in:
@@ -6,6 +6,7 @@
|
||||
|
||||
package moe.nea.firmament.mixins;
|
||||
|
||||
import moe.nea.firmament.gui.config.KeyBindingHandler;
|
||||
import moe.nea.firmament.gui.config.ManagedConfig;
|
||||
import moe.nea.firmament.keybindings.FirmamentKeyBindings;
|
||||
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;"))
|
||||
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;
|
||||
return button -> {
|
||||
config.showConfigEditor(MinecraftClient.getInstance().currentScreen);
|
||||
((KeyBindingHandler) config.getHandler())
|
||||
.getManagedConfig()
|
||||
.showConfigEditor(MinecraftClient.getInstance().currentScreen);
|
||||
};
|
||||
}
|
||||
|
||||
@Inject(method = "update", at = @At("HEAD"), cancellable = true)
|
||||
public void onUpdate(CallbackInfo ci) {
|
||||
ManagedConfig config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding);
|
||||
var config = FirmamentKeyBindings.INSTANCE.getKeyBindings().get(binding);
|
||||
if (config == null) return;
|
||||
resetButton.active = false;
|
||||
editButton.setMessage(Text.translatable("firmament.keybinding.external"));
|
||||
editButton.setMessage(Text.translatable("firmament.keybinding.external", config.value.format()));
|
||||
ci.cancel();
|
||||
}
|
||||
|
||||
|
||||
@@ -17,16 +17,17 @@ import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonElement
|
||||
import kotlinx.serialization.json.decodeFromJsonElement
|
||||
import kotlinx.serialization.json.encodeToJsonElement
|
||||
import net.minecraft.client.util.InputUtil
|
||||
import net.minecraft.text.Text
|
||||
import net.minecraft.util.Formatting
|
||||
import moe.nea.firmament.gui.FirmButtonComponent
|
||||
import moe.nea.firmament.keybindings.FirmamentKeyBindings
|
||||
import moe.nea.firmament.keybindings.SavedKeyBinding
|
||||
|
||||
class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : ManagedConfig.OptionHandler<SavedKeyBinding> {
|
||||
init {
|
||||
FirmamentKeyBindings.registerKeyBinding(name, managedConfig)
|
||||
class KeyBindingHandler(val name: String, val managedConfig: ManagedConfig) :
|
||||
ManagedConfig.OptionHandler<SavedKeyBinding> {
|
||||
|
||||
override fun initOption(opt: ManagedOption<SavedKeyBinding>) {
|
||||
FirmamentKeyBindings.registerKeyBinding(name, opt)
|
||||
}
|
||||
|
||||
override fun toJson(element: SavedKeyBinding): JsonElement? {
|
||||
@@ -44,19 +45,22 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
|
||||
var label: String = ""
|
||||
var button: FirmButtonComponent? = null
|
||||
fun updateLabel() {
|
||||
val stroke = Text.literal("")
|
||||
if (opt.value.shift) {
|
||||
stroke.append("SHIFT + ") // TODO: translations?
|
||||
var stroke = opt.value.format()
|
||||
if (editing) {
|
||||
stroke = Text.literal("")
|
||||
val (shift, alt, ctrl) = SavedKeyBinding.getMods(SavedKeyBinding.getModInt())
|
||||
if (shift) {
|
||||
stroke.append("SHIFT + ")
|
||||
}
|
||||
if (opt.value.alt) {
|
||||
if (alt) {
|
||||
stroke.append("ALT + ")
|
||||
}
|
||||
if (opt.value.ctrl) {
|
||||
if (ctrl) {
|
||||
stroke.append("CTRL + ")
|
||||
}
|
||||
stroke.append(InputUtil.Type.KEYSYM.createFromCode(opt.value.keyCode).localizedText)
|
||||
if (editing)
|
||||
stroke.append("???")
|
||||
stroke.styled { it.withColor(Formatting.YELLOW) }
|
||||
}
|
||||
label = (stroke).string
|
||||
managedConfig.save()
|
||||
}
|
||||
@@ -79,7 +83,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
|
||||
}) {
|
||||
override fun keyboardEvent(event: KeyboardEvent, context: GuiImmediateContext): Boolean {
|
||||
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())
|
||||
}
|
||||
return super.keyboardEvent(event, context)
|
||||
@@ -100,6 +104,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
|
||||
lastPressed = 0
|
||||
opt.value = SavedKeyBinding(GLFW.GLFW_KEY_UNKNOWN)
|
||||
updateLabel()
|
||||
blur()
|
||||
return true
|
||||
}
|
||||
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
|
||||
)
|
||||
editing = false
|
||||
blur()
|
||||
lastPressed = 0
|
||||
lastPressedNonModifier = 0
|
||||
}
|
||||
@@ -132,6 +138,7 @@ class KeyBindingHandler(name: String, val managedConfig: ManagedConfig) : Manage
|
||||
if (lastPressedNonModifier == ch || (lastPressedNonModifier == 0 && ch == lastPressed)) {
|
||||
opt.value = SavedKeyBinding(ch, modifiers)
|
||||
editing = false
|
||||
blur()
|
||||
lastPressed = 0
|
||||
lastPressedNonModifier = 0
|
||||
}
|
||||
|
||||
@@ -34,6 +34,7 @@ import moe.nea.firmament.util.ScreenUtil.setScreenLater
|
||||
abstract class ManagedConfig(override val name: String) : ManagedConfigElement() {
|
||||
|
||||
interface OptionHandler<T : Any> {
|
||||
fun initOption(opt: ManagedOption<T>) {}
|
||||
fun toJson(element: T): JsonElement?
|
||||
fun fromJson(element: JsonElement): T
|
||||
fun emitGuiElements(opt: ManagedOption<T>, guiAppender: GuiAppender)
|
||||
@@ -74,6 +75,7 @@ abstract class ManagedConfig(override val name: String) : ManagedConfigElement()
|
||||
): ManagedOption<T> {
|
||||
if (propertyName in allOptions) error("Cannot register the same name twice")
|
||||
return ManagedOption(this, propertyName, default, handler).also {
|
||||
it.handler.initOption(it)
|
||||
it.load(data)
|
||||
allOptions[propertyName] = it
|
||||
sortedOptions.add(it)
|
||||
|
||||
@@ -9,10 +9,11 @@ package moe.nea.firmament.keybindings
|
||||
import net.fabricmc.fabric.api.client.keybinding.v1.KeyBindingHelper
|
||||
import net.minecraft.client.option.KeyBinding
|
||||
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 {
|
||||
fun registerKeyBinding(name: String, config: ManagedConfig) {
|
||||
fun registerKeyBinding(name: String, config: ManagedOption<SavedKeyBinding>) {
|
||||
val vanillaKeyBinding = KeyBindingHelper.registerKeyBinding(
|
||||
KeyBinding(
|
||||
name,
|
||||
@@ -24,6 +25,6 @@ object FirmamentKeyBindings {
|
||||
keyBindings[vanillaKeyBinding] = config
|
||||
}
|
||||
|
||||
val keyBindings = mutableMapOf<KeyBinding, ManagedConfig>()
|
||||
val keyBindings = mutableMapOf<KeyBinding, ManagedOption<SavedKeyBinding>>()
|
||||
|
||||
}
|
||||
|
||||
@@ -10,6 +10,7 @@ import org.lwjgl.glfw.GLFW
|
||||
import kotlinx.serialization.Serializable
|
||||
import net.minecraft.client.MinecraftClient
|
||||
import net.minecraft.client.util.InputUtil
|
||||
import net.minecraft.text.Text
|
||||
import moe.nea.firmament.util.MC
|
||||
|
||||
@Serializable
|
||||
@@ -87,4 +88,20 @@ data class SavedKeyBinding(
|
||||
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
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -142,7 +142,7 @@
|
||||
"firmament.config.item-rarity-cosmetics.background-hotbar": "Hotbar Background Rarity",
|
||||
"firmament.hud.edit": "Edit %s",
|
||||
"firmament.key.category": "Firmament",
|
||||
"firmament.keybinding.external": "External",
|
||||
"firmament.keybinding.external": "%s",
|
||||
"firmament.config.slot-locking": "Slot Locking",
|
||||
"firmament.config.slot-locking.lock": "Lock Slot",
|
||||
"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-hud": "Sprint State Hud",
|
||||
"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.sprinting": "Sprinting",
|
||||
"firmament.fixes.auto-sprint.not-sprinting": "Not Sprinting",
|
||||
|
||||
Reference in New Issue
Block a user