diff --git a/src/main/java/me/contaria/standardsettings/StandardSettingsConfig.java b/src/main/java/me/contaria/standardsettings/StandardSettingsConfig.java index 390d608d..ec3aba52 100644 --- a/src/main/java/me/contaria/standardsettings/StandardSettingsConfig.java +++ b/src/main/java/me/contaria/standardsettings/StandardSettingsConfig.java @@ -11,6 +11,7 @@ import me.contaria.speedrunapi.config.api.SpeedrunOption; import me.contaria.speedrunapi.config.api.annotations.Config; import me.contaria.speedrunapi.util.TextUtil; +import me.contaria.standardsettings.gui.SliderTextFieldStandardOptionWidget; import me.contaria.standardsettings.options.*; import net.minecraft.client.MinecraftClient; import net.minecraft.client.gui.screen.ConfirmScreen; @@ -180,7 +181,27 @@ public boolean hasWidget() { this.register("forceUnicodeFont", "options.language", Option.FORCE_UNICODE_FONT); // Mouse Settings - this.register("mouseSensitivity", "options.mouse_settings", Option.SENSITIVITY); + this.register(new DoubleOptionStandardSetting("mouseSensitivity", "options.mouse_settings", this.options, Option.SENSITIVITY) { + @Override + public @NotNull AbstractButtonWidget createWidget() { + TextFieldWidget textField = new TextFieldWidget(MinecraftClient.getInstance().textRenderer, 0, 0, 120, 20, TextUtil.empty()); + textField.setMaxLength(128); + textField.setText(String.valueOf(this.get())); + textField.setChangedListener(string -> { + if (string.isEmpty()) { + return; + } + double value; + try { + value = Double.parseDouble(string); + } catch (NumberFormatException e) { + return; + } + this.set(this.options, value); + }); + return new SliderTextFieldStandardOptionWidget(this, this.createMainWidget(), textField); + } + }); this.register("invertYMouse", "options.mouse_settings", Option.INVERT_MOUSE); this.register("mouseWheelSensitivity", "options.mouse_settings", Option.MOUSE_WHEEL_SENSITIVITY); this.register("discrete_mouse_scroll", "options.mouse_settings", Option.DISCRETE_MOUSE_SCROLL); diff --git a/src/main/java/me/contaria/standardsettings/gui/SliderTextFieldStandardOptionWidget.java b/src/main/java/me/contaria/standardsettings/gui/SliderTextFieldStandardOptionWidget.java new file mode 100644 index 00000000..201031a4 --- /dev/null +++ b/src/main/java/me/contaria/standardsettings/gui/SliderTextFieldStandardOptionWidget.java @@ -0,0 +1,33 @@ +package me.contaria.standardsettings.gui; + +import me.contaria.standardsettings.mixin.accessors.SliderWidgetAccessor; +import me.contaria.standardsettings.options.DoubleOptionStandardSetting; +import net.minecraft.client.gui.screen.Screen; +import net.minecraft.client.gui.widget.DoubleOptionSliderWidget; +import net.minecraft.client.gui.widget.TextFieldWidget; + +public class SliderTextFieldStandardOptionWidget extends StandardOptionWidget { + private final DoubleOptionStandardSetting setting; + private final DoubleOptionSliderWidget slider; + private final TextFieldWidget textField; + private boolean alt; + + public SliderTextFieldStandardOptionWidget(DoubleOptionStandardSetting setting, DoubleOptionSliderWidget slider, TextFieldWidget textField) { + super(setting, slider); + this.setting = setting; + this.slider = slider; + this.textField = textField; + } + + @Override + public boolean mouseClicked(double mouseX, double mouseY, int button) { + if (this.slider.isMouseOver(mouseX, mouseY) && Screen.hasControlDown() && setting.isEnabled()) { + this.alt = !alt; + this.setMainWidget(this.alt ? textField : slider); + ((SliderWidgetAccessor) this.slider).callSetValue(setting.getRatio(setting.get())); + this.textField.setText(setting.get().toString()); + return true; + } + return super.mouseClicked(mouseX, mouseY, button); + } +} diff --git a/src/main/java/me/contaria/standardsettings/gui/StandardOptionWidget.java b/src/main/java/me/contaria/standardsettings/gui/StandardOptionWidget.java index df375a3d..a78af4bd 100644 --- a/src/main/java/me/contaria/standardsettings/gui/StandardOptionWidget.java +++ b/src/main/java/me/contaria/standardsettings/gui/StandardOptionWidget.java @@ -14,7 +14,7 @@ import java.util.List; public class StandardOptionWidget extends AbstractButtonWidget implements ParentElement { - private final AbstractButtonWidget mainWidget; + private AbstractButtonWidget mainWidget; private final AbstractButtonWidget toggle; private Element focused; private boolean isDragging; @@ -40,6 +40,10 @@ private void setEnabled(boolean enabled) { } } + protected void setMainWidget(AbstractButtonWidget widget) { + this.mainWidget = widget; + } + @Override public void renderButton(MatrixStack matrices, int mouseX, int mouseY, float delta) { this.mainWidget.x = this.x; diff --git a/src/main/java/me/contaria/standardsettings/mixin/accessors/SliderWidgetAccessor.java b/src/main/java/me/contaria/standardsettings/mixin/accessors/SliderWidgetAccessor.java new file mode 100644 index 00000000..59054a43 --- /dev/null +++ b/src/main/java/me/contaria/standardsettings/mixin/accessors/SliderWidgetAccessor.java @@ -0,0 +1,11 @@ +package me.contaria.standardsettings.mixin.accessors; + +import net.minecraft.client.gui.widget.SliderWidget; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.gen.Invoker; + +@Mixin(SliderWidget.class) +public interface SliderWidgetAccessor { + @Invoker("setValue") + void callSetValue(double value); +} diff --git a/src/main/java/me/contaria/standardsettings/options/DoubleOptionStandardSetting.java b/src/main/java/me/contaria/standardsettings/options/DoubleOptionStandardSetting.java index 59c0dcb5..36052359 100644 --- a/src/main/java/me/contaria/standardsettings/options/DoubleOptionStandardSetting.java +++ b/src/main/java/me/contaria/standardsettings/options/DoubleOptionStandardSetting.java @@ -6,7 +6,6 @@ import me.contaria.standardsettings.StandardGameOptions; import me.contaria.standardsettings.mixin.accessors.DoubleOptionAccessor; import me.contaria.standardsettings.mixin.accessors.OptionAccessor; -import net.minecraft.client.gui.widget.AbstractButtonWidget; import net.minecraft.client.gui.widget.DoubleOptionSliderWidget; import net.minecraft.client.options.DoubleOption; import net.minecraft.client.options.GameOptions; @@ -24,6 +23,10 @@ public DoubleOptionStandardSetting(String id, @Nullable String category, Standar this.set(this.getOption()); } + public double getRatio(double value) { + return this.option.getRatio(value); + } + @Override public Double get(GameOptions options) { return this.option.get(options); @@ -55,7 +58,7 @@ protected JsonElement valueToJson() { } @Override - public @NotNull AbstractButtonWidget createMainWidget() { + public @NotNull DoubleOptionSliderWidget createMainWidget() { return new DoubleOptionSliderWidget(this.options, 0, 0, 120, 20, this.option) { @Override protected void updateMessage() { diff --git a/src/main/java/me/contaria/standardsettings/options/StandardSetting.java b/src/main/java/me/contaria/standardsettings/options/StandardSetting.java index d61d8719..5d517656 100644 --- a/src/main/java/me/contaria/standardsettings/options/StandardSetting.java +++ b/src/main/java/me/contaria/standardsettings/options/StandardSetting.java @@ -72,7 +72,7 @@ public boolean hasWidget() { } @Override - public final @NotNull AbstractButtonWidget createWidget() { + public @NotNull AbstractButtonWidget createWidget() { return new StandardOptionWidget(this, this.createMainWidget()); } diff --git a/src/main/resources/standardsettings.mixins.json b/src/main/resources/standardsettings.mixins.json index d08cd64d..7e36c3d2 100644 --- a/src/main/resources/standardsettings.mixins.json +++ b/src/main/resources/standardsettings.mixins.json @@ -9,6 +9,7 @@ "accessors.DoubleOptionAccessor", "accessors.MinecraftClientAccessor", "accessors.OptionAccessor", + "accessors.SliderWidgetAccessor", "fix.GameOptionsMixin", "fix.KeyboardMixin", "fix.LanguageOptionsScreenMixin", @@ -16,9 +17,5 @@ ], "injectors": { "defaultRequire": 1 - }, - "mixins": [ - "accessors.GameOptionsScreenAccessor", - "fix.LanguageSelectionListWidgetMixin" - ] -} \ No newline at end of file + } +}