Skip to content

Commit

Permalink
Fix ctrl+backspace crash with multicarets on the same line
Browse files Browse the repository at this point in the history
  • Loading branch information
Paulb23 authored and krokoschlange committed May 25, 2023
1 parent b199ea6 commit a34b8a6
Show file tree
Hide file tree
Showing 2 changed files with 45 additions and 0 deletions.
1 change: 1 addition & 0 deletions scene/gui/text_edit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2681,6 +2681,7 @@ void TextEdit::_do_backspace(bool p_word, bool p_all_to_left) {

set_caret_line(get_caret_line(caret_idx), false, true, 0, caret_idx);
set_caret_column(column, caret_idx == 0, caret_idx);
adjust_carets_after_edit(caret_idx, get_caret_line(caret_idx), column, get_caret_line(caret_idx), from_column);

// Now we can clean up the overlapping caret.
if (overlapping_caret_index != -1) {
Expand Down
44 changes: 44 additions & 0 deletions tests/scene/test_text_edit.h
Original file line number Diff line number Diff line change
Expand Up @@ -1779,6 +1779,50 @@ TEST_CASE("[SceneTree][TextEdit] text entry") {
SIGNAL_CHECK("lines_edited_from", lines_edited_args);
}

SUBCASE("[TextEdit] ui_text_backspace_word same line") {
text_edit->set_text("test test test");
text_edit->set_caret_column(4);
text_edit->add_caret(0, 9);
text_edit->add_caret(0, 15);

// For the second caret.
Array args2;
args2.push_back(0);
lines_edited_args.push_front(args2);

// For the third caret.
Array args3;
args2.push_back(0);
lines_edited_args.push_front(args2);

CHECK(text_edit->get_caret_count() == 3);
MessageQueue::get_singleton()->flush();

SIGNAL_DISCARD("text_set");
SIGNAL_DISCARD("text_changed");
SIGNAL_DISCARD("lines_edited_from");
SIGNAL_DISCARD("caret_changed");

SEND_GUI_ACTION("ui_text_backspace_word");
CHECK(text_edit->get_viewport()->is_input_handled());
CHECK(text_edit->get_text() == " ");
CHECK(text_edit->get_caret_line() == 0);
CHECK(text_edit->get_caret_column() == 0);
CHECK_FALSE(text_edit->has_selection(0));

CHECK(text_edit->get_caret_line(1) == 0);
CHECK(text_edit->get_caret_column(1) == 1);
CHECK_FALSE(text_edit->has_selection(1));

CHECK(text_edit->get_caret_line(2) == 0);
CHECK(text_edit->get_caret_column(2) == 2);
CHECK_FALSE(text_edit->has_selection(1));

SIGNAL_CHECK("caret_changed", empty_signal_args);
SIGNAL_CHECK("text_changed", empty_signal_args);
SIGNAL_CHECK("lines_edited_from", lines_edited_args);
}

SUBCASE("[TextEdit] ui_text_backspace") {
text_edit->set_text("\nthis is some test text.\n\nthis is some test text.");
text_edit->select(1, 0, 1, 4);
Expand Down

0 comments on commit a34b8a6

Please sign in to comment.