1
0
forked from Clones/Controlify

Add a reset all binds button

This commit is contained in:
isXander
2023-10-30 19:31:59 +00:00
parent 801c8da9b2
commit 675bceff18
4 changed files with 36 additions and 23 deletions

View File

@ -61,6 +61,7 @@ public interface ControllerBinding {
@Nullable KeyMappingOverride override(); @Nullable KeyMappingOverride override();
IBind<?> getBind(); IBind<?> getBind();
IBind<?> defaultBind();
void resetBind(); void resetBind();
boolean isUnbound(); boolean isUnbound();

View File

@ -122,16 +122,13 @@ public class ControllerBindingImpl<T extends ControllerState> implements Control
return Optional.ofNullable(this.radialIcon); return Optional.ofNullable(this.radialIcon);
} }
public IBind<T> currentBind() {
return bind;
}
public void setCurrentBind(IBind<T> bind) { public void setCurrentBind(IBind<T> bind) {
this.bind = bind; this.bind = bind;
this.renderer = new BindRendererImpl(bind); this.renderer = new BindRendererImpl(bind);
Controlify.instance().config().setDirty(); Controlify.instance().config().setDirty();
} }
@Override
public IBind<T> defaultBind() { public IBind<T> defaultBind() {
return defaultBind; return defaultBind;
} }
@ -182,7 +179,7 @@ public class ControllerBindingImpl<T extends ControllerState> implements Control
@Override @Override
public JsonObject toJson() { public JsonObject toJson() {
return currentBind().toJson(); return getBind().toJson();
} }
@Override @Override
@ -194,7 +191,7 @@ public class ControllerBindingImpl<T extends ControllerState> implements Control
public Option.Builder<?> startYACLOption() { public Option.Builder<?> startYACLOption() {
Option.Builder<IBind<T>> option = Option.<IBind<T>>createBuilder() Option.Builder<IBind<T>> option = Option.<IBind<T>>createBuilder()
.name(name()) .name(name())
.binding(new EmptyBind<>(), this::currentBind, this::setCurrentBind) .binding(new EmptyBind<>(), this::getBind, this::setCurrentBind)
.description(OptionDescription.of(this.description())); .description(OptionDescription.of(this.description()));
if (controller instanceof GamepadController gamepad) { if (controller instanceof GamepadController gamepad) {

View File

@ -33,8 +33,8 @@ import java.util.stream.Collectors;
import java.util.stream.IntStream; import java.util.stream.IntStream;
public class ControllerConfigScreenFactory { public class ControllerConfigScreenFactory {
private static final Function<Float, Component> percentFormatter = v -> Component.literal(String.format("%.0f%%", v*100)); private static final ValueFormatter<Float> percentFormatter = v -> Component.literal(String.format("%.0f%%", v*100));
private static final Function<Float, Component> percentOrOffFormatter = v -> v == 0 ? CommonComponents.OPTION_OFF : percentFormatter.apply(v); private static final ValueFormatter<Float> percentOrOffFormatter = v -> v == 0 ? CommonComponents.OPTION_OFF : percentFormatter.format(v);
private static final Component newOptionLabel = Component.translatable("controlify.gui.new_options.label").withStyle(ChatFormatting.GOLD); private static final Component newOptionLabel = Component.translatable("controlify.gui.new_options.label").withStyle(ChatFormatting.GOLD);
private final List<Option<?>> newOptions = new ArrayList<>(); private final List<Option<?>> newOptions = new ArrayList<>();
@ -99,7 +99,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.horizontalLookSensitivity, () -> config.horizontalLookSensitivity, v -> config.horizontalLookSensitivity = v) .binding(def.horizontalLookSensitivity, () -> config.horizontalLookSensitivity, v -> config.horizontalLookSensitivity = v)
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0.1f, 2f).step(0.05f).valueFormatter(percentFormatter)) .range(0.1f, 2f).step(0.05f).formatValue(percentFormatter))
.build()) .build())
.option(Option.<Float>createBuilder() .option(Option.<Float>createBuilder()
.name(Component.translatable("controlify.gui.vertical_look_sensitivity")) .name(Component.translatable("controlify.gui.vertical_look_sensitivity"))
@ -108,7 +108,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.verticalLookSensitivity, () -> config.verticalLookSensitivity, v -> config.verticalLookSensitivity = v) .binding(def.verticalLookSensitivity, () -> config.verticalLookSensitivity, v -> config.verticalLookSensitivity = v)
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0.1f, 2f).step(0.05f).valueFormatter(percentFormatter)) .range(0.1f, 2f).step(0.05f).formatValue(percentFormatter))
.build()) .build())
.option(Option.<Float>createBuilder() .option(Option.<Float>createBuilder()
.name(Component.translatable("controlify.gui.vmouse_sensitivity")) .name(Component.translatable("controlify.gui.vmouse_sensitivity"))
@ -117,7 +117,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.virtualMouseSensitivity, () -> config.virtualMouseSensitivity, v -> config.virtualMouseSensitivity = v) .binding(def.virtualMouseSensitivity, () -> config.virtualMouseSensitivity, v -> config.virtualMouseSensitivity = v)
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0.1f, 2f).step(0.05f).valueFormatter(percentFormatter)) .range(0.1f, 2f).step(0.05f).formatValue(percentFormatter))
.build()) .build())
.option(Option.<Boolean>createBuilder() .option(Option.<Boolean>createBuilder()
.name(Component.translatable("controlify.gui.reduce_aiming_sensitivity")) .name(Component.translatable("controlify.gui.reduce_aiming_sensitivity"))
@ -132,7 +132,7 @@ public class ControllerConfigScreenFactory {
} }
private OptionGroup makeControlsGroup(Controller<?, ?> controller, ControllerConfig def, ControllerConfig config) { private OptionGroup makeControlsGroup(Controller<?, ?> controller, ControllerConfig def, ControllerConfig config) {
Function<Boolean, Component> holdToggleFormatter = v -> Component.translatable("controlify.gui.format.hold_toggle." + (v ? "toggle" : "hold")); ValueFormatter<Boolean> holdToggleFormatter = v -> Component.translatable("controlify.gui.format.hold_toggle." + (v ? "toggle" : "hold"));
return OptionGroup.createBuilder() return OptionGroup.createBuilder()
.name(Component.translatable("controlify.gui.config.group.controls")) .name(Component.translatable("controlify.gui.config.group.controls"))
@ -143,7 +143,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.toggleSprint, () -> config.toggleSprint, v -> config.toggleSprint = v) .binding(def.toggleSprint, () -> config.toggleSprint, v -> config.toggleSprint = v)
.controller(opt -> BooleanControllerBuilder.create(opt) .controller(opt -> BooleanControllerBuilder.create(opt)
.valueFormatter(holdToggleFormatter) .formatValue(holdToggleFormatter)
.coloured(false)) .coloured(false))
.build()) .build())
.option(Option.<Boolean>createBuilder() .option(Option.<Boolean>createBuilder()
@ -153,7 +153,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.toggleSneak, () -> config.toggleSneak, v -> config.toggleSneak = v) .binding(def.toggleSneak, () -> config.toggleSneak, v -> config.toggleSneak = v)
.controller(opt -> BooleanControllerBuilder.create(opt) .controller(opt -> BooleanControllerBuilder.create(opt)
.valueFormatter(holdToggleFormatter) .formatValue(holdToggleFormatter)
.coloured(false)) .coloured(false))
.build()) .build())
.option(Option.<Boolean>createBuilder() .option(Option.<Boolean>createBuilder()
@ -195,7 +195,7 @@ public class ControllerConfigScreenFactory {
.description(OptionDescription.of(Component.translatable("controlify.gui.ingame_button_guide_position.tooltip"))) .description(OptionDescription.of(Component.translatable("controlify.gui.ingame_button_guide_position.tooltip")))
.binding(def.ingameGuideBottom, () -> config.ingameGuideBottom, v -> config.ingameGuideBottom = v) .binding(def.ingameGuideBottom, () -> config.ingameGuideBottom, v -> config.ingameGuideBottom = v)
.controller(opt -> BooleanControllerBuilder.create(opt) .controller(opt -> BooleanControllerBuilder.create(opt)
.valueFormatter(v -> Component.translatable(v ? "controlify.gui.format.bottom" : "controlify.gui.format.top"))) .formatValue(v -> Component.translatable(v ? "controlify.gui.format.bottom" : "controlify.gui.format.top")))
.flag(mc -> Controlify.instance().inGameButtonGuide().ifPresent(InGameButtonGuide::refreshLayout)) .flag(mc -> Controlify.instance().inGameButtonGuide().ifPresent(InGameButtonGuide::refreshLayout))
.build()) .build())
.option(Option.<Boolean>createBuilder() .option(Option.<Boolean>createBuilder()
@ -214,7 +214,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(def.chatKeyboardHeight, () -> config.chatKeyboardHeight, v -> config.chatKeyboardHeight = v) .binding(def.chatKeyboardHeight, () -> config.chatKeyboardHeight, v -> config.chatKeyboardHeight = v)
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 8f).step(0.1f).valueFormatter(percentFormatter)) .range(0f, 8f).step(0.1f).formatValue(percentFormatter))
.build()) .build())
.build(); .build();
} }
@ -241,7 +241,7 @@ public class ControllerConfigScreenFactory {
) )
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 1f).step(0.01f) .range(0f, 1f).step(0.01f)
.valueFormatter(percentFormatter)) .formatValue(percentFormatter))
.build(); .build();
Option<Float> right = Option.<Float>createBuilder() Option<Float> right = Option.<Float>createBuilder()
@ -257,7 +257,7 @@ public class ControllerConfigScreenFactory {
) )
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 1f).step(0.01f) .range(0f, 1f).step(0.01f)
.valueFormatter(percentFormatter)) .formatValue(percentFormatter))
.build(); .build();
group.option(left); group.option(left);
@ -292,7 +292,7 @@ public class ControllerConfigScreenFactory {
.binding(jsCfgDef.getDeadzone(i), () -> jsCfg.getDeadzone(i), v -> jsCfg.setDeadzone(i, v)) .binding(jsCfgDef.getDeadzone(i), () -> jsCfg.getDeadzone(i), v -> jsCfg.setDeadzone(i, v))
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 1f).step(0.01f) .range(0f, 1f).step(0.01f)
.valueFormatter(percentFormatter)) .formatValue(percentFormatter))
.build(); .build();
group.option(deadzoneOpt); group.option(deadzoneOpt);
deadzoneOpts.add(deadzoneOpt); deadzoneOpts.add(deadzoneOpt);
@ -307,7 +307,7 @@ public class ControllerConfigScreenFactory {
.binding(def.buttonActivationThreshold, () -> config.buttonActivationThreshold, v -> config.buttonActivationThreshold = v) .binding(def.buttonActivationThreshold, () -> config.buttonActivationThreshold, v -> config.buttonActivationThreshold = v)
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 1f).step(0.01f) .range(0f, 1f).step(0.01f)
.valueFormatter(percentFormatter)) .formatValue(percentFormatter))
.build()); .build());
group.option(ButtonOption.createBuilder() group.option(ButtonOption.createBuilder()
@ -378,6 +378,19 @@ public class ControllerConfigScreenFactory {
}); });
updateConflictingBinds(optionBinds); updateConflictingBinds(optionBinds);
category.option(ButtonOption.createBuilder()
.name(Component.translatable("controlify.gui.reset_all_binds"))
.description(OptionDescription.createBuilder()
.text(Component.translatable("controlify.gui.reset_all_binds.tooltip"))
.build())
.action((screen, opt) -> {
for (OptionBindPair pair : optionBinds) {
// who needs a type system?
((Option<Object>) pair.option()).requestSet(pair.binding.defaultBind());
}
})
.build());
return category.build(); return category.build();
} }
@ -438,7 +451,7 @@ public class ControllerConfigScreenFactory {
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 2f) .range(0f, 2f)
.step(0.05f) .step(0.05f)
.valueFormatter(percentOrOffFormatter)) .formatValue(percentOrOffFormatter))
.available(allowVibrationOption.pendingValue()) .available(allowVibrationOption.pendingValue())
.build(); .build();
strengthOptions.add(option); strengthOptions.add(option);
@ -493,7 +506,7 @@ public class ControllerConfigScreenFactory {
.controller(opt -> FloatSliderControllerBuilder.create(opt) .controller(opt -> FloatSliderControllerBuilder.create(opt)
.range(0f, 3f) .range(0f, 3f)
.step(0.1f) .step(0.1f)
.valueFormatter(percentOrOffFormatter)) .formatValue(percentOrOffFormatter))
.listener((opt, sensitivity) -> gyroOptions.forEach(o -> { .listener((opt, sensitivity) -> gyroOptions.forEach(o -> {
o.setAvailable(sensitivity > 0); o.setAvailable(sensitivity > 0);
o.requestSetDefault(); o.requestSetDefault();
@ -507,7 +520,7 @@ public class ControllerConfigScreenFactory {
.build()) .build())
.binding(gpCfgDef.relativeGyroMode, () -> gpCfg.relativeGyroMode, v -> gpCfg.relativeGyroMode = v) .binding(gpCfgDef.relativeGyroMode, () -> gpCfg.relativeGyroMode, v -> gpCfg.relativeGyroMode = v)
.controller(opt -> BooleanControllerBuilder.create(opt) .controller(opt -> BooleanControllerBuilder.create(opt)
.valueFormatter(v -> v ? Component.translatable("controlify.gui.gyro_behaviour.relative") : Component.translatable("controlify.gui.gyro_behaviour.absolute"))) .formatValue(v -> v ? Component.translatable("controlify.gui.gyro_behaviour.relative") : Component.translatable("controlify.gui.gyro_behaviour.absolute")))
.build(); .build();
gyroGroup.option(relativeModeOpt); gyroGroup.option(relativeModeOpt);
gyroGroup.option(Util.make(() -> { gyroGroup.option(Util.make(() -> {

View File

@ -132,6 +132,8 @@
"controlify.gui.radial_menu.btn_text": "CONFIGURE", "controlify.gui.radial_menu.btn_text": "CONFIGURE",
"controlify.gui.group.controls": "Controls", "controlify.gui.group.controls": "Controls",
"controlify.gui.group.controls.tooltip": "Adjust the controller controls.", "controlify.gui.group.controls.tooltip": "Adjust the controller controls.",
"controlify.gui.reset_all_binds": "Reset All Binds",
"controlify.gui.reset_all_binds.tooltip": "Sets all binds to their default values. This can be undone by pressing the undo button.",
"controlify.gui.bind_input_awaiting": "Press any button", "controlify.gui.bind_input_awaiting": "Press any button",
"controlify.gui.format.ticks": "%s ticks", "controlify.gui.format.ticks": "%s ticks",