A few small Debugger->Errors tab enhancements:

1. Added "Clear" button to clear list.
2. Errors list now populated with newest items comes first, so no need to scroll everytime.
3. Added PopupMenu to errors list with ability to quickly Copy error text & details.
This commit is contained in:
Dmitry Koteroff 2017-12-18 01:16:11 +03:00
parent 90d95c7ee1
commit ea14b0789b
4 changed files with 89 additions and 1 deletions

View file

@ -1686,6 +1686,45 @@ void ScriptEditorDebugger::_clear_remote_objects() {
remote_objects.clear();
}
void ScriptEditorDebugger::_clear_errors_list() {
error_list->clear();
error_count = 0;
_notification(NOTIFICATION_PROCESS);
}
// Right click on specific file(s) or folder(s).
void ScriptEditorDebugger::_error_list_item_rmb_selected(int p_item, const Vector2 &p_pos) {
item_menu->clear();
item_menu->set_size(Size2(1, 1));
// Allow specific actions only on one item.
bool single_item_selected = error_list->get_selected_items().size() == 1;
if (single_item_selected) {
item_menu->add_icon_item(get_icon("CopyNodePath", "EditorIcons"), TTR("Copy Error"), ITEM_MENU_COPY_ERROR);
}
if (item_menu->get_item_count() > 0) {
item_menu->set_position(error_list->get_global_position() + p_pos);
item_menu->popup();
}
}
void ScriptEditorDebugger::_item_menu_id_pressed(int p_option) {
switch (p_option) {
case ITEM_MENU_COPY_ERROR: {
String title = error_list->get_item_text(error_list->get_current());
String desc = error_list->get_item_tooltip(error_list->get_current());
OS::get_singleton()->set_clipboard(title + "\n----------\n" + desc);
} break;
}
}
void ScriptEditorDebugger::_bind_methods() {
ClassDB::bind_method(D_METHOD("_stack_dump_frame_selected"), &ScriptEditorDebugger::_stack_dump_frame_selected);
@ -1705,6 +1744,10 @@ void ScriptEditorDebugger::_bind_methods() {
ClassDB::bind_method(D_METHOD("_error_stack_selected"), &ScriptEditorDebugger::_error_stack_selected);
ClassDB::bind_method(D_METHOD("_profiler_activate"), &ScriptEditorDebugger::_profiler_activate);
ClassDB::bind_method(D_METHOD("_profiler_seeked"), &ScriptEditorDebugger::_profiler_seeked);
ClassDB::bind_method(D_METHOD("_clear_errors_list"), &ScriptEditorDebugger::_clear_errors_list);
ClassDB::bind_method(D_METHOD("_error_list_item_rmb_selected"), &ScriptEditorDebugger::_error_list_item_rmb_selected);
ClassDB::bind_method(D_METHOD("_item_menu_id_pressed"), &ScriptEditorDebugger::_item_menu_id_pressed);
ClassDB::bind_method(D_METHOD("_paused"), &ScriptEditorDebugger::_paused);
@ -1829,9 +1872,31 @@ ScriptEditorDebugger::ScriptEditorDebugger(EditorNode *p_editor) {
error_split = memnew(HSplitContainer);
VBoxContainer *errvb = memnew(VBoxContainer);
HBoxContainer *errhb = memnew(HBoxContainer);
errvb->set_h_size_flags(SIZE_EXPAND_FILL);
Label *velb = memnew(Label(TTR("Errors:")));
velb->set_h_size_flags(SIZE_EXPAND_FILL);
errhb->add_child(velb);
clearbutton = memnew(Button);
clearbutton->set_text(TTR("Clear"));
clearbutton->connect("pressed", this, "_clear_errors_list");
errhb->add_child(clearbutton);
errvb->add_child(errhb);
error_list = memnew(ItemList);
errvb->add_margin_child(TTR("Errors:"), error_list, true);
error_list->set_v_size_flags(SIZE_EXPAND_FILL);
error_list->set_h_size_flags(SIZE_EXPAND_FILL);
error_list->connect("item_rmb_selected", this, "_error_list_item_rmb_selected");
error_list->set_allow_rmb_select(true);
error_list->set_autoscroll_to_bottom(true);
item_menu = memnew(PopupMenu);
item_menu->connect("id_pressed", this, "_item_menu_id_pressed");
error_list->add_child(item_menu);
errvb->add_child(error_list);
error_split->add_child(errvb);
errvb = memnew(VBoxContainer);

View file

@ -62,6 +62,10 @@ class ScriptEditorDebugger : public Control {
MESSAGE_SUCCESS,
};
enum ItemMenu {
ITEM_MENU_COPY_ERROR,
};
AcceptDialog *msgdialog;
Button *debugger_button;
@ -85,6 +89,8 @@ class ScriptEditorDebugger : public Control {
ItemList *error_list;
ItemList *error_stack;
Tree *inspect_scene_tree;
Button *clearbutton;
PopupMenu *item_menu;
int error_count;
int last_error_count;
@ -175,6 +181,10 @@ class ScriptEditorDebugger : public Control {
void _set_remote_object(ObjectID p_id, ScriptEditorDebuggerInspectedObject *p_obj);
void _clear_remote_objects();
void _clear_errors_list();
void _error_list_item_rmb_selected(int p_item, const Vector2 &p_pos);
void _item_menu_id_pressed(int p_option);
protected:
void _notification(int p_what);

View file

@ -930,6 +930,9 @@ void ItemList::_notification(int p_what) {
scroll_bar->hide();
} else {
scroll_bar->show();
if (do_autoscroll_to_bottom)
scroll_bar->set_value(max);
}
break;
}
@ -1313,6 +1316,11 @@ Size2 ItemList::get_minimum_size() const {
return Size2();
}
void ItemList::set_autoscroll_to_bottom(const bool p_enable) {
do_autoscroll_to_bottom = p_enable;
}
void ItemList::set_auto_height(bool p_enable) {
auto_height = p_enable;
@ -1466,6 +1474,7 @@ ItemList::ItemList() {
ensure_selected_visible = false;
defer_select_single = -1;
allow_rmb_select = false;
do_autoscroll_to_bottom = false;
icon_scale = 1.0f;
set_clip_contents(true);

View file

@ -107,6 +107,8 @@ private:
real_t icon_scale;
bool do_autoscroll_to_bottom;
Array _get_items() const;
void _set_items(const Array &p_items);
@ -212,6 +214,8 @@ public:
Size2 get_minimum_size() const;
void set_autoscroll_to_bottom(const bool p_enable);
VScrollBar *get_v_scroll() { return scroll_bar; }
ItemList();