Merge pull request #57276 from IgorKordiukiewicz/fix-auto-brace-complete-wrap-on-selection
This commit is contained in:
commit
74b1e77938
2 changed files with 75 additions and 16 deletions
|
@ -571,6 +571,8 @@ Control::CursorShape CodeEdit::get_cursor_shape(const Point2 &p_pos) const {
|
||||||
// Overridable actions
|
// Overridable actions
|
||||||
void CodeEdit::_handle_unicode_input_internal(const uint32_t p_unicode) {
|
void CodeEdit::_handle_unicode_input_internal(const uint32_t p_unicode) {
|
||||||
bool had_selection = has_selection();
|
bool had_selection = has_selection();
|
||||||
|
String selection_text = (had_selection ? get_selected_text() : "");
|
||||||
|
|
||||||
if (had_selection) {
|
if (had_selection) {
|
||||||
begin_complex_operation();
|
begin_complex_operation();
|
||||||
delete_selection();
|
delete_selection();
|
||||||
|
@ -591,6 +593,16 @@ void CodeEdit::_handle_unicode_input_internal(const uint32_t p_unicode) {
|
||||||
if (auto_brace_completion_enabled) {
|
if (auto_brace_completion_enabled) {
|
||||||
int cl = get_caret_line();
|
int cl = get_caret_line();
|
||||||
int cc = get_caret_column();
|
int cc = get_caret_column();
|
||||||
|
|
||||||
|
if (had_selection) {
|
||||||
|
insert_text_at_caret(chr);
|
||||||
|
|
||||||
|
String close_key = get_auto_brace_completion_close_key(chr);
|
||||||
|
if (!close_key.is_empty()) {
|
||||||
|
insert_text_at_caret(selection_text + close_key);
|
||||||
|
set_caret_column(get_caret_column() - 1);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
int caret_move_offset = 1;
|
int caret_move_offset = 1;
|
||||||
|
|
||||||
int post_brace_pair = cc < get_line(cl).length() ? _get_auto_brace_pair_close_at_pos(cl, cc) : -1;
|
int post_brace_pair = cc < get_line(cl).length() ? _get_auto_brace_pair_close_at_pos(cl, cc) : -1;
|
||||||
|
@ -612,6 +624,7 @@ void CodeEdit::_handle_unicode_input_internal(const uint32_t p_unicode) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
set_caret_column(cc + caret_move_offset);
|
set_caret_column(cc + caret_move_offset);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
insert_text_at_caret(chr);
|
insert_text_at_caret(chr);
|
||||||
}
|
}
|
||||||
|
|
|
@ -2786,6 +2786,52 @@ TEST_CASE("[SceneTree][CodeEdit] completion") {
|
||||||
SEND_GUI_KEY_EVENT(code_edit, Key::APOSTROPHE);
|
SEND_GUI_KEY_EVENT(code_edit, Key::APOSTROPHE);
|
||||||
SEND_GUI_KEY_EVENT(code_edit, Key::QUOTEDBL);
|
SEND_GUI_KEY_EVENT(code_edit, Key::QUOTEDBL);
|
||||||
CHECK(code_edit->get_line(0) == "'\"'");
|
CHECK(code_edit->get_line(0) == "'\"'");
|
||||||
|
|
||||||
|
/* Wrap single line selection with brackets */
|
||||||
|
code_edit->clear();
|
||||||
|
code_edit->insert_text_at_caret("abc");
|
||||||
|
code_edit->select_all();
|
||||||
|
SEND_GUI_KEY_EVENT(code_edit, Key::BRACKETLEFT);
|
||||||
|
CHECK(code_edit->get_line(0) == "[abc]");
|
||||||
|
|
||||||
|
/* Caret should be after the last character of the single line selection */
|
||||||
|
CHECK(code_edit->get_caret_column() == 4);
|
||||||
|
|
||||||
|
/* Wrap multi line selection with brackets */
|
||||||
|
code_edit->clear();
|
||||||
|
code_edit->insert_text_at_caret("abc\nabc");
|
||||||
|
code_edit->select_all();
|
||||||
|
SEND_GUI_KEY_EVENT(code_edit, Key::BRACKETLEFT);
|
||||||
|
CHECK(code_edit->get_text() == "[abc\nabc]");
|
||||||
|
|
||||||
|
/* Caret should be after the last character of the multi line selection */
|
||||||
|
CHECK(code_edit->get_caret_line() == 1);
|
||||||
|
CHECK(code_edit->get_caret_column() == 3);
|
||||||
|
|
||||||
|
/* If inserted character is not a auto brace completion open key, replace selected text with the inserted character */
|
||||||
|
code_edit->clear();
|
||||||
|
code_edit->insert_text_at_caret("abc");
|
||||||
|
code_edit->select_all();
|
||||||
|
SEND_GUI_KEY_EVENT(code_edit, Key::KEY_1);
|
||||||
|
CHECK(code_edit->get_text() == "1");
|
||||||
|
|
||||||
|
/* If potential multichar and single brace completion is matched, it should wrap the single. */
|
||||||
|
code_edit->clear();
|
||||||
|
code_edit->insert_text_at_caret("\'\'abc");
|
||||||
|
code_edit->select(0, 2, 0, 5);
|
||||||
|
SEND_GUI_KEY_EVENT(code_edit, Key::APOSTROPHE);
|
||||||
|
CHECK(code_edit->get_text() == "\'\'\'abc\'");
|
||||||
|
|
||||||
|
/* If only the potential multichar brace completion is matched, it does not wrap or complete. */
|
||||||
|
auto_brace_completion_pairs.erase("\'");
|
||||||
|
code_edit->set_auto_brace_completion_pairs(auto_brace_completion_pairs);
|
||||||
|
CHECK_FALSE(code_edit->has_auto_brace_completion_open_key("\'"));
|
||||||
|
|
||||||
|
code_edit->clear();
|
||||||
|
code_edit->insert_text_at_caret("\'\'abc");
|
||||||
|
code_edit->select(0, 2, 0, 5);
|
||||||
|
SEND_GUI_KEY_EVENT(code_edit, Key::APOSTROPHE);
|
||||||
|
CHECK(code_edit->get_text() == "\'\'\'");
|
||||||
}
|
}
|
||||||
|
|
||||||
SUBCASE("[CodeEdit] autocomplete") {
|
SUBCASE("[CodeEdit] autocomplete") {
|
||||||
|
|
Loading…
Add table
Reference in a new issue