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();
}
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();
}
}
}
Error EditorDebuggerNode::start(const String &p_uri) {
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")) {
EditorNode::get_singleton()->make_bottom_panel_item_visible(EditorNode::get_log());
} else {
@ -225,7 +248,11 @@ Error EditorDebuggerNode::start(const String &p_uri) {
return OK;
}
void EditorDebuggerNode::stop() {
void EditorDebuggerNode::stop(bool p_force) {
if (keep_open && !p_force) {
return;
}
current_uri.clear();
if (server.is_valid()) {
server->stop();
EditorNode::get_log()->add_message("--- Debugging process stopped ---", EditorLog::MSG_TYPE_EDITOR);
@ -244,11 +271,6 @@ void EditorDebuggerNode::stop() {
}
});
_break_state_changed();
if (hide_on_stop) {
if (is_visible_in_tree()) {
EditorNode::get_singleton()->hide_bottom_panel();
}
}
breakpoints.clear();
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/continue"), DEBUG_CONTINUE);
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->connect("id_pressed", callable_mp(this, &EditorDebuggerNode::_menu_option));
@ -468,12 +489,6 @@ void EditorDebuggerNode::_menu_option(int p_id) {
case DEBUG_CONTINUE: {
debug_continue();
} 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: {
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;
@ -484,9 +499,6 @@ void EditorDebuggerNode::_menu_option(int p_id) {
}
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()) {
_menu_option(DEBUG_WITH_EXTERNAL_EDITOR);
}

View file

@ -63,7 +63,6 @@ private:
DEBUG_STEP,
DEBUG_BREAK,
DEBUG_CONTINUE,
DEBUG_KEEP_DEBUGGER_OPEN,
DEBUG_WITH_EXTERNAL_EDITOR,
};
@ -110,7 +109,9 @@ private:
float remote_scene_tree_timeout = 0.0;
bool auto_switch_remote_scene_tree = false;
bool debug_with_external_editor = false;
bool hide_on_stop = true;
bool keep_open = false;
String current_uri;
CameraOverride camera_override = OVERRIDE_NONE;
HashMap<Breakpoint, bool, Breakpoint> breakpoints;
@ -203,8 +204,9 @@ public:
String get_server_uri() const;
void set_keep_open(bool p_keep_open);
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);
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/break", TTR("Break"));
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"));
// 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->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."));
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
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);
} 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_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_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);
if (check_deploy_remote) {
@ -218,6 +229,9 @@ void DebuggerEditorPlugin::_update_debug_options() {
if (check_reload_scripts) {
_menu_option(RUN_RELOAD_SCRIPTS);
}
if (check_server_keep_open) {
_menu_option(SERVER_KEEP_OPEN);
}
int len = instances_menu->get_item_count();
for (int idx = 0; idx < len; idx++) {

View file

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

View file

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