Browse Source

Merge pull request #76472 from jmb462/multicarets_selection_popup

Fix right click in selection of additional caret
Rémi Verschelde 2 years ago
parent
commit
32fbba4bf6
2 changed files with 36 additions and 25 deletions
  1. 18 12
      editor/plugins/script_text_editor.cpp
  2. 18 13
      scene/gui/text_edit.cpp

+ 18 - 12
editor/plugins/script_text_editor.cpp

@@ -1805,20 +1805,26 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 		int col = pos.x;
 
 		tx->set_move_caret_on_right_click_enabled(EDITOR_GET("text_editor/behavior/navigation/move_caret_on_right_click"));
+		int caret_clicked = -1;
 		if (tx->is_move_caret_on_right_click_enabled()) {
-			tx->remove_secondary_carets();
 			if (tx->has_selection()) {
-				int from_line = tx->get_selection_from_line();
-				int to_line = tx->get_selection_to_line();
-				int from_column = tx->get_selection_from_column();
-				int to_column = tx->get_selection_to_column();
-
-				if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) {
-					// Right click is outside the selected text
-					tx->deselect();
+				for (int i = 0; i < tx->get_caret_count(); i++) {
+					int from_line = tx->get_selection_from_line(i);
+					int to_line = tx->get_selection_to_line(i);
+					int from_column = tx->get_selection_from_column(i);
+					int to_column = tx->get_selection_to_column(i);
+
+					if (row >= from_line && row <= to_line && (row != from_line || col >= from_column) && (row != to_line || col <= to_column)) {
+						// Right click in one of the selected text
+						caret_clicked = i;
+						break;
+					}
 				}
 			}
-			if (!tx->has_selection()) {
+			if (!caret_clicked) {
+				tx->deselect();
+				tx->remove_secondary_carets();
+				caret_clicked = 0;
 				tx->set_caret_line(row, false, false);
 				tx->set_caret_column(col);
 			}
@@ -1826,10 +1832,10 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) {
 
 		String word_at_pos = tx->get_word_at_pos(local_pos);
 		if (word_at_pos.is_empty()) {
-			word_at_pos = tx->get_word_under_caret(0);
+			word_at_pos = tx->get_word_under_caret(caret_clicked);
 		}
 		if (word_at_pos.is_empty()) {
-			word_at_pos = tx->get_selected_text(0);
+			word_at_pos = tx->get_selected_text(caret_clicked);
 		}
 
 		bool has_color = (word_at_pos == "Color");

+ 18 - 13
scene/gui/text_edit.cpp

@@ -1851,23 +1851,28 @@ void TextEdit::gui_input(const Ref<InputEvent> &p_gui_input) {
 				Point2i pos = get_line_column_at_pos(mpos);
 				int row = pos.y;
 				int col = pos.x;
-				int caret = carets.size() - 1;
 
+				bool selection_clicked = false;
 				if (is_move_caret_on_right_click_enabled()) {
-					if (has_selection(caret)) {
-						int from_line = get_selection_from_line(caret);
-						int to_line = get_selection_to_line(caret);
-						int from_column = get_selection_from_column(caret);
-						int to_column = get_selection_to_column(caret);
-
-						if (row < from_line || row > to_line || (row == from_line && col < from_column) || (row == to_line && col > to_column)) {
-							// Right click is outside the selected text.
-							deselect(caret);
+					if (has_selection()) {
+						for (int i = 0; i < get_caret_count(); i++) {
+							int from_line = get_selection_from_line(i);
+							int to_line = get_selection_to_line(i);
+							int from_column = get_selection_from_column(i);
+							int to_column = get_selection_to_column(i);
+
+							if (row >= from_line && row <= to_line && (row != from_line || col >= from_column) && (row != to_line || col <= to_column)) {
+								// Right click in one of the selected text
+								selection_clicked = true;
+								break;
+							}
 						}
 					}
-					if (!has_selection(caret)) {
-						set_caret_line(row, true, false, 0, caret);
-						set_caret_column(col, true, caret);
+					if (!selection_clicked) {
+						deselect();
+						remove_secondary_carets();
+						set_caret_line(row, false, false);
+						set_caret_column(col);
 					}
 					merge_overlapping_carets();
 				}