1
0
mirror of https://github.com/chylex/Better-Controls.git synced 2025-05-03 04:34:06 +02:00

Add keybinding to open configuration screen

This commit is contained in:
chylex 2020-10-17 18:18:41 +02:00
parent b76a65fb70
commit 87315529f4
5 changed files with 52 additions and 2 deletions
src/main
java/chylex/bettercontrols
resources/assets/bettercontrols/lang

View File

@ -1,4 +1,5 @@
package chylex.bettercontrols.config;
import chylex.bettercontrols.input.KeyBindingWithModifier;
import net.minecraft.client.options.KeyBinding;
import java.nio.file.Path;
@ -20,6 +21,8 @@ public final class BetterControlsConfig{
public float flightSpeedMpSpectatorDefault = 1F;
public float flightSpeedMpSpectatorSprinting = 2F;
public final KeyBindingWithModifier keyOpenMenu = new KeyBindingWithModifier("key.bettercontrols.open_menu");
BetterControlsConfig(){}
private BetterControlsConfig setPath(final Path path){
@ -28,7 +31,9 @@ public final class BetterControlsConfig{
}
public KeyBinding[] getAllKeyBindings(){
return new KeyBinding[0];
return new KeyBinding[]{
keyOpenMenu
};
}
public void save(){

View File

@ -41,6 +41,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
Json.setFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
Json.setFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
Json.writeKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
return obj;
}
@ -60,6 +62,8 @@ final class ConfigSerializer implements JsonSerializer<BetterControlsConfig>, Js
cfg.flightSpeedMpSpectatorDefault = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Default", cfg.flightSpeedMpSpectatorDefault);
cfg.flightSpeedMpSpectatorSprinting = Json.getFloat(obj, "Flight.SpeedMp.Spectator.Sprinting", cfg.flightSpeedMpSpectatorSprinting);
Json.readKeyBinding(obj, "Misc.KeyOpenMenu", cfg.keyOpenMenu);
return cfg;
}

View File

@ -2,10 +2,13 @@ package chylex.bettercontrols.gui;
import chylex.bettercontrols.BetterControlsMod;
import chylex.bettercontrols.config.BetterControlsConfig;
import chylex.bettercontrols.gui.elements.BooleanValueWidget;
import chylex.bettercontrols.gui.elements.CycleButtonWidget;
import chylex.bettercontrols.gui.elements.DiscreteValueSliderWidget;
import chylex.bettercontrols.gui.elements.KeyBindingWidget;
import chylex.bettercontrols.gui.elements.Option;
import chylex.bettercontrols.gui.elements.TextWidget;
import chylex.bettercontrols.input.KeyBindingWithModifier;
import chylex.bettercontrols.input.ModifierKey;
import net.minecraft.client.MinecraftClient;
import net.minecraft.client.gui.Element;
import net.minecraft.client.gui.screen.Screen;
@ -22,8 +25,10 @@ import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import static chylex.bettercontrols.gui.OptionListWidget.COL2_W;
import static chylex.bettercontrols.gui.OptionListWidget.COL4_W;
import static chylex.bettercontrols.gui.OptionListWidget.ROW_WIDTH;
import static chylex.bettercontrols.gui.OptionListWidget.col2;
import static chylex.bettercontrols.gui.OptionListWidget.col4;
import static chylex.bettercontrols.gui.elements.TextWidget.CENTER;
public class BetterControlsScreen extends GameOptionsScreen{
@ -105,8 +110,35 @@ public class BetterControlsScreen extends GameOptionsScreen{
return y;
}
private int generateMiscellaneousOptions(int y, final List<Element> elements){
final BetterControlsConfig cfg = BetterControlsMod.config;
generateKeyBindingWithModifierOption(y, elements, Text.of("Open Better Controls Menu"), cfg.keyOpenMenu);
y += ROW_HEIGHT;
return y;
}
// Helpers
private static final List<Option<ModifierKey>> MODIFIER_OPTIONS = Arrays.asList(
new Option<>(null, Text.of("(No Modifier)")),
new Option<>(ModifierKey.CONTROL, Text.of("Control")),
new Option<>(ModifierKey.SHIFT, Text.of("Shift")),
new Option<>(ModifierKey.ALT, Text.of("Alt"))
);
private void generateKeyBindingWithModifierOption(final int y, final List<Element> elements, final Text text, final KeyBindingWithModifier binding){
final CycleButtonWidget<ModifierKey> modifierButton = new CycleButtonWidget<>(col4(2), y, COL4_W, MODIFIER_OPTIONS, binding.getModifier(), binding::setModifier);
final KeyBindingWidget bindingButton = new KeyBindingWidget(col4(3), y, COL4_W, binding, this::startEditingKeyBinding);
bindingButton.linkButtonToBoundState(modifierButton);
generateLeftSideText(y, elements, text);
elements.add(modifierButton);
elements.add(bindingButton);
allKeyBindings.add(bindingButton);
}
private static void generateLeftSideText(final int y, final List<Element> elements, final Text text){
elements.add(new TextWidget(col2(0), y, COL2_W - TEXT_PADDING_RIGHT, text));
}
@ -137,6 +169,9 @@ public class BetterControlsScreen extends GameOptionsScreen{
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Flying"), CENTER));
y = generateFlightOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
elements.add(new TextWidget(0, y, ROW_WIDTH, ROW_HEIGHT, Text.of("Miscellaneous"), CENTER));
y = generateMiscellaneousOptions(y + ROW_HEIGHT, elements) + TITLE_MARGIN_TOP;
addButton(new ButtonWidget(width / 2 - 99, height - 29, 200, 20, ScreenTexts.DONE, btn -> client.openScreen(parent)));
addChild(optionsWidget = new OptionListWidget(21, height - 32, width, height, elements, y - TITLE_MARGIN_TOP + BOTTOM_PADDING));
}

View File

@ -1,6 +1,7 @@
package chylex.bettercontrols.player;
import chylex.bettercontrols.BetterControlsMod;
import chylex.bettercontrols.config.BetterControlsConfig;
import chylex.bettercontrols.gui.BetterControlsScreen;
import chylex.bettercontrols.mixin.AccessCameraFields;
import chylex.bettercontrols.mixin.AccessClientPlayerFields;
import net.minecraft.client.MinecraftClient;
@ -123,5 +124,9 @@ public final class PlayerTicker{
camera.setCameraY(player.getStandingEyeHeight());
}
}
if (cfg().keyOpenMenu.isPressed()){
mc().openScreen(new BetterControlsScreen(null));
}
}
}

View File

@ -1,3 +1,4 @@
{
"key.categories.bettercontrols": "Better Controls"
"key.categories.bettercontrols": "Better Controls",
"key.bettercontrols.open_menu": "Open Menu"
}