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<Integer, Runnable> rawHandlers = ArrayListMultimap.create();
public void registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
keyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed);
public KeyBinding registerKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay);
keyBindingHandlers.put(keyBinding, whenPressed);
return keyBinding;
}
public void registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
repeatedKeyBindingHandlers.put(registerKeyBinding(name, keyCode, onlyInRepay), whenPressed);
public KeyBinding registerRepeatedKeyBinding(String name, int keyCode, Runnable whenPressed, boolean onlyInRepay) {
KeyBinding keyBinding = registerKeyBinding(name, keyCode, onlyInRepay);
repeatedKeyBindingHandlers.put(keyBinding, whenPressed);
return keyBinding;
}
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 net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.screen.Screen;
import net.minecraft.client.options.KeyBinding;
import net.minecraft.client.world.ClientWorld;
import net.minecraft.client.render.Tessellator;
import net.minecraft.client.render.entity.EntityRenderDispatcher;
@@ -748,6 +749,23 @@ public class MCVer {
//#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
private static Boolean hasOptifine;
public static boolean hasOptifine() {
@@ -893,6 +911,10 @@ public class MCVer {
//$$ public static boolean getEventKeyState() {
//$$ return org.lwjgl.input.Keyboard.getEventKeyState();
//$$ }
//$$
//$$ public static String getKeyName(int code) {
//$$ return org.lwjgl.input.Keyboard.getKeyName(code);
//$$ }
//#endif
}
}

View File

@@ -3,6 +3,7 @@ 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;
@@ -22,11 +23,6 @@ import de.johni0702.minecraft.gui.utils.lwjgl.Dimension;
import de.johni0702.minecraft.gui.utils.lwjgl.ReadableDimension;
import net.minecraft.client.resource.language.I18n;
//#if MC>=11400
//#else
//$$ import org.lwjgl.input.Keyboard;
//#endif
import java.util.Collection;
import java.util.Collections;
import java.util.Comparator;
@@ -80,21 +76,7 @@ public class HotkeyButtons extends EventRegistrations implements Extra {
@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
String keyName = "???";
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);
setLabel(MCVer.getBoundKey(keyBinding));
super.draw(renderer, size, renderInfo);
}
}.onClick(() -> {

View File

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

View File

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

View File

@@ -21,6 +21,7 @@ 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;
@@ -39,6 +40,8 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module
public static ReplayModSimplePathing instance;
private ReplayMod core;
public KeyBinding keyPositionKeyframe;
public KeyBinding keyTimeKeyframe;
public static Logger LOGGER = LogManager.getLogger();
@@ -91,13 +94,13 @@ public class ReplayModSimplePathing extends EventRegistrations implements Module
core.getKeyBindingRegistry().registerRaw(Keyboard.KEY_DELETE, () -> {
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);
}, true);
core.getKeyBindingRegistry().registerKeyBinding("replaymod.input.positiononlykeyframe", 0, () -> {
if (guiPathing != null) guiPathing.toggleKeyframe(SPPath.POSITION, 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);
}, true);
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.ReadablePoint;
import de.johni0702.minecraft.gui.utils.lwjgl.WritablePoint;
import net.minecraft.client.resource.language.I18n;
import net.minecraft.util.crash.CrashReport;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
@@ -124,19 +125,21 @@ public class GuiPathing {
public GuiElement getTooltip(RenderInfo renderInfo) {
GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo);
if (tooltip != null) {
String label;
if (getTextureNormal().getY() == 40) { // Add keyframe
if (getTextureNormal().getX() == 0) { // Position
tooltip.setI18nText("replaymod.gui.ingame.menu.addposkeyframe");
label = "replaymod.gui.ingame.menu.addposkeyframe";
} else { // Spectator
tooltip.setI18nText("replaymod.gui.ingame.menu.addspeckeyframe");
label = "replaymod.gui.ingame.menu.addspeckeyframe";
}
} else { // Remove keyframe
if (getTextureNormal().getX() == 0) { // Position
tooltip.setI18nText("replaymod.gui.ingame.menu.removeposkeyframe");
label = "replaymod.gui.ingame.menu.removeposkeyframe";
} 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;
}
@@ -147,11 +150,13 @@ public class GuiPathing {
public GuiElement getTooltip(RenderInfo renderInfo) {
GuiTooltip tooltip = (GuiTooltip) super.getTooltip(renderInfo);
if (tooltip != null) {
String label;
if (getTextureNormal().getY() == 80) { // Add time keyframe
tooltip.setI18nText("replaymod.gui.ingame.menu.addtimekeyframe");
label = "replaymod.gui.ingame.menu.addtimekeyframe";
} 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;
}