Переглянути джерело

Merge pull request #4218 from Paulb23/text_edit_insert_mode

Fixed insert mode interaction with selection and autocomplete
Rémi Verschelde 9 роки тому
батько
коміт
e971112f4a
1 змінених файлів з 21 додано та 4 видалено
  1. 21 4
      scene/gui/text_edit.cpp

+ 21 - 4
scene/gui/text_edit.cpp

@@ -1596,7 +1596,22 @@ void TextEdit::_input_event(const InputEvent& p_input_event) {
 							if(auto_brace_completion_enabled && _is_pair_symbol(chr[0])) {
 								_consume_pair_symbol(chr[0]);
 							} else {
+
+								// remove the old character if in insert mode
+								if (insert_mode) {
+									_begin_compex_operation();
+
+									// make sure we don't try and remove empty space
+									if (cursor.column < get_line(cursor.line).length()) {
+										_remove_text(cursor.line, cursor.column, cursor.line, cursor.column + 1);
+									}
+								}
+
 								_insert_text_at_cursor(chr);
+
+								if (insert_mode) {
+									_end_compex_operation();
+								}
 							}
 						}
 
@@ -1625,8 +1640,10 @@ void TextEdit::_input_event(const InputEvent& p_input_event) {
 				k.mod.shift=false;
 			}
 
-			// stuff to do when selection is active..
+			// save here for insert mode, just in case it is cleared in the following section
+			bool had_selection = selection.active;
 
+			// stuff to do when selection is active..
 			if (selection.active) {
 
 				if (readonly)
@@ -2376,8 +2393,8 @@ void TextEdit::_input_event(const InputEvent& p_input_event) {
 					if (readonly)
 						break;
 
-					// remove the old character if in insert mode
-					if (insert_mode) {
+					// remove the old character if in insert mode and no selection
+					if (insert_mode && !had_selection) {
 						_begin_compex_operation();
 
 						// make sure we don't try and remove empty space
@@ -2397,7 +2414,7 @@ void TextEdit::_input_event(const InputEvent& p_input_event) {
 						_insert_text_at_cursor(chr);
 					}
 
-					if (insert_mode) {
+					if (insert_mode && !had_selection) {
 						_end_compex_operation();
 					}
 					accept_event();