ソースを参照

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.
aXu-AP 2 年 前
コミット
4d3dc0e944
2 ファイル変更30 行追加11 行削除
  1. 14 7
      editor/gui/editor_spin_slider.cpp
  2. 16 4
      scene/gui/spin_box.cpp

+ 14 - 7
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<Expression> 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);

+ 16 - 4
scene/gui/spin_box.cpp

@@ -62,12 +62,24 @@ void SpinBox::_text_submitted(const String &p_string) {
 	Ref<Expression> 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);