Skip to content

Commit 06b17a4

Browse files
committed
Fix goto line issues in code editor
1 parent 3e0c10d commit 06b17a4

9 files changed

+38
-45
lines changed

editor/code_editor.cpp

+15-15
Original file line numberDiff line numberDiff line change
@@ -1296,23 +1296,29 @@ void CodeTextEditor::toggle_inline_comment(const String &delimiter) {
12961296
text_editor->end_complex_operation();
12971297
}
12981298

1299-
void CodeTextEditor::goto_line(int p_line) {
1299+
void CodeTextEditor::goto_line(int p_line, int p_column) {
13001300
text_editor->remove_secondary_carets();
13011301
text_editor->deselect();
1302-
text_editor->unfold_line(p_line);
1303-
callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_line).call_deferred(p_line, true, true, 0, 0);
1302+
text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1));
1303+
text_editor->set_caret_line(p_line, false);
1304+
text_editor->set_caret_column(p_column, false);
1305+
// Defer in case the CodeEdit was just created and needs to be resized.
1306+
callable_mp((TextEdit *)text_editor, &TextEdit::adjust_viewport_to_caret).call_deferred(0);
13041307
}
13051308

13061309
void CodeTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
13071310
text_editor->remove_secondary_carets();
1308-
text_editor->unfold_line(p_line);
1309-
callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_line).call_deferred(p_line, true, true, 0, 0);
1310-
callable_mp((TextEdit *)text_editor, &TextEdit::set_caret_column).call_deferred(p_begin, true, 0);
1311+
text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1));
13111312
text_editor->select(p_line, p_begin, p_line, p_end);
1313+
callable_mp((TextEdit *)text_editor, &TextEdit::adjust_viewport_to_caret).call_deferred(0);
13121314
}
13131315

1314-
void CodeTextEditor::goto_line_centered(int p_line) {
1315-
goto_line(p_line);
1316+
void CodeTextEditor::goto_line_centered(int p_line, int p_column) {
1317+
text_editor->remove_secondary_carets();
1318+
text_editor->deselect();
1319+
text_editor->unfold_line(CLAMP(p_line, 0, text_editor->get_line_count() - 1));
1320+
text_editor->set_caret_line(p_line, false);
1321+
text_editor->set_caret_column(p_column, false);
13161322
callable_mp((TextEdit *)text_editor, &TextEdit::center_viewport_to_caret).call_deferred(0);
13171323
}
13181324

@@ -1440,13 +1446,7 @@ void CodeTextEditor::goto_error() {
14401446
corrected_column -= tab_count * (indent_size - 1);
14411447
}
14421448

1443-
if (text_editor->get_line_count() != error_line) {
1444-
text_editor->unfold_line(error_line);
1445-
}
1446-
text_editor->remove_secondary_carets();
1447-
text_editor->set_caret_line(error_line);
1448-
text_editor->set_caret_column(corrected_column);
1449-
text_editor->center_viewport_to_caret();
1449+
goto_line_centered(error_line, corrected_column);
14501450
}
14511451
}
14521452

editor/code_editor.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -246,9 +246,9 @@ class CodeTextEditor : public VBoxContainer {
246246
/// by adding or removing comment delimiter
247247
void toggle_inline_comment(const String &delimiter);
248248

249-
void goto_line(int p_line);
249+
void goto_line(int p_line, int p_column = 0);
250250
void goto_line_selection(int p_line, int p_begin, int p_end);
251-
void goto_line_centered(int p_line);
251+
void goto_line_centered(int p_line, int p_column = 0);
252252
void set_executing_line(int p_line);
253253
void clear_executing_line();
254254

editor/plugins/script_editor_plugin.cpp

+7-11
Original file line numberDiff line numberDiff line change
@@ -493,7 +493,7 @@ void ScriptEditor::_goto_script_line(Ref<RefCounted> p_script, int p_line) {
493493
if (ScriptTextEditor *script_text_editor = Object::cast_to<ScriptTextEditor>(current)) {
494494
script_text_editor->goto_line_centered(p_line);
495495
} else if (current) {
496-
current->goto_line(p_line, true);
496+
current->goto_line(p_line);
497497
}
498498

499499
_save_history();
@@ -1857,17 +1857,13 @@ void ScriptEditor::get_breakpoints(List<String> *p_breakpoints) {
18571857
}
18581858

18591859
void ScriptEditor::_members_overview_selected(int p_idx) {
1860-
ScriptEditorBase *se = _get_current_editor();
1861-
if (!se) {
1862-
return;
1860+
int line = members_overview->get_item_metadata(p_idx);
1861+
ScriptEditorBase *current = _get_current_editor();
1862+
if (ScriptTextEditor *script_text_editor = Object::cast_to<ScriptTextEditor>(current)) {
1863+
script_text_editor->goto_line_centered(line);
1864+
} else if (current) {
1865+
current->goto_line(line);
18631866
}
1864-
// Go to the member's line and reset the cursor column. We can't change scroll_position
1865-
// directly until we have gone to the line first, since code might be folded.
1866-
se->goto_line(members_overview->get_item_metadata(p_idx));
1867-
Dictionary state = se->get_edit_state();
1868-
state["column"] = 0;
1869-
state["scroll_position"] = members_overview->get_item_metadata(p_idx);
1870-
se->set_edit_state(state);
18711867
}
18721868

18731869
void ScriptEditor::_help_overview_selected(int p_idx) {

editor/plugins/script_editor_plugin.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ class ScriptEditorBase : public VBoxContainer {
170170
virtual Variant get_edit_state() = 0;
171171
virtual void set_edit_state(const Variant &p_state) = 0;
172172
virtual Variant get_navigation_state() = 0;
173-
virtual void goto_line(int p_line, bool p_with_error = false) = 0;
173+
virtual void goto_line(int p_line, int p_column = 0) = 0;
174174
virtual void set_executing_line(int p_line) = 0;
175175
virtual void clear_executing_line() = 0;
176176
virtual void trim_trailing_whitespace() = 0;

editor/plugins/script_text_editor.cpp

+7-10
Original file line numberDiff line numberDiff line change
@@ -302,16 +302,14 @@ void ScriptTextEditor::_warning_clicked(const Variant &p_line) {
302302

303303
void ScriptTextEditor::_error_clicked(const Variant &p_line) {
304304
if (p_line.get_type() == Variant::INT) {
305-
code_editor->get_text_editor()->remove_secondary_carets();
306-
code_editor->get_text_editor()->set_caret_line(p_line.operator int64_t());
305+
goto_line_centered(p_line.operator int64_t());
307306
} else if (p_line.get_type() == Variant::DICTIONARY) {
308307
Dictionary meta = p_line.operator Dictionary();
309308
const String path = meta["path"].operator String();
310309
const int line = meta["line"].operator int64_t();
311310
const int column = meta["column"].operator int64_t();
312311
if (path.is_empty()) {
313-
code_editor->get_text_editor()->remove_secondary_carets();
314-
code_editor->get_text_editor()->set_caret_line(line);
312+
goto_line_centered(line, column);
315313
} else {
316314
Ref<Resource> scr = ResourceLoader::load(path);
317315
if (!scr.is_valid()) {
@@ -456,16 +454,16 @@ void ScriptTextEditor::tag_saved_version() {
456454
code_editor->get_text_editor()->tag_saved_version();
457455
}
458456

459-
void ScriptTextEditor::goto_line(int p_line, bool p_with_error) {
460-
code_editor->goto_line(p_line);
457+
void ScriptTextEditor::goto_line(int p_line, int p_column) {
458+
code_editor->goto_line(p_line, p_column);
461459
}
462460

463461
void ScriptTextEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
464462
code_editor->goto_line_selection(p_line, p_begin, p_end);
465463
}
466464

467-
void ScriptTextEditor::goto_line_centered(int p_line) {
468-
code_editor->goto_line_centered(p_line);
465+
void ScriptTextEditor::goto_line_centered(int p_line, int p_column) {
466+
code_editor->goto_line_centered(p_line, p_column);
469467
}
470468

471469
void ScriptTextEditor::set_executing_line(int p_line) {
@@ -919,8 +917,7 @@ void ScriptTextEditor::_breakpoint_item_pressed(int p_idx) {
919917
if (p_idx < 4) { // Any item before the separator.
920918
_edit_option(breakpoints_menu->get_item_id(p_idx));
921919
} else {
922-
code_editor->goto_line(breakpoints_menu->get_item_metadata(p_idx));
923-
callable_mp((TextEdit *)code_editor->get_text_editor(), &TextEdit::center_viewport_to_caret).call_deferred(0); // Needs to be deferred, because goto uses call_deferred().
920+
code_editor->goto_line_centered(breakpoints_menu->get_item_metadata(p_idx));
924921
}
925922
}
926923

editor/plugins/script_text_editor.h

+2-2
Original file line numberDiff line numberDiff line change
@@ -234,9 +234,9 @@ class ScriptTextEditor : public ScriptEditorBase {
234234
virtual void convert_indent() override;
235235
virtual void tag_saved_version() override;
236236

237-
virtual void goto_line(int p_line, bool p_with_error = false) override;
237+
virtual void goto_line(int p_line, int p_column = 0) override;
238238
void goto_line_selection(int p_line, int p_begin, int p_end);
239-
void goto_line_centered(int p_line);
239+
void goto_line_centered(int p_line, int p_column = 0);
240240
virtual void set_executing_line(int p_line) override;
241241
virtual void clear_executing_line() override;
242242

editor/plugins/text_editor.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -304,8 +304,8 @@ void TextEditor::tag_saved_version() {
304304
code_editor->get_text_editor()->tag_saved_version();
305305
}
306306

307-
void TextEditor::goto_line(int p_line, bool p_with_error) {
308-
code_editor->goto_line(p_line);
307+
void TextEditor::goto_line(int p_line, int p_column) {
308+
code_editor->goto_line(p_line, p_column);
309309
}
310310

311311
void TextEditor::goto_line_selection(int p_line, int p_begin, int p_end) {

editor/plugins/text_editor.h

+1-1
Original file line numberDiff line numberDiff line change
@@ -129,7 +129,7 @@ class TextEditor : public ScriptEditorBase {
129129
virtual PackedInt32Array get_breakpoints() override;
130130
virtual void set_breakpoint(int p_line, bool p_enabled) override{};
131131
virtual void clear_breakpoints() override{};
132-
virtual void goto_line(int p_line, bool p_with_error = false) override;
132+
virtual void goto_line(int p_line, int p_column = 0) override;
133133
void goto_line_selection(int p_line, int p_begin, int p_end);
134134
virtual void set_executing_line(int p_line) override;
135135
virtual void clear_executing_line() override;

editor/plugins/text_shader_editor.cpp

+1-1
Original file line numberDiff line numberDiff line change
@@ -779,7 +779,7 @@ void TextShaderEditor::_show_warnings_panel(bool p_show) {
779779

780780
void TextShaderEditor::_warning_clicked(const Variant &p_line) {
781781
if (p_line.get_type() == Variant::INT) {
782-
code_editor->get_text_editor()->set_caret_line(p_line.operator int64_t());
782+
code_editor->goto_line_centered(p_line.operator int64_t());
783783
}
784784
}
785785

0 commit comments

Comments
 (0)