Merge pull request #91012 from TheSofox/editor-log-line-limit

Add line limit to Output Log in Editor
This commit is contained in:
Rémi Verschelde 2024-05-03 10:31:42 +02:00
commit c968374caa
No known key found for this signature in database
GPG key ID: C3336907360768E1
4 changed files with 63 additions and 7 deletions

View file

@ -924,6 +924,9 @@
<member name="run/output/font_size" type="int" setter="" getter=""> <member name="run/output/font_size" type="int" setter="" getter="">
The size of the font in the [b]Output[/b] panel at the bottom of the editor. This setting does not impact the font size of the script editor (see [member interface/editor/code_font_size]). The size of the font in the [b]Output[/b] panel at the bottom of the editor. This setting does not impact the font size of the script editor (see [member interface/editor/code_font_size]).
</member> </member>
<member name="run/output/max_lines" type="int" setter="" getter="">
Maximum number of lines to show at any one time in the Output panel.
</member>
<member name="run/platforms/linuxbsd/prefer_wayland" type="bool" setter="" getter=""> <member name="run/platforms/linuxbsd/prefer_wayland" type="bool" setter="" getter="">
If [code]true[/code], on Linux/BSD, the editor will check for Wayland first instead of X11 (if available). If [code]true[/code], on Linux/BSD, the editor will check for Wayland first instead of X11 (if available).
</member> </member>

View file

@ -127,6 +127,14 @@ void EditorLog::_update_theme() {
theme_cache.message_color = get_theme_color(SNAME("font_color"), EditorStringName(Editor)) * Color(1, 1, 1, 0.6); theme_cache.message_color = get_theme_color(SNAME("font_color"), EditorStringName(Editor)) * Color(1, 1, 1, 0.6);
} }
void EditorLog::_editor_settings_changed() {
int new_line_limit = int(EDITOR_GET("run/output/max_lines"));
if (new_line_limit != line_limit) {
line_limit = new_line_limit;
_rebuild_log();
}
}
void EditorLog::_notification(int p_what) { void EditorLog::_notification(int p_what) {
switch (p_what) { switch (p_what) {
case NOTIFICATION_ENTER_TREE: { case NOTIFICATION_ENTER_TREE: {
@ -267,7 +275,35 @@ void EditorLog::_undo_redo_cbk(void *p_self, const String &p_name) {
void EditorLog::_rebuild_log() { void EditorLog::_rebuild_log() {
log->clear(); log->clear();
for (int msg_idx = 0; msg_idx < messages.size(); msg_idx++) { int line_count = 0;
int start_message_index = 0;
int initial_skip = 0;
// Search backward for starting place.
for (start_message_index = messages.size() - 1; start_message_index >= 0; start_message_index--) {
LogMessage msg = messages[start_message_index];
if (collapse) {
if (_check_display_message(msg)) {
line_count++;
}
} else {
// If not collapsing, log each instance on a line.
for (int i = 0; i < msg.count; i++) {
if (_check_display_message(msg)) {
line_count++;
}
}
}
if (line_count >= line_limit) {
initial_skip = line_count - line_limit;
break;
}
if (start_message_index == 0) {
break;
}
}
for (int msg_idx = start_message_index; msg_idx < messages.size(); msg_idx++) {
LogMessage msg = messages[msg_idx]; LogMessage msg = messages[msg_idx];
if (collapse) { if (collapse) {
@ -275,13 +311,21 @@ void EditorLog::_rebuild_log() {
_add_log_line(msg); _add_log_line(msg);
} else { } else {
// If not collapsing, log each instance on a line. // If not collapsing, log each instance on a line.
for (int i = 0; i < msg.count; i++) { for (int i = initial_skip; i < msg.count; i++) {
initial_skip = 0;
_add_log_line(msg); _add_log_line(msg);
} }
} }
} }
} }
bool EditorLog::_check_display_message(LogMessage &p_message) {
bool filter_active = type_filter_map[p_message.type]->is_active();
String search_text = search_box->get_text();
bool search_match = search_text.is_empty() || p_message.text.findn(search_text) > -1;
return filter_active && search_match;
}
void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) { void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) {
if (!is_inside_tree()) { if (!is_inside_tree()) {
// The log will be built all at once when it enters the tree and has its theme items. // The log will be built all at once when it enters the tree and has its theme items.
@ -294,11 +338,7 @@ void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) {
} }
// Only add the message to the log if it passes the filters. // Only add the message to the log if it passes the filters.
bool filter_active = type_filter_map[p_message.type]->is_active(); if (!_check_display_message(p_message)) {
String search_text = search_box->get_text();
bool search_match = search_text.is_empty() || p_message.text.findn(search_text) > -1;
if (!filter_active || !search_match) {
return; return;
} }
@ -359,6 +399,10 @@ void EditorLog::_add_log_line(LogMessage &p_message, bool p_replace_previous) {
} }
} }
} }
while (log->get_paragraph_count() > line_limit + 1) {
log->remove_paragraph(0, true);
}
} }
void EditorLog::_set_filter_active(bool p_active, MessageType p_message_type) { void EditorLog::_set_filter_active(bool p_active, MessageType p_message_type) {
@ -392,6 +436,9 @@ EditorLog::EditorLog() {
save_state_timer->connect("timeout", callable_mp(this, &EditorLog::_save_state)); save_state_timer->connect("timeout", callable_mp(this, &EditorLog::_save_state));
add_child(save_state_timer); add_child(save_state_timer);
line_limit = int(EDITOR_GET("run/output/max_lines"));
EditorSettings::get_singleton()->connect("settings_changed", callable_mp(this, &EditorLog::_editor_settings_changed));
HBoxContainer *hb = this; HBoxContainer *hb = this;
VBoxContainer *vb_left = memnew(VBoxContainer); VBoxContainer *vb_left = memnew(VBoxContainer);

View file

@ -128,6 +128,8 @@ private:
} }
}; };
int line_limit = 10000;
Vector<LogMessage> messages; Vector<LogMessage> messages;
// Maps MessageTypes to LogFilters for convenient access and storage (don't need 1 member per filter). // Maps MessageTypes to LogFilters for convenient access and storage (don't need 1 member per filter).
HashMap<MessageType, LogFilter *> type_filter_map; HashMap<MessageType, LogFilter *> type_filter_map;
@ -164,6 +166,7 @@ private:
void _rebuild_log(); void _rebuild_log();
void _add_log_line(LogMessage &p_message, bool p_replace_previous = false); void _add_log_line(LogMessage &p_message, bool p_replace_previous = false);
bool _check_display_message(LogMessage &p_message);
void _set_filter_active(bool p_active, MessageType p_message_type); void _set_filter_active(bool p_active, MessageType p_message_type);
void _set_search_visible(bool p_visible); void _set_search_visible(bool p_visible);
@ -179,6 +182,7 @@ private:
void _load_state(); void _load_state();
void _update_theme(); void _update_theme();
void _editor_settings_changed();
protected: protected:
void _notification(int p_what); void _notification(int p_what);

View file

@ -821,6 +821,8 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
_initial_set("run/output/always_open_output_on_play", true); _initial_set("run/output/always_open_output_on_play", true);
_initial_set("run/output/always_close_output_on_stop", false); _initial_set("run/output/always_close_output_on_stop", false);
EDITOR_SETTING(Variant::INT, PROPERTY_HINT_RANGE, "run/output/max_lines", 10000, "100,100000,1")
// Platform // Platform
_initial_set("run/platforms/linuxbsd/prefer_wayland", false); _initial_set("run/platforms/linuxbsd/prefer_wayland", false);
set_restart_if_changed("run/platforms/linuxbsd/prefer_wayland", true); set_restart_if_changed("run/platforms/linuxbsd/prefer_wayland", true);