Browse Source

Fixes Delete Line doesn't delete first line in script

Also, match multi-line delete behavior in script with single line:

If there are four lines: A, B, C, D.

Before the change:

    Delete C: Cursor lands on D
    Delete B and C: Cursor lands on A

After the change:

    Delete C: Cursor lands on D
    Delete B and C: Cursor lands on D
Haoyu Qiu 5 years ago
parent
commit
6eaec3d10d
2 changed files with 19 additions and 13 deletions
  1. 17 13
      editor/code_editor.cpp
  2. 2 0
      editor/code_editor.h

+ 17 - 13
editor/code_editor.cpp

@@ -1182,6 +1182,19 @@ void CodeTextEditor::move_lines_down() {
 	text_editor->update();
 	text_editor->update();
 }
 }
 
 
+void CodeTextEditor::_delete_line(int p_line) {
+	// this is currently intended to be called within delete_lines()
+	// so `begin_complex_operation` is ommitted here
+	text_editor->set_line(p_line, "");
+	if (p_line == 0 && text_editor->get_line_count() > 1) {
+		text_editor->cursor_set_line(1);
+		text_editor->cursor_set_column(0);
+	}
+	text_editor->backspace_at_cursor();
+	text_editor->unfold_line(p_line);
+	text_editor->cursor_set_line(p_line);
+}
+
 void CodeTextEditor::delete_lines() {
 void CodeTextEditor::delete_lines() {
 	text_editor->begin_complex_operation();
 	text_editor->begin_complex_operation();
 	if (text_editor->is_selection_active()) {
 	if (text_editor->is_selection_active()) {
@@ -1189,22 +1202,13 @@ void CodeTextEditor::delete_lines() {
 		int from_line = text_editor->get_selection_from_line();
 		int from_line = text_editor->get_selection_from_line();
 		int count = Math::abs(to_line - from_line) + 1;
 		int count = Math::abs(to_line - from_line) + 1;
 
 
-		text_editor->cursor_set_line(to_line, false);
-		while (count) {
-			text_editor->set_line(text_editor->cursor_get_line(), "");
-			text_editor->backspace_at_cursor();
-			count--;
-			if (count)
-				text_editor->unfold_line(from_line);
+		text_editor->cursor_set_line(from_line, false);
+		for (int i = 0; i < count; i++) {
+			_delete_line(from_line);
 		}
 		}
-		text_editor->cursor_set_line(from_line - 1);
 		text_editor->deselect();
 		text_editor->deselect();
 	} else {
 	} else {
-		int line = text_editor->cursor_get_line();
-		text_editor->set_line(text_editor->cursor_get_line(), "");
-		text_editor->backspace_at_cursor();
-		text_editor->unfold_line(line);
-		text_editor->cursor_set_line(line);
+		_delete_line(text_editor->cursor_get_line());
 	}
 	}
 	text_editor->end_complex_operation();
 	text_editor->end_complex_operation();
 }
 }

+ 2 - 0
editor/code_editor.h

@@ -185,6 +185,8 @@ class CodeTextEditor : public VBoxContainer {
 	void _set_show_warnings_panel(bool p_show);
 	void _set_show_warnings_panel(bool p_show);
 	void _error_pressed(const Ref<InputEvent> &p_event);
 	void _error_pressed(const Ref<InputEvent> &p_event);
 
 
+	void _delete_line(int p_line);
+
 protected:
 protected:
 	virtual void _load_theme_settings() {}
 	virtual void _load_theme_settings() {}
 	virtual void _validate_script() {}
 	virtual void _validate_script() {}