From bfdabe2c1c84711c057e50323aaabee3cf5b0f97 Mon Sep 17 00:00:00 2001 From: TsFreddie Date: Thu, 3 Oct 2024 15:54:43 +0800 Subject: [PATCH] Add step out to script debugger --- core/debugger/local_debugger.cpp | 4 ++++ core/debugger/remote_debugger.cpp | 5 +++++ editor/debugger/script_editor_debugger.cpp | 16 ++++++++++++++++ editor/debugger/script_editor_debugger.h | 2 ++ editor/icons/DebugOut.svg | 1 + editor/plugins/debugger_editor_plugin.cpp | 1 + 6 files changed, 29 insertions(+) create mode 100644 editor/icons/DebugOut.svg diff --git a/core/debugger/local_debugger.cpp b/core/debugger/local_debugger.cpp index dc46ffc3075..a354b15f9c8 100644 --- a/core/debugger/local_debugger.cpp +++ b/core/debugger/local_debugger.cpp @@ -224,6 +224,10 @@ void LocalDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) { script_debugger->set_depth(0); script_debugger->set_lines_left(1); break; + } else if (line == "o" || line == "out") { + script_debugger->set_depth(1); + script_debugger->set_lines_left(1); + break; } else if (line == "fin" || line == "finish") { String current_function = script_lang->debug_get_stack_level_function(0); diff --git a/core/debugger/remote_debugger.cpp b/core/debugger/remote_debugger.cpp index fc1b7b74f99..170c42c9bab 100644 --- a/core/debugger/remote_debugger.cpp +++ b/core/debugger/remote_debugger.cpp @@ -462,6 +462,11 @@ void RemoteDebugger::debug(bool p_can_continue, bool p_is_error_breakpoint) { script_debugger->set_lines_left(1); break; + } else if (command == "out") { + script_debugger->set_depth(1); + script_debugger->set_lines_left(1); + break; + } else if (command == "continue") { script_debugger->set_depth(-1); script_debugger->set_lines_left(-1); diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index 642244ebeb1..741847b384f 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -105,6 +105,13 @@ void ScriptEditorDebugger::debug_skip_breakpoints() { _put_msg("set_skip_breakpoints", msg, debugging_thread_id != Thread::UNASSIGNED_ID ? debugging_thread_id : Thread::MAIN_ID); } +void ScriptEditorDebugger::debug_out() { + ERR_FAIL_COND(!is_breaked()); + + _put_msg("out", Array(), debugging_thread_id); + _clear_execution(); +} + void ScriptEditorDebugger::debug_next() { ERR_FAIL_COND(!is_breaked()); @@ -867,6 +874,7 @@ void ScriptEditorDebugger::_notification(int p_what) { copy->set_icon(get_editor_theme_icon(SNAME("ActionCopy"))); step->set_icon(get_editor_theme_icon(SNAME("DebugStep"))); next->set_icon(get_editor_theme_icon(SNAME("DebugNext"))); + out->set_icon(get_editor_theme_icon(SNAME("DebugOut"))); dobreak->set_icon(get_editor_theme_icon(SNAME("Pause"))); docontinue->set_icon(get_editor_theme_icon(SNAME("DebugContinue"))); vmem_refresh->set_icon(get_editor_theme_icon(SNAME("Reload"))); @@ -1032,6 +1040,7 @@ void ScriptEditorDebugger::_update_buttons_state() { vmem_refresh->set_disabled(!active); step->set_disabled(!active || !is_breaked() || !is_debuggable()); next->set_disabled(!active || !is_breaked() || !is_debuggable()); + out->set_disabled(!active || !is_breaked() || !is_debuggable()); copy->set_disabled(!active || !is_breaked()); docontinue->set_disabled(!active || !is_breaked()); dobreak->set_disabled(!active || is_breaked()); @@ -1863,6 +1872,13 @@ ScriptEditorDebugger::ScriptEditorDebugger() { next->set_shortcut(ED_GET_SHORTCUT("debugger/step_over")); next->connect(SceneStringName(pressed), callable_mp(this, &ScriptEditorDebugger::debug_next)); + out = memnew(Button); + out->set_theme_type_variation("FlatButton"); + hbc->add_child(out); + out->set_tooltip_text(TTR("Step Out")); + out->set_shortcut(ED_GET_SHORTCUT("debugger/step_out")); + out->connect(SceneStringName(pressed), callable_mp(this, &ScriptEditorDebugger::debug_out)); + hbc->add_child(memnew(VSeparator)); dobreak = memnew(Button); diff --git a/editor/debugger/script_editor_debugger.h b/editor/debugger/script_editor_debugger.h index 26106849f90..4b8d27b9796 100644 --- a/editor/debugger/script_editor_debugger.h +++ b/editor/debugger/script_editor_debugger.h @@ -125,6 +125,7 @@ private: Button *copy = nullptr; Button *step = nullptr; Button *next = nullptr; + Button *out = nullptr; Button *dobreak = nullptr; Button *docontinue = nullptr; // Reference to "Remote" tab in scene tree. Needed by _live_edit_set and buttons state. @@ -260,6 +261,7 @@ public: void debug_skip_breakpoints(); void debug_copy(); + void debug_out(); void debug_next(); void debug_step(); void debug_break(); diff --git a/editor/icons/DebugOut.svg b/editor/icons/DebugOut.svg new file mode 100644 index 00000000000..4ff7ff662d2 --- /dev/null +++ b/editor/icons/DebugOut.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/editor/plugins/debugger_editor_plugin.cpp b/editor/plugins/debugger_editor_plugin.cpp index 55416ab4ebc..951ac5c2915 100644 --- a/editor/plugins/debugger_editor_plugin.cpp +++ b/editor/plugins/debugger_editor_plugin.cpp @@ -48,6 +48,7 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) { ED_SHORTCUT("debugger/step_into", TTR("Step Into"), Key::F11); ED_SHORTCUT("debugger/step_over", TTR("Step Over"), Key::F10); + ED_SHORTCUT("debugger/step_out", TTR("Step Out"), KeyModifierMask::SHIFT | Key::F11); ED_SHORTCUT("debugger/break", TTR("Break")); ED_SHORTCUT("debugger/continue", TTR("Continue"), Key::F12); ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor"));