1
0
forked from Clones/Controlify
Files
Controlify/src/main/java/dev/isxander/controlify/gui/controllers/JoystickBindController.java
2023-05-30 14:24:15 +01:00

66 lines
2.7 KiB
Java

package dev.isxander.controlify.gui.controllers;
import dev.isxander.controlify.bindings.*;
import dev.isxander.controlify.controller.joystick.JoystickController;
import dev.isxander.controlify.controller.joystick.JoystickState;
import dev.isxander.yacl.api.Option;
import dev.isxander.yacl.api.utils.Dimension;
import dev.isxander.yacl.gui.YACLScreen;
import java.util.Optional;
public class JoystickBindController extends AbstractBindController<JoystickState> {
public JoystickBindController(Option<IBind<JoystickState>> option, JoystickController<?> controller) {
super(option, controller);
}
@Override
public AbstractBindControllerElement<JoystickState> provideWidget(YACLScreen yaclScreen, Dimension<Integer> dimension) {
return new BindButtonWidget(this, yaclScreen, dimension);
}
public static class BindButtonWidget extends AbstractBindControllerElement<JoystickState> {
public BindButtonWidget(JoystickBindController control, YACLScreen screen, Dimension<Integer> dim) {
super(control, screen, dim);
}
@Override
public Optional<IBind<JoystickState>> getPressedBind() {
var joystick = (JoystickController<?>) control.controller;
var state = joystick.state();
var prevState = joystick.prevState();
for (int i = 0; i < Math.min(state.buttons().size(), prevState.buttons().size()); i++) {
if (state.buttons().get(i) && !prevState.buttons().get(i)) {
return Optional.of(new JoystickButtonBind(joystick, i));
}
}
for (int i = 0; i < Math.min(state.axes().size(), prevState.axes().size()); i++) {
var axis = state.axes().get(i);
var prevAxis = prevState.axes().get(i);
var activationThreshold = joystick.config().buttonActivationThreshold;
if (Math.abs(prevAxis) < activationThreshold) {
if (axis > activationThreshold) {
return Optional.of(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.POSITIVE));
} else if (axis < -activationThreshold) {
return Optional.of(new JoystickAxisBind(joystick, i, JoystickAxisBind.AxisDirection.NEGATIVE));
}
}
}
for (int i = 0; i < Math.min(state.hats().size(), prevState.hats().size()); i++) {
var hat = state.hats().get(i);
var prevHat = prevState.hats().get(i);
if (prevHat.isCentered() && !hat.isCentered()) {
return Optional.of(new JoystickHatBind(joystick, i, hat));
}
}
return Optional.empty();
}
}
}