diff options
author | RĂ©mi Verschelde <rverschelde@gmail.com> | 2020-06-16 22:44:30 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-06-16 22:44:30 +0200 |
commit | 02f7908d460bea7d580fe7526949be7f294e6783 (patch) | |
tree | 8729da497f3e5137c9738bb071895ac9b9e5dd46 /editor | |
parent | fa01e666d2d3dd9fe0ca8fbbea19ca2e2458cf29 (diff) | |
parent | 2be3a33cc3e7de4309e6448d79cab2b87fb93e75 (diff) |
Merge pull request #39598 from mrushyendra/replace_selection
Fix code editor Replace tool to work with 'Selection Only' option
Diffstat (limited to 'editor')
-rw-r--r-- | editor/code_editor.cpp | 45 |
1 files changed, 36 insertions, 9 deletions
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp index 95c7cc0bf1..717c1406c8 100644 --- a/editor/code_editor.cpp +++ b/editor/code_editor.cpp @@ -166,20 +166,47 @@ bool FindReplaceBar::_search(uint32_t p_flags, int p_from_line, int p_from_col) } void FindReplaceBar::_replace() { - if (result_line != -1 && result_col != -1) { - text_edit->begin_complex_operation(); + bool selection_enabled = text_edit->is_selection_active(); + Point2i selection_begin, selection_end; + if (selection_enabled) { + selection_begin = Point2i(text_edit->get_selection_from_line(), text_edit->get_selection_from_column()); + selection_end = Point2i(text_edit->get_selection_to_line(), text_edit->get_selection_to_column()); + } - text_edit->unfold_line(result_line); - text_edit->select(result_line, result_col, result_line, result_col + get_search_text().length()); - text_edit->insert_text_at_cursor(get_replace_text()); + String replace_text = get_replace_text(); + int search_text_len = get_search_text().length(); - text_edit->end_complex_operation(); + text_edit->begin_complex_operation(); + if (selection_enabled && is_selection_only()) { // To restrict search_current() to selected region + text_edit->cursor_set_line(selection_begin.width); + text_edit->cursor_set_column(selection_begin.height); + } - results_count = -1; + if (search_current()) { + text_edit->unfold_line(result_line); + text_edit->select(result_line, result_col, result_line, result_col + search_text_len); + + if (selection_enabled && is_selection_only()) { + Point2i match_from(result_line, result_col); + Point2i match_to(result_line, result_col + search_text_len); + if (!(match_from < selection_begin || match_to > selection_end)) { + text_edit->insert_text_at_cursor(replace_text); + if (match_to.x == selection_end.x) { // Adjust selection bounds if necessary + selection_end.y += replace_text.length() - search_text_len; + } + } + } else { + text_edit->insert_text_at_cursor(replace_text); + } } + text_edit->end_complex_operation(); + results_count = -1; - if (!search_current()) { - search_next(); + if (selection_enabled && is_selection_only()) { + // Reselect in order to keep 'Replace' restricted to selection + text_edit->select(selection_begin.x, selection_begin.y, selection_end.x, selection_end.y); + } else { + text_edit->deselect(); } } |