From 83690f40246787ea36036b2cd54f46bf71325f89 Mon Sep 17 00:00:00 2001 From: Jonas Herzig Date: Sat, 5 Sep 2020 17:14:28 +0200 Subject: [PATCH] Refactor key binding registrations to be more easily expandable --- .../replaymod/core/KeyBindingRegistry.java | 75 ++++++++++++------- .../com/replaymod/extras/HotkeyButtons.java | 9 +-- .../com/replaymod/replay/ReplayModReplay.java | 2 +- .../replaymod/replay/camera/CameraEntity.java | 8 +- .../replay/gui/overlay/GuiReplayOverlay.java | 3 +- .../simplepathing/ReplayModSimplePathing.java | 5 +- .../simplepathing/gui/GuiPathing.java | 4 +- 7 files changed, 60 insertions(+), 46 deletions(-) diff --git a/src/main/java/com/replaymod/core/KeyBindingRegistry.java b/src/main/java/com/replaymod/core/KeyBindingRegistry.java index bcffd55a..4d05c1b9 100644 --- a/src/main/java/com/replaymod/core/KeyBindingRegistry.java +++ b/src/main/java/com/replaymod/core/KeyBindingRegistry.java @@ -32,10 +32,12 @@ import org.lwjgl.glfw.GLFW; //$$ import static com.replaymod.core.versions.MCVer.FML_BUS; //#endif +import java.util.ArrayList; import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.HashSet; +import java.util.List; import java.util.Map; import java.util.Set; @@ -45,27 +47,25 @@ public class KeyBindingRegistry extends EventRegistrations { static { net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.addCategory(CATEGORY); } //#endif - private Map keyBindings = new HashMap(); + private final Map bindings = new HashMap<>(); private Set onlyInReplay = new HashSet<>(); - private Multimap keyBindingHandlers = ArrayListMultimap.create(); - private Multimap repeatedKeyBindingHandlers = ArrayListMultimap.create(); private Multimap rawHandlers = ArrayListMultimap.create(); - public KeyBinding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { - KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay); - keyBindingHandlers.put(keyBinding, whenPressed); - return keyBinding; + public Binding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { + Binding binding = registerKeyBinding(name, keyCode, onlyInRepay); + binding.handlers.add(whenPressed); + return binding; } - public KeyBinding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { - KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay); - repeatedKeyBindingHandlers.put(keyBinding, whenPressed); - return keyBinding; + public Binding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { + Binding binding = registerKeyBinding(name, keyCode, onlyInRepay); + binding.repeatedHandlers.add(whenPressed); + return binding; } - private KeyBinding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) { - KeyBinding keyBinding = keyBindings.get(name); - if (keyBinding == null) { + private Binding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) { + Binding binding = bindings.get(name); + if (binding == null) { //#if FABRIC>=1 if (keyCode == 0) { keyCode = -1; @@ -73,27 +73,28 @@ public class KeyBindingRegistry extends EventRegistrations { Identifier id = new Identifier(MOD_ID, name.substring(LangResourcePack.LEGACY_KEY_PREFIX.length())); FabricKeyBinding fabricKeyBinding = FabricKeyBinding.Builder.create(id, InputUtil.Type.KEYSYM, keyCode, CATEGORY).build(); net.fabricmc.fabric.api.client.keybinding.KeyBindingRegistry.INSTANCE.register(fabricKeyBinding); - keyBinding = fabricKeyBinding; + KeyBinding keyBinding = fabricKeyBinding; //#else - //$$ keyBinding = new KeyBinding(name, keyCode, CATEGORY); + //$$ KeyBinding keyBinding = new KeyBinding(name, keyCode, CATEGORY); //$$ ClientRegistry.registerKeyBinding(keyBinding); //#endif - keyBindings.put(name, keyBinding); + binding = new Binding(name, keyBinding); + bindings.put(name, binding); if (onlyInRepay) { this.onlyInReplay.add(keyBinding); } } else if (!onlyInRepay) { - this.onlyInReplay.remove(keyBinding); + this.onlyInReplay.remove(binding.keyBinding); } - return keyBinding; + return binding; } public void registerRaw(int keyCode, Runnable whenPressed) { rawHandlers.put(keyCode, whenPressed); } - public Map getKeyBindings() { - return Collections.unmodifiableMap(keyBindings); + public Map getBindings() { + return Collections.unmodifiableMap(bindings); } public Set getOnlyInReplay() { @@ -119,29 +120,29 @@ public class KeyBindingRegistry extends EventRegistrations { //#endif public void handleRepeatedKeyBindings() { - for (Map.Entry> entry : repeatedKeyBindingHandlers.asMap().entrySet()) { - if (entry.getKey().isPressed()) { - invokeKeyBindingHandlers(entry.getKey(), entry.getValue()); + for (Binding binding : bindings.values()) { + if (binding.keyBinding.isPressed()) { + invokeKeyBindingHandlers(binding, binding.repeatedHandlers); } } } public void handleKeyBindings() { - for (Map.Entry> entry : keyBindingHandlers.asMap().entrySet()) { - while (entry.getKey().wasPressed()) { - invokeKeyBindingHandlers(entry.getKey(), entry.getValue()); + for (Binding binding : bindings.values()) { + while (binding.keyBinding.wasPressed()) { + invokeKeyBindingHandlers(binding, binding.handlers); } } } - private void invokeKeyBindingHandlers(KeyBinding keyBinding, Collection handlers) { + private void invokeKeyBindingHandlers(Binding binding, Collection handlers) { for (final Runnable runnable : handlers) { try { runnable.run(); } catch (Throwable cause) { CrashReport crashReport = CrashReport.create(cause, "Handling Key Binding"); CrashReportSection category = crashReport.addElement("Key Binding"); - MCVer.addDetail(category, "Key Binding", keyBinding::toString); + MCVer.addDetail(category, "Key Binding", () -> binding.name); MCVer.addDetail(category, "Handler", runnable::toString); throw new CrashException(crashReport); } @@ -167,4 +168,20 @@ public class KeyBindingRegistry extends EventRegistrations { } } } + + public static class Binding { + public final String name; + public final KeyBinding keyBinding; + private final List handlers = new ArrayList<>(); + private final List repeatedHandlers = new ArrayList<>(); + + public Binding(String name, KeyBinding keyBinding) { + this.name = name; + this.keyBinding = keyBinding; + } + + public String getBoundKey() { + return MCVer.getBoundKey(keyBinding); + } + } } diff --git a/src/main/java/com/replaymod/extras/HotkeyButtons.java b/src/main/java/com/replaymod/extras/HotkeyButtons.java index 3e07a6a4..6e45de5c 100644 --- a/src/main/java/com/replaymod/extras/HotkeyButtons.java +++ b/src/main/java/com/replaymod/extras/HotkeyButtons.java @@ -3,7 +3,6 @@ package com.replaymod.extras; import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; import com.replaymod.core.mixin.KeyBindingAccessor; -import com.replaymod.core.versions.MCVer; import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import de.johni0702.minecraft.gui.GuiRenderer; @@ -68,14 +67,14 @@ public class HotkeyButtons extends EventRegistrations implements Extra { }.setLayout(panelLayout = new GridLayout().setSpacingX(5).setSpacingY(5).setColumns(1)); final KeyBindingRegistry keyBindingRegistry = mod.getKeyBindingRegistry(); - keyBindingRegistry.getKeyBindings().values().stream() - .sorted(Comparator.comparing(it -> I18n.translate(it.getTranslationKey()))) + keyBindingRegistry.getBindings().values().stream() + .sorted(Comparator.comparing(it -> I18n.translate(it.name))) .forEachOrdered(keyBinding -> { GuiButton button = new GuiButton(){ @Override public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time - setLabel(MCVer.getBoundKey(keyBinding)); + setLabel(keyBinding.getBoundKey()); super.draw(renderer, size, renderInfo); } }.onClick(() -> { @@ -96,7 +95,7 @@ public class HotkeyButtons extends EventRegistrations implements Extra { return new Dimension(Math.max(10, button.getMinSize().getWidth()) + 10, 20); } }).addElements(null, button), - new GuiLabel().setI18nText(keyBinding.getTranslationKey()) + new GuiLabel().setI18nText(keyBinding.name) )); }); diff --git a/src/main/java/com/replaymod/replay/ReplayModReplay.java b/src/main/java/com/replaymod/replay/ReplayModReplay.java index f6a66339..2c390b3d 100644 --- a/src/main/java/com/replaymod/replay/ReplayModReplay.java +++ b/src/main/java/com/replaymod/replay/ReplayModReplay.java @@ -42,7 +42,7 @@ public class ReplayModReplay implements Module { public static ReplayModReplay instance; private ReplayMod core; - public KeyBinding keyPlayPause; + public KeyBindingRegistry.Binding keyPlayPause; private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry(); diff --git a/src/main/java/com/replaymod/replay/camera/CameraEntity.java b/src/main/java/com/replaymod/replay/camera/CameraEntity.java index 5c9c6e26..919fbe0b 100644 --- a/src/main/java/com/replaymod/replay/camera/CameraEntity.java +++ b/src/main/java/com/replaymod/replay/camera/CameraEntity.java @@ -1,5 +1,6 @@ package com.replaymod.replay.camera; +import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.ReplayMod; import com.replaymod.core.SettingsRegistry; import com.replaymod.core.events.SettingsChangedCallback; @@ -13,7 +14,6 @@ import com.replaymod.replaystudio.util.Location; import net.minecraft.client.MinecraftClient; import net.minecraft.client.network.AbstractClientPlayerEntity; import net.minecraft.client.network.ClientPlayNetworkHandler; -import net.minecraft.client.options.KeyBinding; import net.minecraft.entity.Entity; import net.minecraft.entity.mob.MobEntity; import net.minecraft.entity.decoration.ItemFrameEntity; @@ -567,11 +567,11 @@ public class CameraEntity handleInputEvents(); - Map keyBindings = ReplayMod.instance.getKeyBindingRegistry().getKeyBindings(); - if (keyBindings.get("replaymod.input.rollclockwise").isPressed()) { + Map keyBindings = ReplayMod.instance.getKeyBindingRegistry().getBindings(); + if (keyBindings.get("replaymod.input.rollclockwise").keyBinding.isPressed()) { roll += Utils.isCtrlDown() ? 0.2 : 1; } - if (keyBindings.get("replaymod.input.rollcounterclockwise").isPressed()) { + if (keyBindings.get("replaymod.input.rollcounterclockwise").keyBinding.isPressed()) { roll -= Utils.isCtrlDown() ? 0.2 : 1; } diff --git a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java index c2031f6c..4618774d 100644 --- a/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java +++ b/src/main/java/com/replaymod/replay/gui/overlay/GuiReplayOverlay.java @@ -33,7 +33,6 @@ import org.lwjgl.glfw.GLFW; //#endif import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; -import static com.replaymod.core.versions.MCVer.getBoundKey; public class GuiReplayOverlay extends AbstractGuiOverlay { @@ -52,7 +51,7 @@ public class GuiReplayOverlay extends AbstractGuiOverlay { } else { // Pause button label = "replaymod.gui.ingame.menu.pause"; } - tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPlayPause) + ")"); + tooltip.setText(I18n.translate(label) + " (" + mod.keyPlayPause.getBoundKey() + ")"); } return tooltip; } diff --git a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java index bb8e8326..390ac96a 100644 --- a/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java +++ b/src/main/java/com/replaymod/simplepathing/ReplayModSimplePathing.java @@ -21,7 +21,6 @@ import com.replaymod.replaystudio.replay.ReplayFile; import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.preview.PathPreview; -import net.minecraft.client.options.KeyBinding; import net.minecraft.util.crash.CrashReport; import net.minecraft.util.crash.CrashException; import org.apache.logging.log4j.LogManager; @@ -40,8 +39,8 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module public static ReplayModSimplePathing instance; private ReplayMod core; - public KeyBinding keyPositionKeyframe; - public KeyBinding keyTimeKeyframe; + public KeyBindingRegistry.Binding keyPositionKeyframe; + public KeyBindingRegistry.Binding keyTimeKeyframe; public static Logger LOGGER = LogManager.getLogger(); diff --git a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java index f1ca6a45..78fe87d2 100644 --- a/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java +++ b/src/main/java/com/replaymod/simplepathing/gui/GuiPathing.java @@ -135,7 +135,7 @@ public class GuiPathing { label = "replaymod.gui.ingame.menu.removespeckeyframe"; } } - tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPositionKeyframe) + ")"); + tooltip.setText(I18n.translate(label) + " (" + mod.keyPositionKeyframe.getBoundKey() + ")"); } return tooltip; } @@ -152,7 +152,7 @@ public class GuiPathing { } else { // Remove time keyframe label = "replaymod.gui.ingame.menu.removetimekeyframe"; } - tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyTimeKeyframe) + ")"); + tooltip.setText(I18n.translate(label) + " (" + mod.keyTimeKeyframe.getBoundKey() + ")"); } return tooltip; }