Ver código fonte

Displays errors and warnings in a better way in the script editor

Gilles Roudière 6 anos atrás
pai
commit
5f981d7fef

+ 82 - 91
editor/code_editor.cpp

@@ -31,6 +31,7 @@
 #include "code_editor.h"
 
 #include "core/os/keyboard.h"
+#include "core/string_builder.h"
 #include "editor/editor_scale.h"
 #include "editor_node.h"
 #include "editor_settings.h"
@@ -673,18 +674,14 @@ void CodeTextEditor::_reset_zoom() {
 	if (font.is_valid()) {
 		EditorSettings::get_singleton()->set("interface/editor/code_font_size", 14);
 		font->set_size(14);
-		font_size_nb->set_text("14 (100%)");
 	}
 }
 
 void CodeTextEditor::_line_col_changed() {
 
-	line_nb->set_text(itos(text_editor->cursor_get_line() + 1));
-
 	String line = text_editor->get_line(text_editor->cursor_get_line());
 
 	int positional_column = 0;
-
 	for (int i = 0; i < text_editor->cursor_get_column(); i++) {
 		if (line[i] == '\t') {
 			positional_column += text_editor->get_indent_size(); //tab size
@@ -693,7 +690,14 @@ void CodeTextEditor::_line_col_changed() {
 		}
 	}
 
-	col_nb->set_text(itos(positional_column + 1));
+	StringBuilder *sb = memnew(StringBuilder);
+	sb->append("(");
+	sb->append(itos(text_editor->cursor_get_line() + 1).lpad(3));
+	sb->append(",");
+	sb->append(itos(positional_column + 1).lpad(3));
+	sb->append(")");
+
+	line_and_col_txt->set_text(sb->as_string());
 }
 
 void CodeTextEditor::_text_changed() {
@@ -747,8 +751,6 @@ bool CodeTextEditor::_add_font_size(int p_delta) {
 	if (font.is_valid()) {
 		int new_size = CLAMP(font->get_size() + p_delta, 8 * EDSCALE, 96 * EDSCALE);
 
-		font_size_nb->set_text(itos(new_size) + " (" + itos(100 * new_size / (14 * EDSCALE)) + "%)");
-
 		if (new_size != font->get_size()) {
 			EditorSettings::get_singleton()->set("interface/editor/code_font_size", new_size / EDSCALE);
 			font->set_size(new_size);
@@ -1167,7 +1169,6 @@ void CodeTextEditor::_on_settings_change() {
 	_update_font();
 
 	font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
-	font_size_nb->set_text(itos(font_size) + " (" + itos(100 * font_size / (14 * EDSCALE)) + "%)");
 
 	// AUTO BRACE COMPLETION
 	text_editor->set_auto_brace_completion(
@@ -1188,17 +1189,48 @@ void CodeTextEditor::_text_changed_idle_timeout() {
 	emit_signal("validate_script");
 }
 
-void CodeTextEditor::_notification(int p_what) {
+void CodeTextEditor::_warning_label_gui_input(const Ref<InputEvent> &p_event) {
+	Ref<InputEventMouseButton> mb = p_event;
+	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
+		_warning_button_pressed();
+	}
+}
 
-	if (p_what == EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED) {
-		_load_theme_settings();
-		emit_signal("load_theme_settings");
+void CodeTextEditor::_warning_button_pressed() {
+	emit_signal("warning_pressed");
+}
+
+void CodeTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
+	Ref<InputEventMouseButton> mb = p_event;
+	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
+		emit_signal("error_pressed");
 	}
-	if (p_what == NOTIFICATION_THEME_CHANGED) {
-		_update_font();
+}
+
+void CodeTextEditor::_notification(int p_what) {
+
+	switch (p_what) {
+		case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
+			_load_theme_settings();
+			emit_signal("load_theme_settings");
+		} break;
+		case NOTIFICATION_THEME_CHANGED: {
+			_update_font();
+		} break;
+		case NOTIFICATION_ENTER_TREE: {
+			warning_button->set_icon(get_icon("NodeWarning", "EditorIcons"));
+		} break;
+		default:
+			break;
 	}
 }
 
+void CodeTextEditor::set_warning_nb(int p_warning_nb) {
+	warning_count_label->set_text(itos(p_warning_nb));
+	warning_count_label->set_visible(p_warning_nb > 0);
+	warning_button->set_visible(p_warning_nb > 0);
+}
+
 void CodeTextEditor::_bind_methods() {
 
 	ClassDB::bind_method("_text_editor_gui_input", &CodeTextEditor::_text_editor_gui_input);
@@ -1209,9 +1241,14 @@ void CodeTextEditor::_bind_methods() {
 	ClassDB::bind_method("_code_complete_timer_timeout", &CodeTextEditor::_code_complete_timer_timeout);
 	ClassDB::bind_method("_complete_request", &CodeTextEditor::_complete_request);
 	ClassDB::bind_method("_font_resize_timeout", &CodeTextEditor::_font_resize_timeout);
+	ClassDB::bind_method("_error_pressed", &CodeTextEditor::_error_pressed);
+	ClassDB::bind_method("_warning_button_pressed", &CodeTextEditor::_warning_button_pressed);
+	ClassDB::bind_method("_warning_label_gui_input", &CodeTextEditor::_warning_label_gui_input);
 
 	ADD_SIGNAL(MethodInfo("validate_script"));
 	ADD_SIGNAL(MethodInfo("load_theme_settings"));
+	ADD_SIGNAL(MethodInfo("warning_pressed"));
+	ADD_SIGNAL(MethodInfo("error_pressed"));
 }
 
 void CodeTextEditor::set_code_complete_func(CodeTextEditorCodeCompleteFunc p_code_complete_func, void *p_ud) {
@@ -1258,95 +1295,50 @@ CodeTextEditor::CodeTextEditor() {
 	error_line = 0;
 	error_column = 0;
 
+	// Error
+	ScrollContainer *scroll = memnew(ScrollContainer);
+	scroll->set_h_size_flags(SIZE_EXPAND_FILL);
+	scroll->set_v_size_flags(SIZE_EXPAND_FILL);
+	scroll->set_enable_v_scroll(false);
+	status_bar->add_child(scroll);
+
 	error = memnew(Label);
-	status_bar->add_child(error);
-	error->set_autowrap(true);
-	error->set_valign(Label::VALIGN_CENTER);
-	error->set_h_size_flags(SIZE_EXPAND_FILL); //required for it to display, given now it's clipping contents, do not touch
+	scroll->add_child(error);
+	error->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
 	error->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("error_color", "Editor"));
 	error->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
 	error->set_mouse_filter(MOUSE_FILTER_STOP);
+	error->connect("gui_input", this, "_error_pressed");
 	find_replace_bar->connect("error", error, "set_text");
 
-	status_bar->add_child(memnew(Label)); //to keep the height if the other labels are not visible
-
-	warning_label = memnew(Label);
-	status_bar->add_child(warning_label);
-	warning_label->set_align(Label::ALIGN_RIGHT);
-	warning_label->set_valign(Label::VALIGN_CENTER);
-	warning_label->set_v_size_flags(SIZE_FILL);
-	warning_label->set_default_cursor_shape(CURSOR_POINTING_HAND);
-	warning_label->set_mouse_filter(MOUSE_FILTER_STOP);
-	warning_label->set_text(TTR("Warnings:"));
-	warning_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+	// Warnings
+	warning_button = memnew(ToolButton);
+	status_bar->add_child(warning_button);
+	warning_button->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
+	warning_button->set_default_cursor_shape(CURSOR_POINTING_HAND);
+	warning_button->connect("pressed", this, "_warning_button_pressed");
+	warning_button->set_tooltip(TTR("Warnings"));
 
 	warning_count_label = memnew(Label);
 	status_bar->add_child(warning_count_label);
-	warning_count_label->set_valign(Label::VALIGN_CENTER);
-	warning_count_label->set_v_size_flags(SIZE_FILL);
-	warning_count_label->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
-	warning_count_label->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
-	warning_count_label->set_custom_minimum_size(Size2(40, 1) * EDSCALE);
+	warning_count_label->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
 	warning_count_label->set_align(Label::ALIGN_RIGHT);
 	warning_count_label->set_default_cursor_shape(CURSOR_POINTING_HAND);
 	warning_count_label->set_mouse_filter(MOUSE_FILTER_STOP);
+	warning_count_label->set_tooltip(TTR("Warnings"));
+	warning_count_label->add_color_override("font_color", EditorNode::get_singleton()->get_gui_base()->get_color("warning_color", "Editor"));
 	warning_count_label->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-	warning_count_label->set_text("0");
-
-	Label *font_size_txt = memnew(Label);
-	status_bar->add_child(font_size_txt);
-	font_size_txt->set_align(Label::ALIGN_RIGHT);
-	font_size_txt->set_valign(Label::VALIGN_CENTER);
-	font_size_txt->set_v_size_flags(SIZE_FILL);
-	font_size_txt->set_text(TTR("Font Size:"));
-	font_size_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
-	font_size_nb = memnew(Label);
-	status_bar->add_child(font_size_nb);
-	font_size_nb->set_valign(Label::VALIGN_CENTER);
-	font_size_nb->set_v_size_flags(SIZE_FILL);
-	font_size_nb->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
-	font_size_nb->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
-	font_size_nb->set_custom_minimum_size(Size2(100, 1) * EDSCALE);
-	font_size_nb->set_align(Label::ALIGN_RIGHT);
-	font_size_nb->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
-	Label *line_txt = memnew(Label);
-	status_bar->add_child(line_txt);
-	line_txt->set_align(Label::ALIGN_RIGHT);
-	line_txt->set_valign(Label::VALIGN_CENTER);
-	line_txt->set_v_size_flags(SIZE_FILL);
-	line_txt->set_text(TTR("Line:"));
-	line_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
-	line_nb = memnew(Label);
-	status_bar->add_child(line_nb);
-	line_nb->set_valign(Label::VALIGN_CENTER);
-	line_nb->set_v_size_flags(SIZE_FILL);
-	line_nb->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
-	line_nb->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
-	line_nb->set_custom_minimum_size(Size2(40, 1) * EDSCALE);
-	line_nb->set_align(Label::ALIGN_RIGHT);
-	line_nb->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
-	Label *col_txt = memnew(Label);
-	status_bar->add_child(col_txt);
-	col_txt->set_align(Label::ALIGN_RIGHT);
-	col_txt->set_valign(Label::VALIGN_CENTER);
-	col_txt->set_v_size_flags(SIZE_FILL);
-	col_txt->set_text(TTR("Col:"));
-	col_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
-
-	col_nb = memnew(Label);
-	status_bar->add_child(col_nb);
-	col_nb->set_valign(Label::VALIGN_CENTER);
-	col_nb->set_v_size_flags(SIZE_FILL);
-	col_nb->set_autowrap(true); // workaround to prevent resizing the label on each change, do not touch
-	col_nb->set_clip_text(true); // workaround to prevent resizing the label on each change, do not touch
-	col_nb->set_custom_minimum_size(Size2(40, 1) * EDSCALE);
-	col_nb->set_align(Label::ALIGN_RIGHT);
-	col_nb->set("custom_constants/margin_right", 0);
-	col_nb->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+	warning_count_label->connect("gui_input", this, "_warning_label_gui_input");
+
+	set_warning_nb(0);
+
+	// Line and column
+	line_and_col_txt = memnew(Label);
+	status_bar->add_child(line_and_col_txt);
+	line_and_col_txt->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER);
+	line_and_col_txt->add_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_font("status_source", "EditorFonts"));
+	line_and_col_txt->set_tooltip(TTR("Line and column numbers"));
+	line_and_col_txt->set_mouse_filter(MOUSE_FILTER_STOP);
 
 	text_editor->connect("gui_input", this, "_text_editor_gui_input");
 	text_editor->connect("cursor_changed", this, "_line_col_changed");
@@ -1365,7 +1357,6 @@ CodeTextEditor::CodeTextEditor() {
 
 	font_resize_val = 0;
 	font_size = EditorSettings::get_singleton()->get("interface/editor/code_font_size");
-	font_size_nb->set_text(itos(font_size) + " (" + itos(100 * font_size / (14 * EDSCALE)) + "%)");
 	font_resize_timer = memnew(Timer);
 	add_child(font_resize_timer);
 	font_resize_timer->set_one_shot(true);

+ 10 - 7
editor/code_editor.h

@@ -142,12 +142,12 @@ class CodeTextEditor : public VBoxContainer {
 	TextEdit *text_editor;
 	FindReplaceBar *find_replace_bar;
 	HBoxContainer *status_bar;
-	Label *warning_label;
+
+	ToolButton *warning_button;
 	Label *warning_count_label;
 
-	Label *line_nb;
-	Label *col_nb;
-	Label *font_size_nb;
+	Label *line_and_col_txt;
+
 	Label *info;
 	Timer *idle;
 	Timer *code_complete_timer;
@@ -176,6 +176,10 @@ class CodeTextEditor : public VBoxContainer {
 	CodeTextEditorCodeCompleteFunc code_complete_func;
 	void *code_complete_ud;
 
+	void _warning_label_gui_input(const Ref<InputEvent> &p_event);
+	void _warning_button_pressed();
+	void _error_pressed(const Ref<InputEvent> &p_event);
+
 protected:
 	virtual void _load_theme_settings() {}
 	virtual void _validate_script() {}
@@ -212,15 +216,14 @@ public:
 	Variant get_edit_state();
 	void set_edit_state(const Variant &p_state);
 
+	void set_warning_nb(int p_warning_nb);
+
 	void update_editor_settings();
 	void set_error(const String &p_error);
 	void set_error_pos(int p_line, int p_column);
 	void update_line_and_column() { _line_col_changed(); }
 	TextEdit *get_text_edit() { return text_editor; }
 	FindReplaceBar *get_find_replace_bar() { return find_replace_bar; }
-	Label *get_error_label() const { return error; }
-	Label *get_warning_label() const { return warning_label; }
-	Label *get_warning_count_label() const { return warning_count_label; }
 	virtual void apply_code() {}
 	void goto_error();
 

+ 8 - 15
editor/plugins/script_text_editor.cpp

@@ -273,18 +273,12 @@ void ScriptTextEditor::_set_theme_for_script() {
 	}
 }
 
-void ScriptTextEditor::_toggle_warning_pannel(const Ref<InputEvent> &p_event) {
-	Ref<InputEventMouseButton> mb = p_event;
-	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-		warnings_panel->set_visible(!warnings_panel->is_visible());
-	}
+void ScriptTextEditor::_toggle_warning_pannel() {
+	warnings_panel->set_visible(!warnings_panel->is_visible());
 }
 
-void ScriptTextEditor::_error_pressed(const Ref<InputEvent> &p_event) {
-	Ref<InputEventMouseButton> mb = p_event;
-	if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == BUTTON_LEFT) {
-		code_editor->goto_error();
-	}
+void ScriptTextEditor::_error_pressed() {
+	code_editor->goto_error();
 }
 
 void ScriptTextEditor::_warning_clicked(Variant p_line) {
@@ -468,7 +462,7 @@ void ScriptTextEditor::_validate_script() {
 		}
 	}
 
-	code_editor->get_warning_count_label()->set_text(itos(warnings.size()));
+	code_editor->set_warning_nb(warnings.size());
 	warnings_panel->clear();
 	warnings_panel->push_table(3);
 	for (List<ScriptLanguage::Warning>::Element *E = warnings.front(); E; E = E->next()) {
@@ -1427,7 +1421,7 @@ ScriptTextEditor::ScriptTextEditor() {
 
 	code_editor = memnew(CodeTextEditor);
 	editor_box->add_child(code_editor);
-	code_editor->add_constant_override("separation", 0);
+	code_editor->add_constant_override("separation", 2);
 	code_editor->set_anchors_and_margins_preset(Control::PRESET_WIDE);
 	code_editor->connect("validate_script", this, "_validate_script");
 	code_editor->connect("load_theme_settings", this, "_load_theme_settings");
@@ -1445,9 +1439,8 @@ ScriptTextEditor::ScriptTextEditor() {
 	warnings_panel->set_focus_mode(FOCUS_CLICK);
 	warnings_panel->hide();
 
-	code_editor->get_error_label()->connect("gui_input", this, "_error_pressed");
-	code_editor->get_warning_label()->connect("gui_input", this, "_toggle_warning_pannel");
-	code_editor->get_warning_count_label()->connect("gui_input", this, "_toggle_warning_pannel");
+	code_editor->connect("error_pressed", this, "_error_pressed");
+	code_editor->connect("warning_pressed", this, "_toggle_warning_pannel");
 	warnings_panel->connect("meta_clicked", this, "_warning_clicked");
 
 	update_settings();

+ 2 - 2
editor/plugins/script_text_editor.h

@@ -125,8 +125,8 @@ protected:
 	void _code_complete_script(const String &p_code, List<String> *r_options, bool &r_force);
 	void _load_theme_settings();
 	void _set_theme_for_script();
-	void _toggle_warning_pannel(const Ref<InputEvent> &p_event);
-	void _error_pressed(const Ref<InputEvent> &p_event);
+	void _toggle_warning_pannel();
+	void _error_pressed();
 	void _warning_clicked(Variant p_line);
 
 	void _notification(int p_what);