Add key hints to buttons which have corresponding keybindings

This commit is contained in:
Jonas Herzig
2020-08-28 15:58:02 +02:00
parent fd48e56238
commit 739d5b2807
7 changed files with 58 additions and 35 deletions

View File

@@ -51,12 +51,16 @@ public class KeyBindingRegistry extends EventRegistrations {
private Multimap<KeyBinding, Runnable> repeatedKeyBindingHandlers = ArrayListMultimap.create(); private Multimap<KeyBinding, Runnable> repeatedKeyBindingHandlers = ArrayListMultimap.create();
private Multimap<Integer, Runnable> rawHandlers = ArrayListMultimap.create(); private Multimap<Integer, Runnable> rawHandlers = ArrayListMultimap.create();
public void registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { public KeyBinding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
keyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed); KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay);
keyBindingHandlers.put(keyBinding, whenPressed);
return keyBinding;
} }
public void registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) { public KeyBinding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
repeatedKeyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed); KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay);
repeatedKeyBindingHandlers.put(keyBinding, whenPressed);
return keyBinding;
} }
private KeyBinding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) { private KeyBinding registerKeyBinding(String name, int keyCode, boolean onlyInRepay) {

View File

@@ -7,6 +7,7 @@ import com.replaymod.replaystudio.us.myles.ViaVersion.api.protocol.ProtocolVersi
import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State; import com.replaymod.replaystudio.us.myles.ViaVersion.packets.State;
import net.minecraft.client.MinecraftClient; import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen; import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.world.ClientWorld; import net.minecraft.client.world.ClientWorld;
import net.minecraft.client.render.Tessellator; import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.entity.EntityRenderDispatcher; import net.minecraft.client.render.entity.EntityRenderDispatcher;
@@ -748,6 +749,23 @@ public class MCVer {
//#endif //#endif
} }
public static String getBoundKey(KeyBinding keyBinding) {
try {
//#if MC>=11600
return keyBinding.getBoundKeyLocalizedText().asString();
//#else
//#if MC>=11400
//$$ return keyBinding.getLocalizedName();
//#else
//$$ return Keyboard.getKeyName(keyBinding.getKeyCode());
//#endif
//#endif
} catch (ArrayIndexOutOfBoundsException e) {
// Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55
return "Unknown";
}
}
//#if MC>=11400 //#if MC>=11400
private static Boolean hasOptifine; private static Boolean hasOptifine;
public static boolean hasOptifine() { public static boolean hasOptifine() {
@@ -893,6 +911,10 @@ public class MCVer {
//$$ public static boolean getEventKeyState() { //$$ public static boolean getEventKeyState() {
//$$ return org.lwjgl.input.Keyboard.getEventKeyState(); //$$ return org.lwjgl.input.Keyboard.getEventKeyState();
//$$ } //$$ }
//$$
//$$ public static String getKeyName(int code) {
//$$ return org.lwjgl.input.Keyboard.getKeyName(code);
//$$ }
//#endif //#endif
} }
} }

View File

@@ -3,6 +3,7 @@ package com.replaymod.extras;
import com.replaymod.core.KeyBindingRegistry; import com.replaymod.core.KeyBindingRegistry;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.mixin.KeyBindingAccessor; import com.replaymod.core.mixin.KeyBindingAccessor;
import com.replaymod.core.versions.MCVer;
import com.replaymod.replay.events.ReplayOpenedCallback; import com.replaymod.replay.events.ReplayOpenedCallback;
import com.replaymod.replay.gui.overlay.GuiReplayOverlay; import com.replaymod.replay.gui.overlay.GuiReplayOverlay;
import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.GuiRenderer;
@@ -22,11 +23,6 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.resource.language.I18n; import net.minecraft.client.resource.language.I18n;
//#if MC>=11400
//#else
//$$ import org.lwjgl.input.Keyboard;
//#endif
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@@ -80,21 +76,7 @@ public class HotkeyButtons extends EventRegistrations implements Extra {
@Override @Override
public void draw(GuiRenderer renderer, ReadableDimension size, RenderInfo renderInfo) { 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 // There doesn't seem to be an KeyBindingUpdate event, so we'll just update it every time
String keyName = "???"; setLabel(MCVer.getBoundKey(keyBinding));
try {
//#if MC>=11600
keyName = keyBinding.getBoundKeyLocalizedText().asString();
//#else
//#if MC>=11400
//$$ keyName = keyBinding.getLocalizedName();
//#else
//$$ keyName = Keyboard.getKeyName(keyBinding.getKeyCode());
//#endif
//#endif
} catch (ArrayIndexOutOfBoundsException e) {
// Apparently windows likes to press strange keys, see https://www.replaymod.com/forum/thread/55
}
setLabel(keyName);
super.draw(renderer, size, renderInfo); super.draw(renderer, size, renderInfo);
} }
}.onClick(() -> { }.onClick(() -> {

View File

@@ -42,6 +42,7 @@ public class ReplayModReplay implements Module {
public static ReplayModReplay instance; public static ReplayModReplay instance;
private ReplayMod core; private ReplayMod core;
public KeyBinding keyPlayPause;
private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry(); private final CameraControllerRegistry cameraControllerRegistry = new CameraControllerRegistry();
@@ -116,7 +117,7 @@ public class ReplayModReplay implements Module {
} }
}, true); }, true);
registry.registerKeyBinding("replaymod.input.playpause", Keyboard.KEY_P, new Runnable() { keyPlayPause = registry.registerKeyBinding("replaymod.input.playpause", Keyboard.KEY_P, new Runnable() {
@Override @Override
public void run() { public void run() {
if (replayHandler != null) { if (replayHandler != null) {

View File

@@ -3,6 +3,7 @@ package com.replaymod.replay.gui.overlay;
import com.replaymod.core.ReplayMod; import com.replaymod.core.ReplayMod;
import com.replaymod.core.versions.MCVer.Keyboard; import com.replaymod.core.versions.MCVer.Keyboard;
import com.replaymod.replay.ReplayHandler; import com.replaymod.replay.ReplayHandler;
import com.replaymod.replay.ReplayModReplay;
import com.replaymod.replay.ReplaySender; import com.replaymod.replay.ReplaySender;
import de.johni0702.minecraft.gui.GuiRenderer; import de.johni0702.minecraft.gui.GuiRenderer;
import de.johni0702.minecraft.gui.RenderInfo; import de.johni0702.minecraft.gui.RenderInfo;
@@ -31,9 +32,12 @@ import com.replaymod.core.events.KeyEventCallback;
//#endif //#endif
import static com.replaymod.core.ReplayMod.TEXTURE_SIZE; import static com.replaymod.core.ReplayMod.TEXTURE_SIZE;
import static com.replaymod.core.versions.MCVer.getBoundKey;
public class GuiReplayOverlay extends AbstractGuiOverlay<GuiReplayOverlay> { public class GuiReplayOverlay extends AbstractGuiOverlay<GuiReplayOverlay> {
private final ReplayModReplay mod = ReplayModReplay.instance;
public final GuiPanel topPanel = new GuiPanel(this) public final GuiPanel topPanel = new GuiPanel(this)
.setLayout(new HorizontalLayout(HorizontalLayout.Alignment.LEFT).setSpacing(5)); .setLayout(new HorizontalLayout(HorizontalLayout.Alignment.LEFT).setSpacing(5));
public final GuiTexturedButton playPauseButton = new GuiTexturedButton() { public final GuiTexturedButton playPauseButton = new GuiTexturedButton() {
@@ -41,11 +45,13 @@ public class GuiReplayOverlay extends AbstractGuiOverlay<GuiReplayOverlay> {
public GuiElement getTooltip(RenderInfo renderInfo) { public GuiElement getTooltip(RenderInfo renderInfo) {
GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo);
if (tooltip != null) { if (tooltip != null) {
String label;
if (getTextureNormal().getY() == 0) { // Play button if (getTextureNormal().getY() == 0) { // Play button
tooltip.setI18nText("replaymod.gui.ingame.menu.unpause"); label = "replaymod.gui.ingame.menu.unpause";
} else { // Pause button } else { // Pause button
tooltip.setI18nText("replaymod.gui.ingame.menu.pause"); label = "replaymod.gui.ingame.menu.pause";
} }
tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPlayPause) + ")");
} }
return tooltip; return tooltip;
} }

View File

@@ -21,6 +21,7 @@ import com.replaymod.replaystudio.replay.ReplayFile;
import com.replaymod.simplepathing.SPTimeline.SPPath; import com.replaymod.simplepathing.SPTimeline.SPPath;
import com.replaymod.simplepathing.gui.GuiPathing; import com.replaymod.simplepathing.gui.GuiPathing;
import com.replaymod.simplepathing.preview.PathPreview; import com.replaymod.simplepathing.preview.PathPreview;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.util.crash.CrashReport; import net.minecraft.util.crash.CrashReport;
import net.minecraft.util.crash.CrashException; import net.minecraft.util.crash.CrashException;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
@@ -39,6 +40,8 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module
public static ReplayModSimplePathing instance; public static ReplayModSimplePathing instance;
private ReplayMod core; private ReplayMod core;
public KeyBinding keyPositionKeyframe;
public KeyBinding keyTimeKeyframe;
public static Logger LOGGER = LogManager.getLogger(); public static Logger LOGGER = LogManager.getLogger();
@@ -91,13 +94,13 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module
core.getKeyBindingRegistry().registerRaw(Keyboard.KEY_DELETE, () -> { core.getKeyBindingRegistry().registerRaw(Keyboard.KEY_DELETE, () -> {
if (guiPathing != null) guiPathing.deleteButtonPressed(); if (guiPathing != null) guiPathing.deleteButtonPressed();
}); });
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positionkeyframe", Keyboard.KEY_I, () -> { keyPositionKeyframe = core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positionkeyframe", Keyboard.KEY_I, () -> {
if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, false); if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, false);
}, true); }, true);
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positiononlykeyframe", 0, () -> { core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positiononlykeyframe", 0, () -> {
if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, true); if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, true);
}, true); }, true);
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.timekeyframe", Keyboard.KEY_O, () -> { keyTimeKeyframe = core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.timekeyframe", Keyboard.KEY_O, () -> {
if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.TIME, false); if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.TIME, false);
}, true); }, true);
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.bothkeyframes", 0, () -> { core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.bothkeyframes", 0, () -> {

View File

@@ -49,6 +49,7 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension; import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.ReadablePoint;
import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint; import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.util.crash.CrashReport; import net.minecraft.util.crash.CrashReport;
import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.Logger;
@@ -124,19 +125,21 @@ public class GuiPathing {
public GuiElement getTooltip(RenderInfo renderInfo) { public GuiElement getTooltip(RenderInfo renderInfo) {
GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo);
if (tooltip != null) { if (tooltip != null) {
String label;
if (getTextureNormal().getY() == 40) { // Add keyframe if (getTextureNormal().getY() == 40) { // Add keyframe
if (getTextureNormal().getX() == 0) { // Position if (getTextureNormal().getX() == 0) { // Position
tooltip.setI18nText("replaymod.gui.ingame.menu.addposkeyframe"); label = "replaymod.gui.ingame.menu.addposkeyframe";
} else { // Spectator } else { // Spectator
tooltip.setI18nText("replaymod.gui.ingame.menu.addspeckeyframe"); label = "replaymod.gui.ingame.menu.addspeckeyframe";
} }
} else { // Remove keyframe } else { // Remove keyframe
if (getTextureNormal().getX() == 0) { // Position if (getTextureNormal().getX() == 0) { // Position
tooltip.setI18nText("replaymod.gui.ingame.menu.removeposkeyframe"); label = "replaymod.gui.ingame.menu.removeposkeyframe";
} else { // Spectator } else { // Spectator
tooltip.setI18nText("replaymod.gui.ingame.menu.removespeckeyframe"); label = "replaymod.gui.ingame.menu.removespeckeyframe";
} }
} }
tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyPositionKeyframe) + ")");
} }
return tooltip; return tooltip;
} }
@@ -147,11 +150,13 @@ public class GuiPathing {
public GuiElement getTooltip(RenderInfo renderInfo) { public GuiElement getTooltip(RenderInfo renderInfo) {
GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo); GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo);
if (tooltip != null) { if (tooltip != null) {
String label;
if (getTextureNormal().getY() == 80) { // Add time keyframe if (getTextureNormal().getY() == 80) { // Add time keyframe
tooltip.setI18nText("replaymod.gui.ingame.menu.addtimekeyframe"); label = "replaymod.gui.ingame.menu.addtimekeyframe";
} else { // Remove time keyframe } else { // Remove time keyframe
tooltip.setI18nText("replaymod.gui.ingame.menu.removetimekeyframe"); label = "replaymod.gui.ingame.menu.removetimekeyframe";
} }
tooltip.setText(I18n.translate(label) + " (" + getBoundKey(mod.keyTimeKeyframe) + ")");
} }
return tooltip; return tooltip;
} }