From d0a46f01f7c94fb55628c290b4b8e05c54f79171 Mon Sep 17 00:00:00 2001 From: NeutronSelector Date: Fri, 6 Mar 2026 19:36:50 +0100 Subject: [PATCH 1/5] setNumbers() if setFormatAsInterger() is called without setNumbers() --- .../widgets/textfield/TextFieldWidget.java | 17 ++++++++++------- 1 file changed, 10 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java index b43020534..5a4a7582f 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java @@ -32,7 +32,7 @@ public class TextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; private Function validator = val -> val; - private boolean numbers = false; + private boolean isNumber = false; private String mathFailMessage = null; private double defaultNumber = 0; private boolean tooltipOverride = false; @@ -144,7 +144,7 @@ public void onRemoveFocus(ModularGuiContext context) { } else { throw new IllegalStateException("TextFieldWidget can only have one line!"); } - this.stringValue.setStringValue(this.numbers ? format.parse(getText(), new ParsePosition(0)).toString() : getText()); + this.stringValue.setStringValue(this.isNumber ? format.parse(getText(), new ParsePosition(0)).toString() : getText()); } @Override @@ -152,7 +152,7 @@ protected void onTextChanged() { super.onTextChanged(); if (this.autoUpdateOnChange) { String text = this.validator.apply(getText()); - this.stringValue.setStringValue(this.numbers ? format.parse(text, new ParsePosition(0)).toString() : getText()); + this.stringValue.setStringValue(this.isNumber ? format.parse(text, new ParsePosition(0)).toString() : getText()); } } @@ -210,7 +210,7 @@ public TextFieldWidget setValidator(Function validator) { } public TextFieldWidget setNumbersLong(Function validator) { - this.numbers = true; + this.isNumber = true; setValidator(val -> { long num; if (val.isEmpty()) { @@ -224,7 +224,7 @@ public TextFieldWidget setNumbersLong(Function validator) { } public TextFieldWidget setNumbers(Function validator) { - this.numbers = true; + this.isNumber = true; return setValidator(val -> { int num; if (val.isEmpty()) { @@ -237,7 +237,7 @@ public TextFieldWidget setNumbers(Function validator) { } public TextFieldWidget setNumbersDouble(Function validator) { - this.numbers = true; + this.isNumber = true; return setValidator(val -> { double num; if (val.isEmpty()) { @@ -271,6 +271,9 @@ public TextFieldWidget setDefaultNumber(double defaultNumber) { } public TextFieldWidget setFormatAsInteger(boolean formatAsInteger) { + if (formatAsInteger && !this.isNumber) { + setNumbers(Integer.MIN_VALUE, Integer.MAX_VALUE); + } this.renderer.setFormatAsInteger(formatAsInteger); return getThis(); } @@ -287,7 +290,7 @@ public TextFieldWidget value(IStringValue stringValue) { @Override public boolean onMouseScroll(UpOrDown scrollDirection, int amount) { // default to basic behavior if scroll step isn't on, if the widget is not using numbers, and if it is focused - if (!this.usingScrollStep || !this.numbers || !isFocused()) return super.onMouseScroll(scrollDirection, amount); + if (!this.usingScrollStep || !this.isNumber || !isFocused()) return super.onMouseScroll(scrollDirection, amount); double value; if (Interactable.hasControlDown()) value = scrollDirection.modifier * scrollStepCtrl; From e448804636565f911fe492049f1a39b97d1a9672 Mon Sep 17 00:00:00 2001 From: NeutronSelector Date: Fri, 6 Mar 2026 19:37:55 +0100 Subject: [PATCH 2/5] improve qol --- .../cleanroommc/modularui/widgets/textfield/TextFieldWidget.java | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java index 5a4a7582f..fcea5fa08 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java @@ -52,6 +52,7 @@ public double parse(String num) { return 0.0; } } + num = num.replaceAll("\\D+", ""); ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); if (result.isFailure()) { this.mathFailMessage = result.getErrorMessage(); From 111c65acb9bad66fc73deebc7493bf97785f17f9 Mon Sep 17 00:00:00 2001 From: NeutronSelector Date: Fri, 20 Mar 2026 17:48:57 +0100 Subject: [PATCH 3/5] revert rename --- .../widgets/textfield/TextFieldWidget.java | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java index fcea5fa08..ed2bd63f1 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java @@ -32,7 +32,7 @@ public class TextFieldWidget extends BaseTextFieldWidget { private IStringValue stringValue; private Function validator = val -> val; - private boolean isNumber = false; + private boolean numbers = false; private String mathFailMessage = null; private double defaultNumber = 0; private boolean tooltipOverride = false; @@ -145,7 +145,7 @@ public void onRemoveFocus(ModularGuiContext context) { } else { throw new IllegalStateException("TextFieldWidget can only have one line!"); } - this.stringValue.setStringValue(this.isNumber ? format.parse(getText(), new ParsePosition(0)).toString() : getText()); + this.stringValue.setStringValue(this.numbers ? format.parse(getText(), new ParsePosition(0)).toString() : getText()); } @Override @@ -153,7 +153,7 @@ protected void onTextChanged() { super.onTextChanged(); if (this.autoUpdateOnChange) { String text = this.validator.apply(getText()); - this.stringValue.setStringValue(this.isNumber ? format.parse(text, new ParsePosition(0)).toString() : getText()); + this.stringValue.setStringValue(this.numbers ? format.parse(text, new ParsePosition(0)).toString() : getText()); } } @@ -211,7 +211,7 @@ public TextFieldWidget setValidator(Function validator) { } public TextFieldWidget setNumbersLong(Function validator) { - this.isNumber = true; + this.numbers = true; setValidator(val -> { long num; if (val.isEmpty()) { @@ -225,7 +225,7 @@ public TextFieldWidget setNumbersLong(Function validator) { } public TextFieldWidget setNumbers(Function validator) { - this.isNumber = true; + this.numbers = true; return setValidator(val -> { int num; if (val.isEmpty()) { @@ -238,7 +238,7 @@ public TextFieldWidget setNumbers(Function validator) { } public TextFieldWidget setNumbersDouble(Function validator) { - this.isNumber = true; + this.numbers = true; return setValidator(val -> { double num; if (val.isEmpty()) { @@ -272,7 +272,7 @@ public TextFieldWidget setDefaultNumber(double defaultNumber) { } public TextFieldWidget setFormatAsInteger(boolean formatAsInteger) { - if (formatAsInteger && !this.isNumber) { + if (formatAsInteger && !this.numbers) { setNumbers(Integer.MIN_VALUE, Integer.MAX_VALUE); } this.renderer.setFormatAsInteger(formatAsInteger); @@ -291,7 +291,7 @@ public TextFieldWidget value(IStringValue stringValue) { @Override public boolean onMouseScroll(UpOrDown scrollDirection, int amount) { // default to basic behavior if scroll step isn't on, if the widget is not using numbers, and if it is focused - if (!this.usingScrollStep || !this.isNumber || !isFocused()) return super.onMouseScroll(scrollDirection, amount); + if (!this.usingScrollStep || !this.numbers || !isFocused()) return super.onMouseScroll(scrollDirection, amount); double value; if (Interactable.hasControlDown()) value = scrollDirection.modifier * scrollStepCtrl; From d800dca93392bfa290ffa635a3f063b255d3b0fb Mon Sep 17 00:00:00 2001 From: NeutronSelector Date: Fri, 20 Mar 2026 17:50:05 +0100 Subject: [PATCH 4/5] improve qol better --- .../widgets/textfield/TextFieldWidget.java | 22 +++++++++++-------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java index ed2bd63f1..8d5a7ff7f 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java @@ -23,6 +23,7 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; +import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -44,20 +45,23 @@ public class TextFieldWidget extends BaseTextFieldWidget { private boolean usingScrollStep = false; public double parse(String num) { + Pattern pattern = Pattern.compile("-?\\d+(?:[.,]\\d+)?"); + Matcher mmatcher = pattern.matcher(num); + double fallbackDefaultNumber = this.defaultNumber; + if (mmatcher.find()) { + String cleaned = mmatcher.group().replace(',', '.'); + fallbackDefaultNumber = Double.parseDouble(cleaned); + } + if (!this.acceptsExpression) { - try { - return NumberFormat.AMOUNT_TEXT.format.parse(num).doubleValue(); - } catch (ParseException ex) { - this.mathFailMessage = "Unable to parse number."; - return 0.0; - } + return fallbackDefaultNumber; } - num = num.replaceAll("\\D+", ""); - ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); + + ParseResult result = MathUtils.parseExpression(num, fallbackDefaultNumber, true); if (result.isFailure()) { this.mathFailMessage = result.getErrorMessage(); ModularUI.LOGGER.error("Math expression error in {}: {}", this, this.mathFailMessage); - return defaultNumber; + return fallbackDefaultNumber; } return result.getResult().getNumberValue().doubleValue(); } From 6a64376b815ad818fa2852675f2cae853af15923 Mon Sep 17 00:00:00 2001 From: NeutronSelector Date: Fri, 20 Mar 2026 18:07:37 +0100 Subject: [PATCH 5/5] revert number parsing --- .../widgets/textfield/TextFieldWidget.java | 20 ++++++++----------- 1 file changed, 8 insertions(+), 12 deletions(-) diff --git a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java index 8d5a7ff7f..4a85a2275 100644 --- a/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java +++ b/src/main/java/com/cleanroommc/modularui/widgets/textfield/TextFieldWidget.java @@ -23,7 +23,6 @@ import java.util.function.Consumer; import java.util.function.Function; import java.util.function.Supplier; -import java.util.regex.Matcher; import java.util.regex.Pattern; /** @@ -45,23 +44,20 @@ public class TextFieldWidget extends BaseTextFieldWidget { private boolean usingScrollStep = false; public double parse(String num) { - Pattern pattern = Pattern.compile("-?\\d+(?:[.,]\\d+)?"); - Matcher mmatcher = pattern.matcher(num); - double fallbackDefaultNumber = this.defaultNumber; - if (mmatcher.find()) { - String cleaned = mmatcher.group().replace(',', '.'); - fallbackDefaultNumber = Double.parseDouble(cleaned); - } - if (!this.acceptsExpression) { - return fallbackDefaultNumber; + try { + return NumberFormat.AMOUNT_TEXT.format.parse(num).doubleValue(); + } catch (ParseException ex) { + this.mathFailMessage = "Unable to parse number."; + return 0.0; + } } - ParseResult result = MathUtils.parseExpression(num, fallbackDefaultNumber, true); + ParseResult result = MathUtils.parseExpression(num, this.defaultNumber, true); if (result.isFailure()) { this.mathFailMessage = result.getErrorMessage(); ModularUI.LOGGER.error("Math expression error in {}: {}", this, this.mathFailMessage); - return fallbackDefaultNumber; + return defaultNumber; } return result.getResult().getNumberValue().doubleValue(); }