forked from Clones/Controlify
➕ Allow to unbind bindings with Right Stick Press
This commit is contained in:
@ -63,7 +63,8 @@ public class ControllerBindings<T extends ControllerState> {
|
|||||||
VMOUSE_ESCAPE, VMOUSE_SHIFT,
|
VMOUSE_ESCAPE, VMOUSE_SHIFT,
|
||||||
VMOUSE_TOGGLE,
|
VMOUSE_TOGGLE,
|
||||||
GUI_NAVI_UP, GUI_NAVI_DOWN, GUI_NAVI_LEFT, GUI_NAVI_RIGHT,
|
GUI_NAVI_UP, GUI_NAVI_DOWN, GUI_NAVI_LEFT, GUI_NAVI_RIGHT,
|
||||||
CYCLE_OPT_FORWARD, CYCLE_OPT_BACKWARD;
|
CYCLE_OPT_FORWARD, CYCLE_OPT_BACKWARD,
|
||||||
|
CLEAR_BINDING;
|
||||||
|
|
||||||
private final Map<ResourceLocation, ControllerBinding> registry = new LinkedHashMap<>();
|
private final Map<ResourceLocation, ControllerBinding> registry = new LinkedHashMap<>();
|
||||||
|
|
||||||
@ -331,6 +332,11 @@ public class ControllerBindings<T extends ControllerState> {
|
|||||||
.defaultBind(GamepadBinds.RIGHT_STICK_LEFT)
|
.defaultBind(GamepadBinds.RIGHT_STICK_LEFT)
|
||||||
.category(GUI_CATEGORY)
|
.category(GUI_CATEGORY)
|
||||||
.build());
|
.build());
|
||||||
|
register(CLEAR_BINDING = ControllerBindingBuilder.create(controller)
|
||||||
|
.identifier("controlify", "clear_binding")
|
||||||
|
.defaultBind(GamepadBinds.RIGHT_STICK_PRESS)
|
||||||
|
.category(GUI_CATEGORY)
|
||||||
|
.build());
|
||||||
|
|
||||||
for (var constructor : CUSTOM_BINDS.values()) {
|
for (var constructor : CUSTOM_BINDS.values()) {
|
||||||
register(constructor.apply(this));
|
register(constructor.apply(this));
|
||||||
|
@ -0,0 +1,141 @@
|
|||||||
|
package dev.isxander.controlify.config.gui;
|
||||||
|
|
||||||
|
import com.mojang.blaze3d.vertex.PoseStack;
|
||||||
|
import dev.isxander.controlify.api.event.ControlifyEvents;
|
||||||
|
import dev.isxander.controlify.bindings.EmptyBind;
|
||||||
|
import dev.isxander.controlify.bindings.IBind;
|
||||||
|
import dev.isxander.controlify.controller.ControllerState;
|
||||||
|
import dev.isxander.controlify.screenop.ComponentProcessor;
|
||||||
|
import dev.isxander.controlify.screenop.ScreenProcessor;
|
||||||
|
import dev.isxander.yacl.api.Controller;
|
||||||
|
import dev.isxander.yacl.api.Option;
|
||||||
|
import dev.isxander.yacl.api.utils.Dimension;
|
||||||
|
import dev.isxander.yacl.gui.YACLScreen;
|
||||||
|
import dev.isxander.yacl.gui.controllers.ControllerWidget;
|
||||||
|
import net.minecraft.ChatFormatting;
|
||||||
|
import net.minecraft.network.chat.Component;
|
||||||
|
import org.lwjgl.glfw.GLFW;
|
||||||
|
|
||||||
|
import java.util.Optional;
|
||||||
|
|
||||||
|
public abstract class AbstractBindController<T extends ControllerState> implements Controller<IBind<T>> {
|
||||||
|
private final Option<IBind<T>> option;
|
||||||
|
public final dev.isxander.controlify.controller.Controller<T, ?> controller;
|
||||||
|
|
||||||
|
public AbstractBindController(Option<IBind<T>> option, dev.isxander.controlify.controller.Controller<T, ?> controller) {
|
||||||
|
this.option = option;
|
||||||
|
this.controller = controller;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Option<IBind<T>> option() {
|
||||||
|
return this.option;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Component formatValue() {
|
||||||
|
return Component.empty();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public abstract AbstractBindControllerElement<T> provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension);
|
||||||
|
|
||||||
|
public abstract static class AbstractBindControllerElement<T extends ControllerState> extends ControllerWidget<AbstractBindController<T>> implements ComponentProcessor, ControlifyEvents.ControllerStateUpdate {
|
||||||
|
private boolean awaitingControllerInput = false;
|
||||||
|
private boolean justTookInput = false;
|
||||||
|
private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC);
|
||||||
|
|
||||||
|
public AbstractBindControllerElement(AbstractBindController<T> control, YACLScreen screen, Dimension<Integer> dim) {
|
||||||
|
super(control, screen, dim);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected void drawValueText(PoseStack matrices, int mouseX, int mouseY, float delta) {
|
||||||
|
if (awaitingControllerInput) {
|
||||||
|
textRenderer.drawShadow(matrices, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), getDimension().centerY() - textRenderer.lineHeight / 2f, 0xFFFFFF);
|
||||||
|
} else {
|
||||||
|
var bind = control.option().pendingValue();
|
||||||
|
bind.draw(matrices, getDimension().xLimit() - bind.drawSize().width(), getDimension().centerY());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
||||||
|
if (isFocused() && keyCode == GLFW.GLFW_KEY_ENTER && !awaitingControllerInput) {
|
||||||
|
awaitingControllerInput = true;
|
||||||
|
ControllerBindHandler.setBindListener(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
||||||
|
if (getDimension().isPointInside((int)mouseX, (int)mouseY)) {
|
||||||
|
awaitingControllerInput = true;
|
||||||
|
ControllerBindHandler.setBindListener(this);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean overrideControllerButtons(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
||||||
|
if (controller != control.controller) return true;
|
||||||
|
|
||||||
|
if (controller.bindings().CLEAR_BINDING.justPressed()) {
|
||||||
|
control.option().requestSet(new EmptyBind<>());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (controller.bindings().GUI_PRESS.justPressed() && !awaitingControllerInput) {
|
||||||
|
ControllerBindHandler.setBindListener(this);
|
||||||
|
return awaitingControllerInput = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (justTookInput) {
|
||||||
|
justTookInput = false;
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onControllerStateUpdate(dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
||||||
|
if (controller != control.controller) return;
|
||||||
|
|
||||||
|
if (!awaitingControllerInput) return;
|
||||||
|
|
||||||
|
Optional<IBind<T>> pressedBind = getPressedBind();
|
||||||
|
if (pressedBind.isPresent()) {
|
||||||
|
control.option().requestSet(pressedBind.get());
|
||||||
|
awaitingControllerInput = false;
|
||||||
|
justTookInput = true;
|
||||||
|
ControllerBindHandler.clearBindListener();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public boolean overrideControllerNavigation(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
||||||
|
return awaitingControllerInput || justTookInput;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getHoveredControlWidth() {
|
||||||
|
return getUnhoveredControlWidth();
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
protected int getUnhoveredControlWidth() {
|
||||||
|
if (awaitingControllerInput)
|
||||||
|
return textRenderer.width(awaitingText);
|
||||||
|
|
||||||
|
return control.option().pendingValue().drawSize().width();
|
||||||
|
}
|
||||||
|
|
||||||
|
public abstract Optional<IBind<T>> getPressedBind();
|
||||||
|
}
|
||||||
|
}
|
@ -1,142 +1,43 @@
|
|||||||
package dev.isxander.controlify.config.gui;
|
package dev.isxander.controlify.config.gui;
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import dev.isxander.controlify.api.event.ControlifyEvents;
|
|
||||||
import dev.isxander.controlify.bindings.GamepadBind;
|
import dev.isxander.controlify.bindings.GamepadBind;
|
||||||
import dev.isxander.controlify.bindings.GamepadBinds;
|
import dev.isxander.controlify.bindings.GamepadBinds;
|
||||||
import dev.isxander.controlify.bindings.IBind;
|
import dev.isxander.controlify.bindings.IBind;
|
||||||
import dev.isxander.controlify.controller.gamepad.GamepadController;
|
import dev.isxander.controlify.controller.gamepad.GamepadController;
|
||||||
import dev.isxander.controlify.controller.gamepad.GamepadState;
|
import dev.isxander.controlify.controller.gamepad.GamepadState;
|
||||||
import dev.isxander.controlify.screenop.ScreenProcessor;
|
|
||||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
|
||||||
import dev.isxander.yacl.api.Controller;
|
|
||||||
import dev.isxander.yacl.api.Option;
|
import dev.isxander.yacl.api.Option;
|
||||||
import dev.isxander.yacl.api.utils.Dimension;
|
import dev.isxander.yacl.api.utils.Dimension;
|
||||||
import dev.isxander.yacl.gui.AbstractWidget;
|
|
||||||
import dev.isxander.yacl.gui.YACLScreen;
|
import dev.isxander.yacl.gui.YACLScreen;
|
||||||
import dev.isxander.yacl.gui.controllers.ControllerWidget;
|
|
||||||
import net.minecraft.ChatFormatting;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
|
|
||||||
public class GamepadBindController implements Controller<IBind<GamepadState>> {
|
import java.util.Optional;
|
||||||
private final Option<IBind<GamepadState>> option;
|
|
||||||
private final GamepadController controller;
|
|
||||||
|
|
||||||
|
public class GamepadBindController extends AbstractBindController<GamepadState> {
|
||||||
public GamepadBindController(Option<IBind<GamepadState>> option, GamepadController controller) {
|
public GamepadBindController(Option<IBind<GamepadState>> option, GamepadController controller) {
|
||||||
this.option = option;
|
super(option, controller);
|
||||||
this.controller = controller;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Option<IBind<GamepadState>> option() {
|
public AbstractBindControllerElement<GamepadState> provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension) {
|
||||||
return this.option;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Component formatValue() {
|
|
||||||
return Component.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AbstractWidget provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension) {
|
|
||||||
return new BindButtonWidget(this, yaclScreen, dimension);
|
return new BindButtonWidget(this, yaclScreen, dimension);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BindButtonWidget extends ControllerWidget<GamepadBindController> implements ComponentProcessor, ControlifyEvents.ControllerStateUpdate {
|
public static class BindButtonWidget extends AbstractBindControllerElement<GamepadState> {
|
||||||
private boolean awaitingControllerInput = false;
|
|
||||||
private boolean justTookInput = false;
|
|
||||||
private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC);
|
|
||||||
|
|
||||||
public BindButtonWidget(GamepadBindController control, YACLScreen screen, Dimension<Integer> dim) {
|
public BindButtonWidget(GamepadBindController control, YACLScreen screen, Dimension<Integer> dim) {
|
||||||
super(control, screen, dim);
|
super(control, screen, dim);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void drawValueText(PoseStack matrices, int mouseX, int mouseY, float delta) {
|
public Optional<IBind<GamepadState>> getPressedBind() {
|
||||||
if (awaitingControllerInput) {
|
var gamepad = (GamepadController) control.controller;
|
||||||
textRenderer.drawShadow(matrices, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), getDimension().centerY() - textRenderer.lineHeight / 2f, 0xFFFFFF);
|
|
||||||
} else {
|
|
||||||
var bind = control.option().pendingValue();
|
|
||||||
bind.draw(matrices, getDimension().xLimit() - bind.drawSize().width(), getDimension().centerY());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
|
||||||
if (isFocused() && keyCode == GLFW.GLFW_KEY_ENTER && !awaitingControllerInput) {
|
|
||||||
awaitingControllerInput = true;
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
|
||||||
if (getDimension().isPointInside((int)mouseX, (int)mouseY)) {
|
|
||||||
awaitingControllerInput = true;
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean overrideControllerButtons(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
if (controller != control.controller) return true;
|
|
||||||
|
|
||||||
if (controller.bindings().GUI_PRESS.justPressed() && !awaitingControllerInput) {
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return awaitingControllerInput = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (justTookInput) {
|
|
||||||
justTookInput = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onControllerStateUpdate(dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
if (controller != control.controller) return;
|
|
||||||
|
|
||||||
if (!awaitingControllerInput) return;
|
|
||||||
|
|
||||||
var gamepad = control.controller;
|
|
||||||
|
|
||||||
for (var bindType : GamepadBinds.values()) {
|
for (var bindType : GamepadBinds.values()) {
|
||||||
GamepadBind bind = bindType.forGamepad(gamepad);
|
GamepadBind bind = bindType.forGamepad(gamepad);
|
||||||
if (bind.held(gamepad.state()) && !bind.held(gamepad.prevState())) {
|
if (bind.held(gamepad.state()) && !bind.held(gamepad.prevState())) {
|
||||||
control.option().requestSet(bind);
|
return Optional.of(bind);
|
||||||
awaitingControllerInput = false;
|
|
||||||
justTookInput = true;
|
|
||||||
ControllerBindHandler.clearBindListener();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return Optional.empty();
|
||||||
public boolean overrideControllerNavigation(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
return awaitingControllerInput || justTookInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getHoveredControlWidth() {
|
|
||||||
return getUnhoveredControlWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getUnhoveredControlWidth() {
|
|
||||||
if (awaitingControllerInput)
|
|
||||||
return textRenderer.width(awaitingText);
|
|
||||||
|
|
||||||
return control.option().pendingValue().drawSize().width();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,124 +1,38 @@
|
|||||||
package dev.isxander.controlify.config.gui;
|
package dev.isxander.controlify.config.gui;
|
||||||
|
|
||||||
import com.mojang.blaze3d.vertex.PoseStack;
|
|
||||||
import dev.isxander.controlify.api.event.ControlifyEvents;
|
|
||||||
import dev.isxander.controlify.bindings.*;
|
import dev.isxander.controlify.bindings.*;
|
||||||
import dev.isxander.controlify.controller.joystick.JoystickController;
|
import dev.isxander.controlify.controller.joystick.JoystickController;
|
||||||
import dev.isxander.controlify.controller.joystick.SingleJoystickController;
|
|
||||||
import dev.isxander.controlify.controller.joystick.JoystickState;
|
import dev.isxander.controlify.controller.joystick.JoystickState;
|
||||||
import dev.isxander.controlify.screenop.ComponentProcessor;
|
|
||||||
import dev.isxander.controlify.screenop.ScreenProcessor;
|
|
||||||
import dev.isxander.yacl.api.Controller;
|
|
||||||
import dev.isxander.yacl.api.Option;
|
import dev.isxander.yacl.api.Option;
|
||||||
import dev.isxander.yacl.api.utils.Dimension;
|
import dev.isxander.yacl.api.utils.Dimension;
|
||||||
import dev.isxander.yacl.gui.AbstractWidget;
|
|
||||||
import dev.isxander.yacl.gui.YACLScreen;
|
import dev.isxander.yacl.gui.YACLScreen;
|
||||||
import dev.isxander.yacl.gui.controllers.ControllerWidget;
|
|
||||||
import net.minecraft.ChatFormatting;
|
|
||||||
import net.minecraft.network.chat.Component;
|
|
||||||
import org.lwjgl.glfw.GLFW;
|
|
||||||
|
|
||||||
public class JoystickBindController implements Controller<IBind<JoystickState>> {
|
import java.util.Optional;
|
||||||
private final Option<IBind<JoystickState>> option;
|
|
||||||
private final JoystickController<?> controller;
|
|
||||||
|
|
||||||
|
public class JoystickBindController extends AbstractBindController<JoystickState> {
|
||||||
public JoystickBindController(Option<IBind<JoystickState>> option, JoystickController<?> controller) {
|
public JoystickBindController(Option<IBind<JoystickState>> option, JoystickController<?> controller) {
|
||||||
this.option = option;
|
super(option, controller);
|
||||||
this.controller = controller;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Option<IBind<JoystickState>> option() {
|
public AbstractBindControllerElement<JoystickState> provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension) {
|
||||||
return this.option;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public Component formatValue() {
|
|
||||||
return Component.empty();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public AbstractWidget provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension) {
|
|
||||||
return new BindButtonWidget(this, yaclScreen, dimension);
|
return new BindButtonWidget(this, yaclScreen, dimension);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class BindButtonWidget extends ControllerWidget<JoystickBindController> implements ComponentProcessor, ControlifyEvents.ControllerStateUpdate {
|
public static class BindButtonWidget extends AbstractBindControllerElement<JoystickState> {
|
||||||
private boolean awaitingControllerInput = false;
|
|
||||||
private boolean justTookInput = false;
|
|
||||||
private final Component awaitingText = Component.translatable("controlify.gui.bind_input_awaiting").withStyle(ChatFormatting.ITALIC);
|
|
||||||
|
|
||||||
public BindButtonWidget(JoystickBindController control, YACLScreen screen, Dimension<Integer> dim) {
|
public BindButtonWidget(JoystickBindController control, YACLScreen screen, Dimension<Integer> dim) {
|
||||||
super(control, screen, dim);
|
super(control, screen, dim);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
protected void drawValueText(PoseStack matrices, int mouseX, int mouseY, float delta) {
|
public Optional<IBind<JoystickState>> getPressedBind() {
|
||||||
if (awaitingControllerInput) {
|
var joystick = (JoystickController<?>) control.controller;
|
||||||
textRenderer.drawShadow(matrices, awaitingText, getDimension().xLimit() - textRenderer.width(awaitingText) - getXPadding(), getDimension().centerY() - textRenderer.lineHeight / 2f, 0xFFFFFF);
|
|
||||||
} else {
|
|
||||||
var bind = control.option().pendingValue();
|
|
||||||
bind.draw(matrices, getDimension().xLimit() - bind.drawSize().width(), getDimension().centerY());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean keyPressed(int keyCode, int scanCode, int modifiers) {
|
|
||||||
if (isFocused() && keyCode == GLFW.GLFW_KEY_ENTER && !awaitingControllerInput) {
|
|
||||||
awaitingControllerInput = true;
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean mouseClicked(double mouseX, double mouseY, int button) {
|
|
||||||
if (getDimension().isPointInside((int)mouseX, (int)mouseY)) {
|
|
||||||
awaitingControllerInput = true;
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean overrideControllerButtons(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
if (controller != control.controller) return true;
|
|
||||||
|
|
||||||
if (justTookInput) {
|
|
||||||
justTookInput = false;
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (controller.bindings().GUI_PRESS.justPressed() && !awaitingControllerInput) {
|
|
||||||
awaitingControllerInput = true;
|
|
||||||
ControllerBindHandler.setBindListener(this);
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
return awaitingControllerInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onControllerStateUpdate(dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
if (controller != control.controller) return;
|
|
||||||
|
|
||||||
if (!awaitingControllerInput) return;
|
|
||||||
|
|
||||||
var joystick = control.controller;
|
|
||||||
|
|
||||||
var state = joystick.state();
|
var state = joystick.state();
|
||||||
var prevState = joystick.prevState();
|
var prevState = joystick.prevState();
|
||||||
|
|
||||||
for (int i = 0; i < Math.min(state.buttons().size(), prevState.buttons().size()); i++) {
|
for (int i = 0; i < Math.min(state.buttons().size(), prevState.buttons().size()); i++) {
|
||||||
if (state.buttons().get(i) && !prevState.buttons().get(i)) {
|
if (state.buttons().get(i) && !prevState.buttons().get(i)) {
|
||||||
control.option().requestSet(new JoystickButtonBind(joystick, i));
|
return Optional.of(new JoystickButtonBind(joystick, i));
|
||||||
awaitingControllerInput = false;
|
|
||||||
justTookInput = true;
|
|
||||||
ControllerBindHandler.clearBindListener();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -129,17 +43,9 @@ public class JoystickBindController implements Controller<IBind<JoystickState>>
|
|||||||
|
|
||||||
if (Math.abs(prevAxis) < activationThreshold) {
|
if (Math.abs(prevAxis) < activationThreshold) {
|
||||||
if (axis > activationThreshold) {
|
if (axis > activationThreshold) {
|
||||||
control.option().requestSet(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.POSITIVE));
|
return Optional.of(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.POSITIVE));
|
||||||
awaitingControllerInput = false;
|
|
||||||
justTookInput = true;
|
|
||||||
ControllerBindHandler.clearBindListener();
|
|
||||||
return;
|
|
||||||
} else if (axis < -activationThreshold) {
|
} else if (axis < -activationThreshold) {
|
||||||
control.option().requestSet(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.NEGATIVE));
|
return Optional.of(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.NEGATIVE));
|
||||||
awaitingControllerInput = false;
|
|
||||||
justTookInput = true;
|
|
||||||
ControllerBindHandler.clearBindListener();
|
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -149,31 +55,11 @@ public class JoystickBindController implements Controller<IBind<JoystickState>>
|
|||||||
var prevHat = prevState.hats().get(i);
|
var prevHat = prevState.hats().get(i);
|
||||||
|
|
||||||
if (prevHat.isCentered() && !hat.isCentered()) {
|
if (prevHat.isCentered() && !hat.isCentered()) {
|
||||||
control.option().requestSet(new JoystickHatBind(joystick, i, hat));
|
return Optional.of(new JoystickHatBind(joystick, i, hat));
|
||||||
awaitingControllerInput = false;
|
|
||||||
justTookInput = true;
|
|
||||||
ControllerBindHandler.clearBindListener();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
return Optional.empty();
|
||||||
public boolean overrideControllerNavigation(ScreenProcessor<?> screen, dev.isxander.controlify.controller.Controller<?, ?> controller) {
|
|
||||||
return awaitingControllerInput || justTookInput;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getHoveredControlWidth() {
|
|
||||||
return getUnhoveredControlWidth();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
protected int getUnhoveredControlWidth() {
|
|
||||||
if (awaitingControllerInput)
|
|
||||||
return textRenderer.width(awaitingText);
|
|
||||||
|
|
||||||
return control.option().pendingValue().drawSize().width();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -178,6 +178,7 @@
|
|||||||
"controlify.binding.controlify.gui_navi_right": "GUI Navi Right",
|
"controlify.binding.controlify.gui_navi_right": "GUI Navi Right",
|
||||||
"controlify.binding.controlify.cycle_opt_forward": "Cycle Option Forward",
|
"controlify.binding.controlify.cycle_opt_forward": "Cycle Option Forward",
|
||||||
"controlify.binding.controlify.cycle_opt_backward": "Cycle Option Backward",
|
"controlify.binding.controlify.cycle_opt_backward": "Cycle Option Backward",
|
||||||
|
"controlify.binding.controlify.clear_binding": "Clear Binding",
|
||||||
|
|
||||||
"controlify.binding_category.gui": "GUI",
|
"controlify.binding_category.gui": "GUI",
|
||||||
"controlify.binding_category.vmouse": "Virtual Mouse",
|
"controlify.binding_category.vmouse": "Virtual Mouse",
|
||||||
|
Reference in New Issue
Block a user