forked from Clones/Controlify
➕ Add a reset all binds button
This commit is contained in:
@ -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();
|
||||||
|
|
||||||
|
@ -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) {
|
||||||
|
@ -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(() -> {
|
||||||
|
@ -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",
|
||||||
|
Reference in New Issue
Block a user