From 4d3dc0e9443d1e21f6e3e3d5755e5a0705b55024 Mon Sep 17 00:00:00 2001 From: aXu-AP <1621768+aXu-AP@users.noreply.github.com> Date: Wed, 16 Aug 2023 21:18:22 +0300 Subject: [PATCH] Use comma as a decimal separator for SpinBox Add support for comma ',' as a decimal separator for SpinBox. This implementation allows for expressions like `pow(2, 3)` to be used as well. If you use comma to separate decimals, use semicolon `;` to separate function parameters. Change EditorSpinSlider behavior to match. --- editor/gui/editor_spin_slider.cpp | 21 ++++++++++++++------- scene/gui/spin_box.cpp | 20 ++++++++++++++++---- 2 files changed, 30 insertions(+), 11 deletions(-) diff --git a/editor/gui/editor_spin_slider.cpp b/editor/gui/editor_spin_slider.cpp index c59822ba5534..e3fb522d21a9 100644 --- a/editor/gui/editor_spin_slider.cpp +++ b/editor/gui/editor_spin_slider.cpp @@ -534,17 +534,24 @@ String EditorSpinSlider::get_suffix() const { } void EditorSpinSlider::_evaluate_input_text() { - // Replace comma with dot to support it as decimal separator (GH-6028). - // This prevents using functions like `pow()`, but using functions - // in EditorSpinSlider is a barely known (and barely used) feature. - // Instead, we'd rather support German/French keyboard layouts out of the box. - const String text = TS->parse_number(value_input->get_text().replace(",", ".")); - Ref expr; expr.instantiate(); + + // Convert commas ',' to dots '.' for French/German etc. keyboard layouts. + String text = value_input->get_text().replace(",", "."); + text = text.replace(";", ","); + text = TS->parse_number(text); + Error err = expr->parse(text); if (err != OK) { - return; + // If the expression failed try without converting commas to dots - they might have been for parameter separation. + text = value_input->get_text(); + text = TS->parse_number(text); + + err = expr->parse(text); + if (err != OK) { + return; + } } Variant v = expr->execute(Array(), nullptr, false, true); diff --git a/scene/gui/spin_box.cpp b/scene/gui/spin_box.cpp index 07429c6a6160..e13fd2194916 100644 --- a/scene/gui/spin_box.cpp +++ b/scene/gui/spin_box.cpp @@ -62,12 +62,24 @@ void SpinBox::_text_submitted(const String &p_string) { Ref expr; expr.instantiate(); - String num = TS->parse_number(p_string); + // Convert commas ',' to dots '.' for French/German etc. keyboard layouts. + String text = p_string.replace(",", "."); + text = text.replace(";", ","); + text = TS->parse_number(text); // Ignore the prefix and suffix in the expression. - Error err = expr->parse(num.trim_prefix(prefix + " ").trim_suffix(" " + suffix)); + text = text.trim_prefix(prefix + " ").trim_suffix(" " + suffix); + + Error err = expr->parse(text); if (err != OK) { - _update_text(); - return; + // If the expression failed try without converting commas to dots - they might have been for parameter separation. + text = p_string; + text = TS->parse_number(text); + text = text.trim_prefix(prefix + " ").trim_suffix(" " + suffix); + + err = expr->parse(text); + if (err != OK) { + return; + } } Variant value = expr->execute(Array(), nullptr, false, true);