Merge pull request #69164 from Faless/debugger/4.x_server_keep_open

[Editor] Add button to keep the debug server open.
This commit is contained in:
Rémi Verschelde 2022-11-25 14:04:50 +01:00
commit 92c08a5973
No known key found for this signature in database
GPG Key ID: C3336907360768E1
5 changed files with 51 additions and 21 deletions

View File

@ -207,9 +207,32 @@ String EditorDebuggerNode::get_server_uri() const {
return server->get_uri(); return server->get_uri();
} }
Error EditorDebuggerNode::start(const String &p_uri) { void EditorDebuggerNode::set_keep_open(bool p_keep_open) {
keep_open = p_keep_open;
if (keep_open) {
if (server.is_null() || !server->is_active()) {
start();
}
} else {
bool found = false;
_for_all(tabs, [&](ScriptEditorDebugger *p_debugger) {
if (p_debugger->is_session_active()) {
found = true;
}
});
if (!found) {
stop(); stop();
}
}
}
Error EditorDebuggerNode::start(const String &p_uri) {
ERR_FAIL_COND_V(p_uri.find("://") < 0, ERR_INVALID_PARAMETER); ERR_FAIL_COND_V(p_uri.find("://") < 0, ERR_INVALID_PARAMETER);
if (keep_open && current_uri == p_uri && server.is_valid()) {
return OK;
}
stop(true);
current_uri = p_uri;
if (EDITOR_GET("run/output/always_open_output_on_play")) { if (EDITOR_GET("run/output/always_open_output_on_play")) {
EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log()); EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log());
} else { } else {
@ -225,7 +248,11 @@ Error EditorDebuggerNode::start(const String &p_uri) {
return OK; return OK;
} }
void EditorDebuggerNode::stop() { void EditorDebuggerNode::stop(bool p_force) {
if (keep_open && !p_force) {
return;
}
current_uri.clear();
if (server.is_valid()) { if (server.is_valid()) {
server->stop(); server->stop();
EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR); EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
@ -244,11 +271,6 @@ void EditorDebuggerNode::stop() {
} }
}); });
_break_state_changed(); _break_state_changed();
if (hide_on_stop) {
if (is_visible_in_tree()) {
EditorNode::get_singleton()->hide_bottom_panel();
}
}
breakpoints.clear(); breakpoints.clear();
set_process(false); set_process(false);
} }
@ -428,7 +450,6 @@ void EditorDebuggerNode::set_script_debug_button(MenuButton *p_button) {
p->add_shortcut(ED_GET_SHORTCUT("debugger/break"), DEBUG_BREAK); p->add_shortcut(ED_GET_SHORTCUT("debugger/break"), DEBUG_BREAK);
p->add_shortcut(ED_GET_SHORTCUT("debugger/continue"), DEBUG_CONTINUE); p->add_shortcut(ED_GET_SHORTCUT("debugger/continue"), DEBUG_CONTINUE);
p->add_separator(); p->add_separator();
p->add_check_shortcut(ED_GET_SHORTCUT("debugger/keep_debugger_open"), DEBUG_KEEP_DEBUGGER_OPEN);
p->add_check_shortcut(ED_GET_SHORTCUT("debugger/debug_with_external_editor"), DEBUG_WITH_EXTERNAL_EDITOR); p->add_check_shortcut(ED_GET_SHORTCUT("debugger/debug_with_external_editor"), DEBUG_WITH_EXTERNAL_EDITOR);
p->connect("id_pressed", callable_mp(this, &EditorDebuggerNode::_menu_option)); p->connect("id_pressed", callable_mp(this, &EditorDebuggerNode::_menu_option));
@ -468,12 +489,6 @@ void EditorDebuggerNode::_menu_option(int p_id) {
case DEBUG_CONTINUE: { case DEBUG_CONTINUE: {
debug_continue(); debug_continue();
} break; } break;
case DEBUG_KEEP_DEBUGGER_OPEN: {
bool ischecked = script_menu->get_popup()->is_item_checked(script_menu->get_popup()->get_item_index(DEBUG_KEEP_DEBUGGER_OPEN));
hide_on_stop = ischecked;
script_menu->get_popup()->set_item_checked(script_menu->get_popup()->get_item_index(DEBUG_KEEP_DEBUGGER_OPEN), !ischecked);
EditorSettings::get_singleton()->set_project_metadata("debug_options", "keep_debugger_open", !ischecked);
} break;
case DEBUG_WITH_EXTERNAL_EDITOR: { case DEBUG_WITH_EXTERNAL_EDITOR: {
bool ischecked = script_menu->get_popup()->is_item_checked(script_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR)); bool ischecked = script_menu->get_popup()->is_item_checked(script_menu->get_popup()->get_item_index(DEBUG_WITH_EXTERNAL_EDITOR));
debug_with_external_editor = !ischecked; debug_with_external_editor = !ischecked;
@ -484,9 +499,6 @@ void EditorDebuggerNode::_menu_option(int p_id) {
} }
void EditorDebuggerNode::_update_debug_options() { void EditorDebuggerNode::_update_debug_options() {
if (EditorSettings::get_singleton()->get_project_metadata("debug_options", "keep_debugger_open", false).operator bool()) {
_menu_option(DEBUG_KEEP_DEBUGGER_OPEN);
}
if (EditorSettings::get_singleton()->get_project_metadata("debug_options", "debug_with_external_editor", false).operator bool()) { if (EditorSettings::get_singleton()->get_project_metadata("debug_options", "debug_with_external_editor", false).operator bool()) {
_menu_option(DEBUG_WITH_EXTERNAL_EDITOR); _menu_option(DEBUG_WITH_EXTERNAL_EDITOR);
} }

View File

@ -63,7 +63,6 @@ private:
DEBUG_STEP, DEBUG_STEP,
DEBUG_BREAK, DEBUG_BREAK,
DEBUG_CONTINUE, DEBUG_CONTINUE,
DEBUG_KEEP_DEBUGGER_OPEN,
DEBUG_WITH_EXTERNAL_EDITOR, DEBUG_WITH_EXTERNAL_EDITOR,
}; };
@ -110,7 +109,9 @@ private:
float remote_scene_tree_timeout = 0.0; float remote_scene_tree_timeout = 0.0;
bool auto_switch_remote_scene_tree = false; bool auto_switch_remote_scene_tree = false;
bool debug_with_external_editor = false; bool debug_with_external_editor = false;
bool hide_on_stop = true; bool keep_open = false;
String current_uri;
CameraOverride camera_override = OVERRIDE_NONE; CameraOverride camera_override = OVERRIDE_NONE;
HashMap<Breakpoint, bool, Breakpoint> breakpoints; HashMap<Breakpoint, bool, Breakpoint> breakpoints;
@ -203,8 +204,9 @@ public:
String get_server_uri() const; String get_server_uri() const;
void set_keep_open(bool p_keep_open);
Error start(const String &p_uri = "tcp://"); Error start(const String &p_uri = "tcp://");
void stop(); void stop(bool p_force = false);
bool plugins_capture(ScriptEditorDebugger *p_debugger, const String &p_message, const Array &p_data); bool plugins_capture(ScriptEditorDebugger *p_debugger, const String &p_message, const Array &p_data);
void add_debugger_plugin(const Ref<EditorDebuggerPlugin> &p_plugin); void add_debugger_plugin(const Ref<EditorDebuggerPlugin> &p_plugin);

View File

@ -47,7 +47,6 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) {
ED_SHORTCUT("debugger/step_over", TTR("Step Over"), Key::F10); ED_SHORTCUT("debugger/step_over", TTR("Step Over"), Key::F10);
ED_SHORTCUT("debugger/break", TTR("Break")); ED_SHORTCUT("debugger/break", TTR("Break"));
ED_SHORTCUT("debugger/continue", TTR("Continue"), Key::F12); ED_SHORTCUT("debugger/continue", TTR("Continue"), Key::F12);
ED_SHORTCUT("debugger/keep_debugger_open", TTR("Keep Debugger Open"));
ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor")); ED_SHORTCUT("debugger/debug_with_external_editor", TTR("Debug with External Editor"));
// File Server for deploy with remote filesystem. // File Server for deploy with remote filesystem.
@ -85,6 +84,9 @@ DebuggerEditorPlugin::DebuggerEditorPlugin(PopupMenu *p_debug_menu) {
debug_menu->add_check_shortcut(ED_SHORTCUT("editor/sync_script_changes", TTR("Synchronize Script Changes")), RUN_RELOAD_SCRIPTS); debug_menu->add_check_shortcut(ED_SHORTCUT("editor/sync_script_changes", TTR("Synchronize Script Changes")), RUN_RELOAD_SCRIPTS);
debug_menu->set_item_tooltip(-1, debug_menu->set_item_tooltip(-1,
TTR("When this option is enabled, any script that is saved will be reloaded in the running project.\nWhen used remotely on a device, this is more efficient when the network filesystem option is enabled.")); TTR("When this option is enabled, any script that is saved will be reloaded in the running project.\nWhen used remotely on a device, this is more efficient when the network filesystem option is enabled."));
debug_menu->add_check_shortcut(ED_SHORTCUT("editor/keep_server_open", TTR("Keep Debug Server Open")), SERVER_KEEP_OPEN);
debug_menu->set_item_tooltip(-1,
TTR("When this option is enabled, the editor debug server will stay open and listen for new sessions started outside of the editor itself."));
// Multi-instance, start/stop // Multi-instance, start/stop
instances_menu = memnew(PopupMenu); instances_menu = memnew(PopupMenu);
@ -176,6 +178,14 @@ void DebuggerEditorPlugin::_menu_option(int p_option) {
EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_reload_scripts", !ischecked); EditorSettings::get_singleton()->set_project_metadata("debug_options", "run_reload_scripts", !ischecked);
} break; } break;
case SERVER_KEEP_OPEN: {
bool ischecked = debug_menu->is_item_checked(debug_menu->get_item_index(SERVER_KEEP_OPEN));
debug_menu->set_item_checked(debug_menu->get_item_index(SERVER_KEEP_OPEN), !ischecked);
EditorDebuggerNode::get_singleton()->set_keep_open(!ischecked);
EditorSettings::get_singleton()->set_project_metadata("debug_options", "server_keep_open", !ischecked);
} break;
} }
} }
@ -195,6 +205,7 @@ void DebuggerEditorPlugin::_update_debug_options() {
bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false); bool check_debug_navigation = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_navigation", false);
bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", true); bool check_live_debug = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_live_debug", true);
bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", true); bool check_reload_scripts = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_reload_scripts", true);
bool check_server_keep_open = EditorSettings::get_singleton()->get_project_metadata("debug_options", "server_keep_open", false);
int instances = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_instances", 1); int instances = EditorSettings::get_singleton()->get_project_metadata("debug_options", "run_debug_instances", 1);
if (check_deploy_remote) { if (check_deploy_remote) {
@ -218,6 +229,9 @@ void DebuggerEditorPlugin::_update_debug_options() {
if (check_reload_scripts) { if (check_reload_scripts) {
_menu_option(RUN_RELOAD_SCRIPTS); _menu_option(RUN_RELOAD_SCRIPTS);
} }
if (check_server_keep_open) {
_menu_option(SERVER_KEEP_OPEN);
}
int len = instances_menu->get_item_count(); int len = instances_menu->get_item_count();
for (int idx = 0; idx < len; idx++) { for (int idx = 0; idx < len; idx++) {

View File

@ -53,6 +53,7 @@ private:
RUN_DEBUG_NAVIGATION, RUN_DEBUG_NAVIGATION,
RUN_DEPLOY_REMOTE_DEBUG, RUN_DEPLOY_REMOTE_DEBUG,
RUN_RELOAD_SCRIPTS, RUN_RELOAD_SCRIPTS,
SERVER_KEEP_OPEN,
}; };
void _update_debug_options(); void _update_debug_options();

View File

@ -2952,6 +2952,7 @@ bool Main::start() {
DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_EDITOR); DisplayServer::get_singleton()->set_context(DisplayServer::CONTEXT_EDITOR);
if (!debug_server_uri.is_empty()) { if (!debug_server_uri.is_empty()) {
EditorDebuggerNode::get_singleton()->start(debug_server_uri); EditorDebuggerNode::get_singleton()->start(debug_server_uri);
EditorDebuggerNode::get_singleton()->set_keep_open(true);
} }
} }
#endif #endif