Improve keybinding support
This commit is contained in:
@@ -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();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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>>()
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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",
|
||||||
|
|||||||
Reference in New Issue
Block a user