Browse Source

Add `Control::localize_numeral_system` property to toggle automatic numeral system conversion.

bruvzg 2 years ago
parent
commit
3add6dcd89

+ 4 - 0
doc/classes/Control.xml

@@ -1010,6 +1010,10 @@
 		<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0">
 		<member name="layout_direction" type="int" setter="set_layout_direction" getter="get_layout_direction" enum="Control.LayoutDirection" default="0">
 			Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
 			Controls layout direction and text writing direction. Right-to-left layouts are necessary for certain languages (e.g. Arabic and Hebrew).
 		</member>
 		</member>
+		<member name="localize_numeral_system" type="bool" setter="set_localize_numeral_system" getter="is_localizing_numeral_system" default="true">
+			If [code]true[/code], automatically converts code line numbers, list indices, [SpinBox] and [ProgressBar] values from the Western Arabic (0..9) to the numeral systems used in current locale.
+			[b]Note:[/b] Numbers within the text are not automatically converted, it can be done manually, using [method TextServer.format_number].
+		</member>
 		<member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" enum="Control.CursorShape" default="0">
 		<member name="mouse_default_cursor_shape" type="int" setter="set_default_cursor_shape" getter="get_default_cursor_shape" enum="Control.CursorShape" default="0">
 			The default cursor shape for this control. Useful for Godot plugins and applications or games that use the system's mouse cursors.
 			The default cursor shape for this control. Useful for Godot plugins and applications or games that use the system's mouse cursors.
 			[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the system.
 			[b]Note:[/b] On Linux, shapes may vary depending on the cursor theme of the system.

+ 4 - 1
scene/gui/code_edit.cpp

@@ -1425,7 +1425,10 @@ bool CodeEdit::is_line_numbers_zero_padded() const {
 }
 }
 
 
 void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) {
 void CodeEdit::_line_number_draw_callback(int p_line, int p_gutter, const Rect2 &p_region) {
-	String fc = TS->format_number(String::num(p_line + 1).lpad(line_number_digits, line_number_padding));
+	String fc = String::num(p_line + 1).lpad(line_number_digits, line_number_padding);
+	if (is_localizing_numeral_system()) {
+		fc = TS->format_number(fc);
+	}
 	Ref<TextLine> tl;
 	Ref<TextLine> tl;
 	tl.instantiate();
 	tl.instantiate();
 	tl->add_string(fc, font, font_size);
 	tl->add_string(fc, font, font_size);

+ 19 - 1
scene/gui/control.cpp

@@ -2773,6 +2773,20 @@ bool Control::is_layout_rtl() const {
 	return data.is_rtl;
 	return data.is_rtl;
 }
 }
 
 
+void Control::set_localize_numeral_system(bool p_enable) {
+	if (p_enable == data.localize_numeral_system) {
+		return;
+	}
+
+	data.localize_numeral_system = p_enable;
+
+	notification(MainLoop::NOTIFICATION_TRANSLATION_CHANGED);
+}
+
+bool Control::is_localizing_numeral_system() const {
+	return data.localize_numeral_system;
+}
+
 void Control::set_auto_translate(bool p_enable) {
 void Control::set_auto_translate(bool p_enable) {
 	if (p_enable == data.auto_translate) {
 	if (p_enable == data.auto_translate) {
 		return;
 		return;
@@ -3154,6 +3168,9 @@ void Control::_bind_methods() {
 	ClassDB::bind_method(D_METHOD("set_auto_translate", "enable"), &Control::set_auto_translate);
 	ClassDB::bind_method(D_METHOD("set_auto_translate", "enable"), &Control::set_auto_translate);
 	ClassDB::bind_method(D_METHOD("is_auto_translating"), &Control::is_auto_translating);
 	ClassDB::bind_method(D_METHOD("is_auto_translating"), &Control::is_auto_translating);
 
 
+	ClassDB::bind_method(D_METHOD("set_localize_numeral_system", "enable"), &Control::set_localize_numeral_system);
+	ClassDB::bind_method(D_METHOD("is_localizing_numeral_system"), &Control::is_localizing_numeral_system);
+
 	ADD_GROUP("Layout", "");
 	ADD_GROUP("Layout", "");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "clip_contents"), "set_clip_contents", "is_clipping_contents");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
 	ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "custom_minimum_size", PROPERTY_HINT_NONE, "suffix:px"), "set_custom_minimum_size", "get_custom_minimum_size");
@@ -3198,8 +3215,9 @@ void Control::_bind_methods() {
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill:1,Expand:2,Shrink Center:4,Shrink End:8"), "set_v_size_flags", "get_v_size_flags");
 	ADD_PROPERTY(PropertyInfo(Variant::INT, "size_flags_vertical", PROPERTY_HINT_FLAGS, "Fill:1,Expand:2,Shrink Center:4,Shrink End:8"), "set_v_size_flags", "get_v_size_flags");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio");
 	ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "size_flags_stretch_ratio", PROPERTY_HINT_RANGE, "0,20,0.01,or_greater"), "set_stretch_ratio", "get_stretch_ratio");
 
 
-	ADD_GROUP("Auto Translate", "");
+	ADD_GROUP("Localization", "");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating");
 	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating");
+	ADD_PROPERTY(PropertyInfo(Variant::BOOL, "localize_numeral_system"), "set_localize_numeral_system", "is_localizing_numeral_system");
 
 
 	ADD_GROUP("Tooltip", "tooltip_");
 	ADD_GROUP("Tooltip", "tooltip_");
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "tooltip_text", PROPERTY_HINT_MULTILINE_TEXT), "set_tooltip_text", "get_tooltip_text");
 	ADD_PROPERTY(PropertyInfo(Variant::STRING, "tooltip_text", PROPERTY_HINT_MULTILINE_TEXT), "set_tooltip_text", "get_tooltip_text");

+ 4 - 0
scene/gui/control.h

@@ -249,6 +249,7 @@ private:
 		bool is_rtl = false;
 		bool is_rtl = false;
 
 
 		bool auto_translate = true;
 		bool auto_translate = true;
+		bool localize_numeral_system = true;
 
 
 		// Extra properties.
 		// Extra properties.
 
 
@@ -595,6 +596,9 @@ public:
 	LayoutDirection get_layout_direction() const;
 	LayoutDirection get_layout_direction() const;
 	virtual bool is_layout_rtl() const;
 	virtual bool is_layout_rtl() const;
 
 
+	void set_localize_numeral_system(bool p_enable);
+	bool is_localizing_numeral_system() const;
+
 	void set_auto_translate(bool p_enable);
 	void set_auto_translate(bool p_enable);
 	bool is_auto_translating() const;
 	bool is_auto_translating() const;
 	_FORCE_INLINE_ String atr(const String p_string) const {
 	_FORCE_INLINE_ String atr(const String p_string) const {

+ 6 - 1
scene/gui/progress_bar.cpp

@@ -103,7 +103,12 @@ void ProgressBar::_notification(int p_what) {
 			}
 			}
 
 
 			if (show_percentage) {
 			if (show_percentage) {
-				String txt = TS->format_number(itos(int(get_as_ratio() * 100))) + TS->percent_sign();
+				String txt = itos(int(get_as_ratio() * 100));
+				if (is_localizing_numeral_system()) {
+					txt = TS->format_number(txt) + TS->percent_sign();
+				} else {
+					txt += String("%");
+				}
 				TextLine tl = TextLine(txt, theme_cache.font, theme_cache.font_size);
 				TextLine tl = TextLine(txt, theme_cache.font, theme_cache.font_size);
 				Vector2 text_pos = (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round();
 				Vector2 text_pos = (Point2(get_size().width - tl.get_size().x, get_size().height - tl.get_size().y) / 2).round();
 
 

+ 4 - 1
scene/gui/rich_text_label.cpp

@@ -752,7 +752,10 @@ int RichTextLabel::_draw_line(ItemFrame *p_frame, int p_line, const Vector2 &p_o
 			prefix = _prefix;
 			prefix = _prefix;
 			break;
 			break;
 		} else if (list_items[i]->list_type == LIST_NUMBERS) {
 		} else if (list_items[i]->list_type == LIST_NUMBERS) {
-			segment = TS->format_number(itos(list_index[i]), _find_language(l.from));
+			segment = itos(list_index[i]);
+			if (is_localizing_numeral_system()) {
+				segment = TS->format_number(segment, _find_language(l.from));
+			}
 		} else if (list_items[i]->list_type == LIST_LETTERS) {
 		} else if (list_items[i]->list_type == LIST_LETTERS) {
 			segment = _letters(list_index[i], list_items[i]->capitalize);
 			segment = _letters(list_index[i], list_items[i]->capitalize);
 		} else if (list_items[i]->list_type == LIST_ROMAN) {
 		} else if (list_items[i]->list_type == LIST_ROMAN) {

+ 4 - 1
scene/gui/spin_box.cpp

@@ -40,7 +40,10 @@ Size2 SpinBox::get_minimum_size() const {
 }
 }
 
 
 void SpinBox::_value_changed(double p_value) {
 void SpinBox::_value_changed(double p_value) {
-	String value = TS->format_number(String::num(get_value(), Math::range_step_decimals(get_step())));
+	String value = String::num(get_value(), Math::range_step_decimals(get_step()));
+	if (is_localizing_numeral_system()) {
+		value = TS->format_number(value);
+	}
 
 
 	if (!line_edit->has_focus()) {
 	if (!line_edit->has_focus()) {
 		if (!prefix.is_empty()) {
 		if (!prefix.is_empty()) {