2014-02-10 09:10:30 +08:00
/**************************************************************************/
/* editor_log.h */
/**************************************************************************/
/* This file is part of: */
/* GODOT ENGINE */
/* https://godotengine.org */
/**************************************************************************/
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
/* */
/* Permission is hereby granted, free of charge, to any person obtaining */
/* a copy of this software and associated documentation files (the */
/* "Software"), to deal in the Software without restriction, including */
/* without limitation the rights to use, copy, modify, merge, publish, */
/* distribute, sublicense, and/or sell copies of the Software, and to */
/* permit persons to whom the Software is furnished to do so, subject to */
/* the following conditions: */
/* */
/* The above copyright notice and this permission notice shall be */
/* included in all copies or substantial portions of the Software. */
/* */
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
/**************************************************************************/
2018-01-05 07:50:27 +08:00
2014-02-10 09:10:30 +08:00
# ifndef EDITOR_LOG_H
# define EDITOR_LOG_H
2018-09-12 00:13:45 +08:00
# include "core/os/thread.h"
2014-02-10 09:10:30 +08:00
# include "scene/gui/box_container.h"
2020-06-20 02:49:04 +08:00
# include "scene/gui/button.h"
# include "scene/gui/label.h"
2020-08-16 15:30:52 +08:00
# include "scene/gui/line_edit.h"
2014-02-10 09:10:30 +08:00
# include "scene/gui/panel_container.h"
2020-06-20 02:49:04 +08:00
# include "scene/gui/rich_text_label.h"
# include "scene/gui/texture_button.h"
2017-01-14 17:52:54 +08:00
# include "scene/gui/texture_rect.h"
2018-08-13 23:04:38 +08:00
2022-03-26 01:06:46 +08:00
class UndoRedo ;
2020-08-16 15:30:52 +08:00
class EditorLog : public HBoxContainer {
GDCLASS ( EditorLog , HBoxContainer ) ;
public :
enum MessageType {
MSG_TYPE_STD ,
MSG_TYPE_ERROR ,
2022-05-03 07:29:38 +08:00
MSG_TYPE_STD_RICH ,
2020-08-16 15:30:52 +08:00
MSG_TYPE_WARNING ,
MSG_TYPE_EDITOR ,
} ;
private :
struct LogMessage {
String text ;
MessageType type ;
int count = 1 ;
2023-08-10 14:48:53 +08:00
bool clear = true ;
2020-08-16 15:30:52 +08:00
LogMessage ( ) { }
2024-02-16 00:25:58 +08:00
LogMessage ( const String & p_text , MessageType p_type , bool p_clear ) :
2020-08-16 15:30:52 +08:00
text ( p_text ) ,
2023-08-10 14:48:53 +08:00
type ( p_type ) ,
clear ( p_clear ) {
2020-08-16 15:30:52 +08:00
}
} ;
2022-08-11 18:48:43 +08:00
struct {
Color error_color ;
Ref < Texture2D > error_icon ;
Color warning_color ;
Ref < Texture2D > warning_icon ;
Color message_color ;
} theme_cache ;
2020-08-16 15:30:52 +08:00
// Encapsulates all data and functionality regarding filters.
struct LogFilter {
private :
// Force usage of set method since it has functionality built-in.
int message_count = 0 ;
2021-05-05 09:05:09 +08:00
bool active = true ;
2020-08-16 15:30:52 +08:00
public :
MessageType type ;
Button * toggle_button = nullptr ;
void initialize_button ( const String & p_tooltip , Callable p_toggled_callback ) {
toggle_button = memnew ( Button ) ;
toggle_button - > set_toggle_mode ( true ) ;
toggle_button - > set_pressed ( true ) ;
toggle_button - > set_text ( itos ( message_count ) ) ;
2022-08-25 18:42:17 +08:00
toggle_button - > set_tooltip_text ( TTR ( p_tooltip ) ) ;
2020-08-16 15:30:52 +08:00
toggle_button - > set_focus_mode ( FOCUS_NONE ) ;
// When toggled call the callback and pass the MessageType this button is for.
2024-06-01 18:15:13 +08:00
toggle_button - > connect ( SceneStringName ( toggled ) , p_toggled_callback . bind ( type ) ) ;
2020-08-16 15:30:52 +08:00
}
int get_message_count ( ) {
return message_count ;
}
void set_message_count ( int p_count ) {
message_count = p_count ;
toggle_button - > set_text ( itos ( message_count ) ) ;
}
2021-05-05 09:05:09 +08:00
bool is_active ( ) {
return active ;
}
void set_active ( bool p_active ) {
toggle_button - > set_pressed ( p_active ) ;
active = p_active ;
}
2020-08-16 15:30:52 +08:00
LogFilter ( MessageType p_type ) :
type ( p_type ) {
}
} ;
2023-11-20 20:06:54 +08:00
int line_limit = 10000 ;
2020-08-16 15:30:52 +08:00
Vector < LogMessage > messages ;
// Maps MessageTypes to LogFilters for convenient access and storage (don't need 1 member per filter).
2022-05-13 21:04:37 +08:00
HashMap < MessageType , LogFilter * > type_filter_map ;
2014-02-10 09:10:30 +08:00
2022-04-04 21:06:57 +08:00
RichTextLabel * log = nullptr ;
2020-08-16 15:30:52 +08:00
2022-04-04 21:06:57 +08:00
Button * clear_button = nullptr ;
Button * copy_button = nullptr ;
2020-08-16 15:30:52 +08:00
2022-04-04 21:06:57 +08:00
Button * collapse_button = nullptr ;
2020-08-16 15:30:52 +08:00
bool collapse = false ;
2022-04-04 21:06:57 +08:00
Button * show_search_button = nullptr ;
LineEdit * search_box = nullptr ;
2020-08-16 15:30:52 +08:00
2024-11-28 23:56:14 +08:00
// Reference to the "Output" button on the toolbar so we can update its icon when warnings or errors are encountered.
2022-04-04 21:06:57 +08:00
Button * tool_button = nullptr ;
2014-02-10 09:10:30 +08:00
2024-11-28 23:56:14 +08:00
bool is_loading_state = false ; // Used to disable saving requests while loading (some signals from buttons will try to trigger a save, which happens during loading).
2022-04-04 21:06:57 +08:00
Timer * save_state_timer = nullptr ;
2021-05-05 09:05:09 +08:00
2021-09-22 23:36:40 +08:00
static void _error_handler ( void * p_self , const char * p_func , const char * p_file , int p_line , const char * p_error , const char * p_errorexp , bool p_editor_notify , ErrorHandlerType p_type ) ;
2014-02-10 09:10:30 +08:00
ErrorHandlerList eh ;
2017-01-14 19:26:56 +08:00
//void _dragged(const Point2& p_ofs);
2024-01-15 21:29:52 +08:00
void _meta_clicked ( const String & p_meta ) ;
2015-07-29 06:41:24 +08:00
void _clear_request ( ) ;
2019-04-14 16:55:31 +08:00
void _copy_request ( ) ;
2014-02-10 09:10:30 +08:00
static void _undo_redo_cbk ( void * p_self , const String & p_name ) ;
2020-08-16 15:30:52 +08:00
void _rebuild_log ( ) ;
void _add_log_line ( LogMessage & p_message , bool p_replace_previous = false ) ;
2023-11-20 20:06:54 +08:00
bool _check_display_message ( LogMessage & p_message ) ;
2020-08-16 15:30:52 +08:00
void _set_filter_active ( bool p_active , MessageType p_message_type ) ;
void _set_search_visible ( bool p_visible ) ;
void _search_changed ( const String & p_text ) ;
2023-08-10 14:48:53 +08:00
void _process_message ( const String & p_msg , MessageType p_type , bool p_clear ) ;
2020-08-16 15:30:52 +08:00
void _reset_message_counts ( ) ;
void _set_collapse ( bool p_collapse ) ;
2021-05-05 09:05:09 +08:00
void _start_state_save_timer ( ) ;
void _save_state ( ) ;
void _load_state ( ) ;
2022-08-29 17:04:31 +08:00
void _update_theme ( ) ;
2023-11-20 20:06:54 +08:00
void _editor_settings_changed ( ) ;
2022-08-29 17:04:31 +08:00
2014-02-10 09:10:30 +08:00
protected :
void _notification ( int p_what ) ;
public :
2018-08-13 23:04:38 +08:00
void add_message ( const String & p_msg , MessageType p_type = MSG_TYPE_STD ) ;
2020-06-20 02:49:04 +08:00
void set_tool_button ( Button * p_tool_button ) ;
2022-03-26 01:06:46 +08:00
void register_undo_redo ( UndoRedo * p_undo_redo ) ;
2014-02-10 09:10:30 +08:00
void deinit ( ) ;
2015-07-30 06:03:25 +08:00
void clear ( ) ;
2020-08-16 15:30:52 +08:00
2014-02-10 09:10:30 +08:00
EditorLog ( ) ;
~ EditorLog ( ) ;
} ;
2020-08-16 15:30:52 +08:00
VARIANT_ENUM_CAST ( EditorLog : : MessageType ) ;
2014-02-10 09:10:30 +08:00
# endif // EDITOR_LOG_H