diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java index f64e266..f2b2cd6 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightControlsConfig.java @@ -21,6 +21,7 @@ import eu.midnightdust.midnightcontrols.MidnightControls; import eu.midnightdust.midnightcontrols.MidnightControlsConstants; import eu.midnightdust.midnightcontrols.MidnightControlsFeature; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; +import eu.midnightdust.midnightcontrols.client.controller.ButtonCategory; import eu.midnightdust.midnightcontrols.client.controller.Controller; import eu.midnightdust.midnightcontrols.client.controller.InputManager; import eu.midnightdust.midnightcontrols.client.enums.ButtonState; @@ -30,17 +31,29 @@ import eu.midnightdust.midnightcontrols.client.enums.HudSide; import eu.midnightdust.midnightcontrols.client.enums.VirtualMouseSkin; import eu.midnightdust.midnightcontrols.client.gui.RingScreen; import eu.midnightdust.midnightcontrols.client.enums.TouchMode; +import eu.midnightdust.midnightcontrols.client.gui.config.ControllerBindingButton; +import eu.midnightdust.midnightcontrols.client.gui.config.ControllerSelectionButton; +import eu.midnightdust.midnightcontrols.client.virtualkeyboard.KeyboardLayoutManager; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ChatScreen; import net.minecraft.client.gui.screen.advancement.AdvancementsScreen; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.PressableTextWidget; +import net.minecraft.client.gui.widget.PressableWidget; +import net.minecraft.client.gui.widget.TextIconButtonWidget; import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.lwjgl.glfw.GLFW; +import java.lang.annotation.Annotation; import java.util.*; import java.util.regex.Pattern; +import static eu.midnightdust.midnightcontrols.client.MidnightControlsClient.client; +import static eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen.searchNextAvailableController; import static org.lwjgl.glfw.GLFW.*; /** @@ -53,6 +66,7 @@ public class MidnightControlsConfig extends MidnightConfig { public static final String SCREENS = "screens"; public static final String VISUAL = "visual"; public static final String MISC = "misc"; + public static final String BUTTONS = "buttons"; public static boolean isEditing = false; @Hidden @Entry public static int configVersion = 2; // General @@ -152,7 +166,7 @@ public class MidnightControlsConfig extends MidnightConfig { @Comment(category = SCREENS, centered = true, name="\uD83D\uDD27 UI Modifications") public static Comment _uiMods; @Entry(category = SCREENS, name = "midnightcontrols.menu.move_chat") public static boolean moveChat = false; @Entry(category = SCREENS, name = "Enable Shortcut in Controls Options") public static boolean shortcutInControls = true; - @Entry(category = MISC, name = "midnightcontrols.menu.virtual_keyboard_layout") public static String keyboardLayout = "en_US:qwerty"; + @Entry(category = MISC) @Hidden public static String keyboardLayout = "en_US:qwerty"; @Entry(category = MISC, name = "Debug") public static boolean debug = false; @Entry(category = MISC, name = "Excluded Keybindings") public static List excludedKeybindings = Lists.newArrayList("key.forward", "key.left", "key.back", "key.right", "key.jump", "key.sneak", "key.sprint", "key.inventory", "key.swapOffhand", "key.drop", "key.use", "key.attack", "key.chat", "key.playerlist", "key.screenshot", "key.togglePerspective", "key.smoothCamera", "key.fullscreen", "key.saveToolbarActivator", "key.loadToolbarActivator", @@ -163,6 +177,55 @@ public class MidnightControlsConfig extends MidnightConfig { private static Map currentBindingProfile = new HashMap<>(); private static Controller prevController; + @Comment(category = BUTTONS) @Condition(requiredModId = "thisModDoesNotExist") public static Comment this_spacer_will_never_be_visible; + public void onTabInit(String tabName, MidnightConfigListWidget list, MidnightConfigScreen screen) { + EntryInfo centeredComment = new EntryInfo(null, "midnightcontrols"); + centeredComment.comment = new Comment() { + public Class annotationType() {return null;} + public String category() {return "";} + public String name() {return "";} + public String url() {return "";} + public String requiredMod() {return "";} + + @Override + public boolean centered() { + return true; + } + }; + if (BUTTONS.equals(tabName)) { + InputManager.streamCategories() + .sorted(Comparator.comparingInt(ButtonCategory::getPriority)) + .forEach(category -> { + + list.addButton(Lists.newArrayList(), Text.literal(category.getTranslatedName()), centeredComment); + + category.getBindings().forEach(binding -> { + ControllerBindingButton.add(binding, list, screen); + }); + }); + } + if (MISC.equals(tabName)) { + TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> { + MidnightControlsConfig.keyboardLayout = "en_US:qwerty"; + screen.updateList(); + }), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build(); + resetButton.setPosition(screen.width - 205 + 150 + 25, 0); + ButtonWidget editButton = ButtonWidget.builder(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey()), + button -> { + MidnightControlsConfig.keyboardLayout = KeyboardLayoutManager.getNext(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout)).getId(); + resetButton.active = !MidnightControlsConfig.keyboardLayout.equals("en_US:qwerty"); + button.setMessage(Text.translatable(KeyboardLayoutManager.getById(MidnightControlsConfig.keyboardLayout).getTranslationKey())); + }).dimensions(screen.width - 185, 0, 150, 20).build(); + resetButton.active = !MidnightControlsConfig.keyboardLayout.equals("en_US:qwerty"); + + list.addButton(List.of(editButton, resetButton), Text.translatable("midnightcontrols.menu.virtual_keyboard_layout"), new EntryInfo(null, screen.modid)); + } + if (CONTROLLER.equals(tabName)) { + ControllerSelectionButton.add(list, screen, false); + ControllerSelectionButton.add(list, screen, true); + } + } + /** * Loads the configuration */ diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java index 04cfae9..ba507e3 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/MidnightInput.java @@ -15,6 +15,7 @@ import eu.midnightdust.midnightcontrols.client.compat.EmotecraftCompat; import eu.midnightdust.midnightcontrols.client.compat.LibGuiCompat; import eu.midnightdust.midnightcontrols.client.compat.MidnightControlsCompat; import eu.midnightdust.midnightcontrols.client.compat.YACLCompat; +import eu.midnightdust.midnightcontrols.client.gui.config.ControlsInput; import eu.midnightdust.midnightcontrols.client.mixin.AdvancementsScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.CreativeInventoryScreenAccessor; import eu.midnightdust.midnightcontrols.client.mixin.KeyboardAccessor; @@ -98,7 +99,7 @@ public class MidnightInput { public int inventoryInteractionCooldown = 0; public int screenCloseCooldown = 0; - private ControllerControlsWidget controlsInput = null; + private ControlsInput controlsInput = null; public MidnightInput() {} @@ -156,7 +157,7 @@ public class MidnightInput { this.fetchJoystickInput(state, true, false); }); - boolean allowInput = this.controlsInput == null || this.controlsInput.focusedBinding == null; + boolean allowInput = this.controlsInput == null || this.controlsInput.getFocusedBinding() == null; if (allowInput) InputManager.updateBindings(); @@ -167,11 +168,11 @@ public class MidnightInput { }); } if (this.controlsInput != null && InputManager.STATES.int2ObjectEntrySet().parallelStream().map(Map.Entry::getValue).allMatch(ButtonState::isUnpressed)) { - if (MidnightControlsConfig.debug) MidnightControls.log("Starting MidnightInput Button Edit"); - if (this.controlsInput.focusedBinding != null && !this.controlsInput.waiting) { - int[] buttons = new int[this.controlsInput.currentButtons.size()]; - for (int i = 0; i < this.controlsInput.currentButtons.size(); i++) - buttons[i] = this.controlsInput.currentButtons.get(i); + //if (MidnightControlsConfig.debug) MidnightControls.log("Starting MidnightInput Button Edit"); + if (this.controlsInput.getFocusedBinding() != null && !this.controlsInput.isWaiting()) { + int[] buttons = new int[this.controlsInput.getCurrentButtons().size()]; + for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++) + buttons[i] = this.controlsInput.getCurrentButtons().get(i); this.controlsInput.finishBindingEdit(buttons); this.controlsInput = null; } @@ -246,11 +247,11 @@ public class MidnightInput { this.inventoryInteractionCooldown = 5; } - public void beginControlsInput(ControllerControlsWidget widget) { + public void beginControlsInput(ControlsInput widget) { this.controlsInput = widget; if (widget != null) { - this.controlsInput.currentButtons.clear(); - this.controlsInput.waiting = true; + this.controlsInput.getCurrentButtons().clear(); + this.controlsInput.setWaiting(true); } } @@ -332,16 +333,17 @@ public class MidnightInput { } public void handleButton(ButtonStorage storage) { - if (this.controlsInput != null && this.controlsInput.focusedBinding != null) { - if (storage.state == ButtonState.PRESS && !this.controlsInput.currentButtons.contains(storage.button)) { - this.controlsInput.currentButtons.add(storage.button); + if (this.controlsInput != null && this.controlsInput.getFocusedBinding() != null) { + if (storage.state == ButtonState.PRESS && !this.controlsInput.getCurrentButtons().contains(storage.button)) { + this.controlsInput.getCurrentButtons().add(storage.button); - var buttons = new int[this.controlsInput.currentButtons.size()]; - for (int i = 0; i < this.controlsInput.currentButtons.size(); i++) - buttons[i] = this.controlsInput.currentButtons.get(i); - this.controlsInput.focusedBinding.setButton(buttons); + var buttons = new int[this.controlsInput.getCurrentButtons().size()]; + for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++) + buttons[i] = this.controlsInput.getCurrentButtons().get(i); + this.controlsInput.getFocusedBinding().setButton(buttons); + this.controlsInput.update(); - this.controlsInput.waiting = false; + this.controlsInput.setWaiting(false); } return; } @@ -517,17 +519,18 @@ public class MidnightInput { // @TODO allow rebinding to left stick int preferredAxis = true ? GLFW_GAMEPAD_AXIS_RIGHT_Y : GLFW_GAMEPAD_AXIS_LEFT_Y; - if (this.controlsInput != null && this.controlsInput.focusedBinding != null) { - if (storage.buttonState != ButtonState.NONE && !this.controlsInput.currentButtons.contains(storage.getButtonId(storage.buttonState == ButtonState.PRESS))) { + if (this.controlsInput != null && this.controlsInput.getFocusedBinding() != null) { + if (storage.buttonState != ButtonState.NONE && !this.controlsInput.getCurrentButtons().contains(storage.getButtonId(storage.buttonState == ButtonState.PRESS))) { - this.controlsInput.currentButtons.add(storage.getButtonId(storage.buttonState == ButtonState.PRESS)); + this.controlsInput.getCurrentButtons().add(storage.getButtonId(storage.buttonState == ButtonState.PRESS)); - int[] buttons = new int[this.controlsInput.currentButtons.size()]; - for (int i = 0; i < this.controlsInput.currentButtons.size(); i++) - buttons[i] = this.controlsInput.currentButtons.get(i); - this.controlsInput.focusedBinding.setButton(buttons); + int[] buttons = new int[this.controlsInput.getCurrentButtons().size()]; + for (int i = 0; i < this.controlsInput.getCurrentButtons().size(); i++) + buttons[i] = this.controlsInput.getCurrentButtons().get(i); + this.controlsInput.getFocusedBinding().setButton(buttons); + this.controlsInput.update(); - this.controlsInput.waiting = false; + this.controlsInput.setWaiting(false); } return true; } else if (storage.absValue >= storage.deadZone) { diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java index 8d2001c..a50bf55 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/MidnightControlsSettingsScreen.java @@ -163,7 +163,7 @@ public class MidnightControlsSettingsScreen extends SpruceScreen { .append(Text.literal(GAMEPAD_TOOL_URL).formatted(Formatting.GOLD)) .append("),"); - private static int searchNextAvailableController(int newId, boolean allowNone) { + public static int searchNextAvailableController(int newId, boolean allowNone) { if ((allowNone && newId == -1) || newId == 0) return newId; Controller candidate = Controller.byId(newId); diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java new file mode 100644 index 0000000..a0bdf95 --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerBindingButton.java @@ -0,0 +1,154 @@ +package eu.midnightdust.midnightcontrols.client.gui.config; + +import com.google.common.collect.Lists; +import eu.midnightdust.lib.config.EntryInfo; +import eu.midnightdust.lib.config.MidnightConfigListWidget; +import eu.midnightdust.lib.config.MidnightConfigScreen; +import eu.midnightdust.midnightcontrols.client.MidnightControlsClient; +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; +import eu.midnightdust.midnightcontrols.client.controller.InputManager; +import eu.midnightdust.midnightcontrols.client.gui.MidnightControlsRenderer; +import net.minecraft.client.MinecraftClient; +import net.minecraft.client.font.TextRenderer; +import net.minecraft.client.gui.DrawContext; +import net.minecraft.client.gui.tooltip.Tooltip; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.ClickableWidget; +import net.minecraft.client.gui.widget.TextIconButtonWidget; +import net.minecraft.client.input.AbstractInput; +import net.minecraft.text.MutableText; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import org.jetbrains.annotations.Nullable; +import org.thinkingstudio.obsidianui.SpruceTexts; + +import java.util.ArrayList; +import java.util.List; +import java.util.concurrent.atomic.AtomicBoolean; + +public class ControllerBindingButton extends ButtonWidget implements ControlsInput { + private static final int[] UNBOUND = new int[]{-1}; + static boolean waiting = false; + static List currentButtons = new ArrayList<>(); + private int iconWidth; + + public static void add(ButtonBinding binding, MidnightConfigListWidget list, MidnightConfigScreen screen) { + ControllerBindingButton editButton = new ControllerBindingButton(screen.width - 185 + 22, 0, 128, 20, binding); + TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> { + MidnightControlsConfig.setButtonBinding(binding, binding.getDefaultButton()); + screen.updateList(); + }), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build(); + resetButton.setPosition(screen.width - 205 + 150 + 25, 0); + editButton.resetButton = resetButton; + editButton.updateMessage(false); + EntryInfo info = new EntryInfo(null, screen.modid); + + TextIconButtonWidget unbindButton = TextIconButtonWidget.builder(Text.translatable("midnightcontrols.narrator.unbound", binding.getText()), (button -> { + MidnightControlsConfig.setButtonBinding(binding, UNBOUND); + screen.updateList(); + }), true).texture(Identifier.of("midnightcontrols","icon/unbind"), 12, 12).dimension(20, 20).build(); + unbindButton.setPosition(screen.width - 205 + 20, 0); + unbindButton.setTooltip(Tooltip.of(SpruceTexts.GUI_UNBIND)); + + list.addButton(Lists.newArrayList(editButton, resetButton, unbindButton), Text.translatable(binding.getTranslationKey()), info); + } + + private final ButtonBinding binding; + private @Nullable ClickableWidget resetButton; + public ControllerBindingButton(int x, int y, int width, int height, ButtonBinding binding) { + super(x, y, width, height, binding.getText(), (button) -> {}, + (textSupplier) -> binding.isNotBound() ? Text.translatable("narrator.controls.unbound", binding.getTranslationKey()) : Text.translatable("narrator.controls.bound", binding.getTranslationKey(), textSupplier.get())); + this.binding = binding; + updateMessage(false); + } + + @Override + public void onPress(AbstractInput input) { + MidnightControlsClient.input.beginControlsInput(this); + this.updateMessage(true); + } + + + public void updateMessage(boolean focused) { + AtomicBoolean hasConflicts = new AtomicBoolean(false); + MutableText conflictingBindings = Text.empty(); + if (focused) this.setMessage(Text.literal("> ").append(getTranslatedButtons().copy().formatted(Formatting.WHITE, Formatting.UNDERLINE)).append(" <").formatted(Formatting.YELLOW)); + else { + this.setMessage(getTranslatedButtons()); + + if (!this.binding.isNotBound()) { + InputManager.streamBindings().forEach(keyBinding -> { + if (keyBinding != this.binding && this.binding.equals(keyBinding)) { + if (hasConflicts.get()) conflictingBindings.append(", "); + + hasConflicts.set(true); + conflictingBindings.append(Text.translatable(keyBinding.getTranslationKey())); + } + }); + } + } + + if (this.resetButton != null) this.resetButton.active = !this.binding.isDefault(); + + if (hasConflicts.get()) { + this.setMessage(Text.literal("[ ").append(this.getMessage().copy().formatted(Formatting.WHITE)).append(" ]").formatted(Formatting.RED)); + this.setTooltip(Tooltip.of(Text.translatable("controls.keybinds.duplicateKeybinds", conflictingBindings))); + } else { + this.setTooltip(null); + } + } + + private Text getTranslatedButtons() { + return this.binding.isNotBound() ? SpruceTexts.NOT_BOUND.copy() : + (binding.getButton().length > 0 ? ButtonBinding.getLocalizedButtonName(binding.getButton()[0]) : Text.literal("...")); + } + + @Override + public void drawMessage(DrawContext context, TextRenderer textRenderer, int color) { + if (this.binding.getButton().length < 2) super.drawMessage(context, textRenderer, color); + } + + @Override + protected void renderWidget(DrawContext context, int mouseX, int mouseY, float deltaTicks) { + super.renderWidget(context, mouseX, mouseY, deltaTicks); + int x = this.getX(); + if (this.binding.getButton().length > 1) { + x += (this.width / 2 - iconWidth / 2) - 4; + } + var size = MidnightControlsRenderer.drawButton(context, x, this.getY(), this.binding, MinecraftClient.getInstance()); + iconWidth = size.length(); + } + + @Override + public void finishBindingEdit(int... buttons) { + MidnightControlsConfig.setButtonBinding(binding, buttons); + updateMessage(false); + } + + @Override + public void update() { + this.updateMessage(true); + } + + @Override + public void setWaiting(boolean value) { + waiting = value; + } + + @Override + public boolean isWaiting() { + return waiting; + } + + @Override + public List getCurrentButtons() { + return currentButtons; + } + + @Override + public ButtonBinding getFocusedBinding() { + return this.binding; + } +} \ No newline at end of file diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java new file mode 100644 index 0000000..d5979eb --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControllerSelectionButton.java @@ -0,0 +1,62 @@ +package eu.midnightdust.midnightcontrols.client.gui.config; + +import eu.midnightdust.lib.config.EntryInfo; +import eu.midnightdust.lib.config.MidnightConfigListWidget; +import eu.midnightdust.lib.config.MidnightConfigScreen; +import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; +import eu.midnightdust.midnightcontrols.client.controller.Controller; +import net.minecraft.client.gui.widget.ButtonWidget; +import net.minecraft.client.gui.widget.TextIconButtonWidget; +import net.minecraft.text.Text; +import net.minecraft.util.Formatting; +import net.minecraft.util.Identifier; +import org.lwjgl.glfw.GLFW; +import org.thinkingstudio.obsidianui.SpruceTexts; + +import java.util.List; + +import static eu.midnightdust.midnightcontrols.client.gui.MidnightControlsSettingsScreen.searchNextAvailableController; + +public class ControllerSelectionButton { + public static void add(MidnightConfigListWidget list, MidnightConfigScreen screen, boolean second) { + TextIconButtonWidget resetButton = TextIconButtonWidget.builder(Text.translatable("controls.reset"), (button -> { + if (second) MidnightControlsConfig.secondControllerID = -1; + else MidnightControlsConfig.controllerID = 0; + screen.updateList(); + }), true).texture(Identifier.of("midnightlib","icon/reset"), 12, 12).dimension(20, 20).build(); + resetButton.setPosition(screen.width - 205 + 150 + 25, 0); + ButtonWidget editButton = ButtonWidget.builder(getControllerName(second), + button -> { + int id = second ? MidnightControlsConfig.getSecondController().map(Controller::id).orElse(-1) : MidnightControlsConfig.getController().id(); + id += 1; + if (id > GLFW.GLFW_JOYSTICK_LAST) + id = GLFW.GLFW_JOYSTICK_1; + id = searchNextAvailableController(id, second); + if (second) { + MidnightControlsConfig.setSecondController(Controller.byId(id)); + } else { + MidnightControlsConfig.setController(Controller.byId(id)); + } + if (MidnightControlsConfig.debug && id != -1) System.out.println(Controller.byId(id).getName() + "'s Controller GUID: " + Controller.byId(id).getGuid()); + + resetButton.active = second ? MidnightControlsConfig.getSecondController().isPresent() : false; + button.setMessage(getControllerName(second)); + }).dimensions(screen.width - 185, 0, 150, 20).build(); + resetButton.active = second ? MidnightControlsConfig.getSecondController().isPresent() : false; + + list.addButton(List.of(editButton, resetButton), Text.translatable(second ? "midnightcontrols.menu.controller2" : "midnightcontrols.menu.controller"), new EntryInfo(null, screen.modid)); + } + + private static Text getControllerName(boolean second) { + if (second && MidnightControlsConfig.getSecondController().isEmpty()) return SpruceTexts.OPTIONS_OFF.copyContentOnly().formatted(Formatting.RED); + + var controller = second ? MidnightControlsConfig.getSecondController().get() : MidnightControlsConfig.getController(); + var controllerName = controller.getName(); + if (!controller.isConnected()) + return Text.literal(controllerName).formatted(Formatting.RED); + else if (!controller.isGamepad()) + return Text.literal(controllerName).formatted(Formatting.GOLD); + else + return Text.literal(controllerName); + } +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControlsInput.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControlsInput.java new file mode 100644 index 0000000..0a9255b --- /dev/null +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/config/ControlsInput.java @@ -0,0 +1,18 @@ +package eu.midnightdust.midnightcontrols.client.gui.config; + +import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; + +import java.util.List; + +public interface ControlsInput { + void setWaiting(boolean value); + boolean isWaiting(); + + List getCurrentButtons(); + + ButtonBinding getFocusedBinding(); + + void finishBindingEdit(int[] buttons); + + default void update() {}; +} diff --git a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java index 6027f3a..9657e81 100644 --- a/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java +++ b/common/src/main/java/eu/midnightdust/midnightcontrols/client/gui/widget/ControllerControlsWidget.java @@ -12,6 +12,7 @@ package eu.midnightdust.midnightcontrols.client.gui.widget; import eu.midnightdust.midnightcontrols.client.MidnightControlsConfig; import eu.midnightdust.midnightcontrols.client.controller.ButtonBinding; import eu.midnightdust.midnightcontrols.client.controller.InputManager; +import eu.midnightdust.midnightcontrols.client.gui.config.ControlsInput; import org.thinkingstudio.obsidianui.Position; import org.thinkingstudio.obsidianui.SpruceTexts; import org.thinkingstudio.obsidianui.widget.SpruceButtonWidget; @@ -29,11 +30,11 @@ import java.util.stream.Collectors; /** * Represents the controls screen. */ -public class ControllerControlsWidget extends SpruceContainerWidget { +public class ControllerControlsWidget extends SpruceContainerWidget implements ControlsInput { private SpruceButtonWidget resetButton; - public ButtonBinding focusedBinding; - public boolean waiting = false; - public List currentButtons = new ArrayList<>(); + ButtonBinding focusedBinding = null; + boolean waiting = false; + List currentButtons = new ArrayList<>(); public ControllerControlsWidget(Position position, int width, int height) { super(position, width, height); @@ -66,4 +67,24 @@ public class ControllerControlsWidget extends SpruceContainerWidget { MidnightControlsConfig.setButtonBinding(this.focusedBinding, buttons); this.focusedBinding = null; } + + @Override + public void setWaiting(boolean value) { + this.waiting = value; + } + + @Override + public boolean isWaiting() { + return this.waiting; + } + + @Override + public List getCurrentButtons() { + return currentButtons; + } + + @Override + public ButtonBinding getFocusedBinding() { + return focusedBinding; + } }