|
@@ -2051,7 +2051,7 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
|
|
}
|
|
}
|
|
|
|
|
|
if (is_shortcut_keys_enabled()) {
|
|
if (is_shortcut_keys_enabled()) {
|
|
- // SELECT ALL, SELECT WORD UNDER CARET, CUT, COPY, PASTE.
|
|
|
|
|
|
+ // SELECT ALL, SELECT WORD UNDER CARET, ADD SELECTION FOR NEXT OCCURRENCE, CUT, COPY, PASTE.
|
|
if (k->is_action("ui_text_select_all", true)) {
|
|
if (k->is_action("ui_text_select_all", true)) {
|
|
select_all();
|
|
select_all();
|
|
accept_event();
|
|
accept_event();
|
|
@@ -2062,6 +2062,11 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
|
|
accept_event();
|
|
accept_event();
|
|
return;
|
|
return;
|
|
}
|
|
}
|
|
|
|
+ if (k->is_action("ui_text_add_selection_for_next_occurrence", true)) {
|
|
|
|
+ add_selection_for_next_occurrence();
|
|
|
|
+ accept_event();
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
if (k->is_action("ui_cut", true)) {
|
|
if (k->is_action("ui_cut", true)) {
|
|
cut();
|
|
cut();
|
|
accept_event();
|
|
accept_event();
|
|
@@ -4832,6 +4837,45 @@ void TextEdit::select_word_under_caret(int p_caret) {
|
|
merge_overlapping_carets();
|
|
merge_overlapping_carets();
|
|
}
|
|
}
|
|
|
|
|
|
|
|
+void TextEdit::add_selection_for_next_occurrence() {
|
|
|
|
+ if (!selecting_enabled || !is_multiple_carets_enabled()) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ if (text.size() == 1 && text[0].length() == 0) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ // Always use the last caret, to correctly search for
|
|
|
|
+ // the next occurrence that comes after this caret.
|
|
|
|
+ int caret = get_caret_count() - 1;
|
|
|
|
+
|
|
|
|
+ if (!has_selection(caret)) {
|
|
|
|
+ select_word_under_caret(caret);
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ const String &highlighted_text = get_selected_text(caret);
|
|
|
|
+ int column = get_selection_from_column(caret) + 1;
|
|
|
|
+ int line = get_caret_line(caret);
|
|
|
|
+
|
|
|
|
+ const Point2i next_occurrence = search(highlighted_text, SEARCH_MATCH_CASE, line, column);
|
|
|
|
+
|
|
|
|
+ if (next_occurrence.x == -1 || next_occurrence.y == -1) {
|
|
|
|
+ return;
|
|
|
|
+ }
|
|
|
|
+
|
|
|
|
+ int to_column = get_selection_to_column(caret) + 1;
|
|
|
|
+ int end = next_occurrence.x + (to_column - column);
|
|
|
|
+ int new_caret = add_caret(next_occurrence.y, end);
|
|
|
|
+
|
|
|
|
+ if (new_caret != -1) {
|
|
|
|
+ select(next_occurrence.y, next_occurrence.x, next_occurrence.y, end, new_caret);
|
|
|
|
+ adjust_viewport_to_caret(new_caret);
|
|
|
|
+ merge_overlapping_carets();
|
|
|
|
+ }
|
|
|
|
+}
|
|
|
|
+
|
|
void TextEdit::select(int p_from_line, int p_from_column, int p_to_line, int p_to_column, int p_caret) {
|
|
void TextEdit::select(int p_from_line, int p_from_column, int p_to_line, int p_to_column, int p_caret) {
|
|
ERR_FAIL_INDEX(p_caret, carets.size());
|
|
ERR_FAIL_INDEX(p_caret, carets.size());
|
|
if (!selecting_enabled) {
|
|
if (!selecting_enabled) {
|
|
@@ -6000,6 +6044,7 @@ void TextEdit::_bind_methods() {
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("select_all"), &TextEdit::select_all);
|
|
ClassDB::bind_method(D_METHOD("select_all"), &TextEdit::select_all);
|
|
ClassDB::bind_method(D_METHOD("select_word_under_caret", "caret_index"), &TextEdit::select_word_under_caret, DEFVAL(-1));
|
|
ClassDB::bind_method(D_METHOD("select_word_under_caret", "caret_index"), &TextEdit::select_word_under_caret, DEFVAL(-1));
|
|
|
|
+ ClassDB::bind_method(D_METHOD("add_selection_for_next_occurrence"), &TextEdit::add_selection_for_next_occurrence);
|
|
ClassDB::bind_method(D_METHOD("select", "from_line", "from_column", "to_line", "to_column", "caret_index"), &TextEdit::select, DEFVAL(0));
|
|
ClassDB::bind_method(D_METHOD("select", "from_line", "from_column", "to_line", "to_column", "caret_index"), &TextEdit::select, DEFVAL(0));
|
|
|
|
|
|
ClassDB::bind_method(D_METHOD("has_selection", "caret_index"), &TextEdit::has_selection, DEFVAL(-1));
|
|
ClassDB::bind_method(D_METHOD("has_selection", "caret_index"), &TextEdit::has_selection, DEFVAL(-1));
|