Browse Source

Merge pull request #67145 from Paulb23/tab_textedit

Fix inserting tabs in TextEdit
Rémi Verschelde 2 năm trước cách đây
mục cha
commit
4be5660223
2 tập tin đã thay đổi với 23 bổ sung2 xóa
  1. 11 2
      scene/gui/text_edit.cpp
  2. 12 0
      tests/scene/test_text_edit.h

+ 11 - 2
scene/gui/text_edit.cpp

@@ -2192,8 +2192,17 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 			return;
 		}
 
-		// Handle Unicode (if no modifiers active). Tab	has a value of 0x09.
-		if (allow_unicode_handling && editable && (k->get_unicode() >= 32 || k->get_keycode() == Key::TAB)) {
+		// Handle tab as it has no set unicode value.
+		if (k->is_action("ui_text_indent", true)) {
+			if (editable) {
+				insert_text_at_caret("\t");
+			}
+			accept_event();
+			return;
+		}
+
+		// Handle Unicode (if no modifiers active).
+		if (allow_unicode_handling && editable && k->get_unicode() >= 32) {
 			handle_unicode_input(k->get_unicode());
 			accept_event();
 			return;

+ 12 - 0
tests/scene/test_text_edit.h

@@ -2944,6 +2944,18 @@ TEST_CASE("[SceneTree][TextEdit] text entry") {
 			SIGNAL_CHECK("lines_edited_from", lines_edited_args);
 			text_edit->set_overtype_mode_enabled(false);
 			CHECK_FALSE(text_edit->is_overtype_mode_enabled());
+
+			lines_edited_args.remove_at(0);
+			lines_edited_args.remove_at(1);
+
+			SEND_GUI_KEY_EVENT(text_edit, Key::TAB);
+			CHECK(text_edit->get_viewport()->is_input_handled());
+			CHECK(text_edit->get_text() == "A\tB\nA\tB");
+			CHECK(text_edit->get_caret_column() == 2);
+			CHECK(text_edit->get_caret_column(1) == 2);
+			SIGNAL_CHECK("caret_changed", empty_signal_args);
+			SIGNAL_CHECK("text_changed", empty_signal_args);
+			SIGNAL_CHECK("lines_edited_from", lines_edited_args);
 		}
 
 		SIGNAL_UNWATCH(text_edit, "text_set");