-Merged Script and Help tabs

-Help tabs can be opened many at the same time
-Color temperatures for opened scripts
-Dominant script opening when switching scene tab
This commit is contained in:
Juan Linietsky 2015-11-17 09:46:08 -03:00
parent 8420c24f7f
commit 081a236c67
14 changed files with 1362 additions and 796 deletions

View File

@ -244,6 +244,8 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
int stateflag = 0; int stateflag = 0;
int audio_track_skip=audio_track; int audio_track_skip=audio_track;
while(!stateflag){ while(!stateflag){
int ret=buffer_data(); int ret=buffer_data();
if(ret==0)break; if(ret==0)break;
@ -273,6 +275,10 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
if (audio_track_skip) { if (audio_track_skip) {
vorbis_info_clear(&vi); vorbis_info_clear(&vi);
vorbis_comment_clear(&vc); vorbis_comment_clear(&vc);
ogg_stream_clear(&test);
vorbis_info_init(&vi);
vorbis_comment_init(&vc);
audio_track_skip--; audio_track_skip--;
} else { } else {
copymem(&vo,&test,sizeof(test)); copymem(&vo,&test,sizeof(test));

View File

@ -235,6 +235,37 @@ int ItemList::get_current() const {
return current; return current;
} }
void ItemList::move_item(int p_item,int p_to_pos) {
ERR_FAIL_INDEX(p_item,items.size());
ERR_FAIL_INDEX(p_to_pos,items.size()+1);
Item it=items[p_item];
items.remove(p_item);;
if (p_to_pos>p_item) {
p_to_pos--;
}
if (p_to_pos>=items.size()) {
items.push_back(it);
} else {
items.insert(p_to_pos,it);
}
if (current<0) {
//do none
} if (p_item==current) {
current=p_to_pos;
} else if (p_to_pos>p_item && current>p_item && current<p_to_pos) {
current--;
} else if (p_to_pos<p_item && current<p_item && current>p_to_pos) {
current++;
}
update();
}
int ItemList::get_item_count() const{ int ItemList::get_item_count() const{

View File

@ -101,6 +101,7 @@ public:
void set_current(int p_current); void set_current(int p_current);
int get_current() const; int get_current() const;
void move_item(int p_item,int p_to_pos);
int get_item_count() const; int get_item_count() const;
void remove_item(int p_idx); void remove_item(int p_idx);

View File

@ -54,6 +54,8 @@ void MenuButton::_unhandled_key_input(InputEvent p_event) {
int item = popup->find_item_by_accelerator(code); int item = popup->find_item_by_accelerator(code);
if (item>=0 && ! popup->is_item_disabled(item)) if (item>=0 && ! popup->is_item_disabled(item))
popup->activate_item(item); popup->activate_item(item);
/* /*

View File

@ -719,7 +719,7 @@ void RichTextLabel::_input_event(InputEvent p_event) {
case InputEvent::KEY: { case InputEvent::KEY: {
const InputEventKey &k=p_event.key; const InputEventKey &k=p_event.key;
if (k.pressed) { if (k.pressed && !k.mod.alt && !k.mod.shift && !k.mod.command && !k.mod.meta) {
bool handled=true; bool handled=true;
switch(k.scancode) { switch(k.scancode) {
case KEY_PAGEUP: { case KEY_PAGEUP: {
@ -765,6 +765,7 @@ void RichTextLabel::_input_event(InputEvent p_event) {
default: handled=false; default: handled=false;
} }
if (handled) if (handled)
accept_event(); accept_event();
} }

View File

@ -384,12 +384,12 @@ void VideoPlayer::_bind_methods() {
ObjectTypeDB::bind_method(_MD("set_buffering_msec","msec"),&VideoPlayer::set_buffering_msec); ObjectTypeDB::bind_method(_MD("set_buffering_msec","msec"),&VideoPlayer::set_buffering_msec);
ObjectTypeDB::bind_method(_MD("get_buffering_msec"),&VideoPlayer::get_buffering_msec); ObjectTypeDB::bind_method(_MD("get_buffering_msec"),&VideoPlayer::get_buffering_msec);
ADD_PROPERTY( PropertyInfo(Variant::INT, "stream/audio_track",PROPERTY_HINT_RANGE,"0,128,1"), _SCS("set_audio_track"), _SCS("get_audio_track") );
ADD_PROPERTY( PropertyInfo(Variant::OBJECT, "stream/stream", PROPERTY_HINT_RESOURCE_TYPE,"VideoStream"), _SCS("set_stream"), _SCS("get_stream") ); ADD_PROPERTY( PropertyInfo(Variant::OBJECT, "stream/stream", PROPERTY_HINT_RESOURCE_TYPE,"VideoStream"), _SCS("set_stream"), _SCS("get_stream") );
// ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/loop"), _SCS("set_loop"), _SCS("has_loop") ); // ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/loop"), _SCS("set_loop"), _SCS("has_loop") );
ADD_PROPERTY( PropertyInfo(Variant::REAL, "stream/volume_db", PROPERTY_HINT_RANGE,"-80,24,0.01"), _SCS("set_volume_db"), _SCS("get_volume_db") ); ADD_PROPERTY( PropertyInfo(Variant::REAL, "stream/volume_db", PROPERTY_HINT_RANGE,"-80,24,0.01"), _SCS("set_volume_db"), _SCS("get_volume_db") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/autoplay"), _SCS("set_autoplay"), _SCS("has_autoplay") ); ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/autoplay"), _SCS("set_autoplay"), _SCS("has_autoplay") );
ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/paused"), _SCS("set_paused"), _SCS("is_paused") ); ADD_PROPERTY( PropertyInfo(Variant::BOOL, "stream/paused"), _SCS("set_paused"), _SCS("is_paused") );
ADD_PROPERTY( PropertyInfo(Variant::INT, "stream/audio_track",PROPERTY_HINT_RANGE,"0,128,1"), _SCS("set_audio_track"), _SCS("get_audio_track") );
ADD_PROPERTY( PropertyInfo( Variant::BOOL, "expand" ), _SCS("set_expand"),_SCS("has_expand") ); ADD_PROPERTY( PropertyInfo( Variant::BOOL, "expand" ), _SCS("set_expand"),_SCS("has_expand") );
} }

View File

@ -188,6 +188,7 @@ void make_default_theme() {
// Font Colors // Font Colors
Color control_font_color = Color::html("e0e0e0"); Color control_font_color = Color::html("e0e0e0");
Color control_font_color_lower = Color::html("a0a0a0");
Color control_font_color_low = Color::html("b0b0b0"); Color control_font_color_low = Color::html("b0b0b0");
Color control_font_color_hover = Color::html("f0f0f0"); Color control_font_color_hover = Color::html("f0f0f0");
Color control_font_color_disabled = Color(0.9,0.9,0.9,0.2); Color control_font_color_disabled = Color(0.9,0.9,0.9,0.2);
@ -273,7 +274,7 @@ void make_default_theme() {
t->set_color("font_color_hover","ToolButton", control_font_color_hover ); t->set_color("font_color_hover","ToolButton", control_font_color_hover );
t->set_color("font_color_disabled","ToolButton", Color(0.9,0.95,1,0.3) ); t->set_color("font_color_disabled","ToolButton", Color(0.9,0.95,1,0.3) );
t->set_constant("hseparation","ToolButton", 0 ); t->set_constant("hseparation","ToolButton", 3 );
@ -649,7 +650,7 @@ void make_default_theme() {
t->set_constant("icon_margin","ItemList",4); t->set_constant("icon_margin","ItemList",4);
t->set_constant("line_separation","ItemList",2); t->set_constant("line_separation","ItemList",2);
t->set_font("font","ItemList", default_font ); t->set_font("font","ItemList", default_font );
t->set_color("font_color","ItemList", control_font_color_low ); t->set_color("font_color","ItemList", control_font_color_lower );
t->set_color("font_color_selected","ItemList", control_font_color_pressed ); t->set_color("font_color_selected","ItemList", control_font_color_pressed );
t->set_color("guide_color","ItemList", Color(0,0,0,0.1) ); t->set_color("guide_color","ItemList", Color(0,0,0,0.1) );
t->set_stylebox("selected","ItemList", item_selected_oof ); t->set_stylebox("selected","ItemList", item_selected_oof );

View File

@ -618,7 +618,7 @@ CodeTextEditor::CodeTextEditor() {
line_col = memnew( Label ); line_col = memnew( Label );
add_child(line_col); add_child(line_col);
line_col->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,135); line_col->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_END,135);
line_col->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,20); line_col->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,15);
line_col->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,1); line_col->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,1);
line_col->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5); line_col->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,5);
//line_col->set_align(Label::ALIGN_RIGHT); //line_col->set_align(Label::ALIGN_RIGHT);
@ -637,7 +637,7 @@ CodeTextEditor::CodeTextEditor() {
error = memnew( Label ); error = memnew( Label );
add_child(error); add_child(error);
error->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5); error->set_anchor_and_margin(MARGIN_LEFT,ANCHOR_BEGIN,5);
error->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,20); error->set_anchor_and_margin(MARGIN_TOP,ANCHOR_END,15);
error->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,1); error->set_anchor_and_margin(MARGIN_BOTTOM,ANCHOR_END,1);
error->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,130); error->set_anchor_and_margin(MARGIN_RIGHT,ANCHOR_END,130);
error->hide(); error->hide();

View File

@ -300,9 +300,9 @@ void EditorHelpSearch::_bind_methods() {
} }
EditorHelpSearch::EditorHelpSearch(EditorNode *p_editor) { EditorHelpSearch::EditorHelpSearch() {
editor=p_editor; editor=EditorNode::get_singleton();
VBoxContainer *vbc = memnew( VBoxContainer ); VBoxContainer *vbc = memnew( VBoxContainer );
add_child(vbc); add_child(vbc);
set_child_rect(vbc); set_child_rect(vbc);
@ -318,17 +318,138 @@ EditorHelpSearch::EditorHelpSearch(EditorNode *p_editor) {
search_box->connect("input_event",this,"_sbox_input"); search_box->connect("input_event",this,"_sbox_input");
search_options = memnew( Tree ); search_options = memnew( Tree );
vbc->add_margin_child("Matches:",search_options,true); vbc->add_margin_child("Matches:",search_options,true);
get_ok()->set_text("View"); get_ok()->set_text("Open");
get_ok()->set_disabled(true); get_ok()->set_disabled(true);
register_text_enter(search_box); register_text_enter(search_box);
set_hide_on_ok(false); set_hide_on_ok(false);
search_options->connect("item_activated",this,"_confirmed"); search_options->connect("item_activated",this,"_confirmed");
set_title("Search Classes"); set_title("Search Classes");
// search_options->set_hide_root(true); // search_options->set_hide_root(true);
} }
/////////////////////////////////
////////////////////////////////////
/// /////////////////////////////////
void EditorHelpIndex::add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root) {
if (p_types.has(p_type))
return;
// if (!ObjectTypeDB::is_type(p_type,base) || p_type==base)
// return;
String inherits=EditorHelp::get_doc_data()->class_list[p_type].inherits;
TreeItem *parent=p_root;
if (inherits.length()) {
if (!p_types.has(inherits)) {
add_type(inherits,p_types,p_root);
}
if (p_types.has(inherits) )
parent=p_types[inherits];
}
TreeItem *item = class_list->create_item(parent);
item->set_metadata(0,p_type);
item->set_tooltip(0,EditorHelp::get_doc_data()->class_list[p_type].brief_description);
item->set_text(0,p_type);
if (has_icon(p_type,"EditorIcons")) {
item->set_icon(0, get_icon(p_type,"EditorIcons"));
}
p_types[p_type]=item;
}
void EditorHelpIndex::_tree_item_selected() {
TreeItem *s=class_list->get_selected();
if (!s)
return;
emit_signal("open_class",s->get_text(0));
hide();
//_goto_desc(s->get_text(0));
}
void EditorHelpIndex::select_class(const String& p_class) {
if (!tree_item_map.has(p_class))
return;
tree_item_map[p_class]->select(0);
class_list->ensure_cursor_is_visible();
}
void EditorHelpIndex::_notification(int p_what) {
if (p_what==NOTIFICATION_ENTER_TREE) {
class_list->clear();
tree_item_map.clear();
TreeItem *root = class_list->create_item();
class_list->set_hide_root(true);
connect("confirmed",this,"_tree_item_selected");
for(Map<String,DocData::ClassDoc>::Element *E=EditorHelp::get_doc_data()->class_list.front();E;E=E->next()) {
add_type(E->key(),tree_item_map,root);
}
}
}
void EditorHelpIndex::_bind_methods() {
ObjectTypeDB::bind_method("_tree_item_selected",&EditorHelpIndex::_tree_item_selected);
ObjectTypeDB::bind_method("select_class",&EditorHelpIndex::select_class);
ADD_SIGNAL( MethodInfo("open_class"));
}
EditorHelpIndex::EditorHelpIndex() {
VBoxContainer *vbc = memnew( VBoxContainer );
add_child(vbc);
set_child_rect(vbc);
class_list = memnew( Tree );
vbc->add_margin_child("Class List: ",class_list,true);
class_list->set_v_size_flags(SIZE_EXPAND_FILL);
class_list->connect("item_activated",this,"_tree_item_selected");
get_ok()->set_text("Open");
}
/////////////////////////////////
////////////////////////////////////
/// /////////////////////////////////
DocData *EditorHelp::doc=NULL; DocData *EditorHelp::doc=NULL;
void EditorHelp::_unhandled_key_input(const InputEvent& p_ev) { void EditorHelp::_unhandled_key_input(const InputEvent& p_ev) {
@ -339,8 +460,6 @@ void EditorHelp::_unhandled_key_input(const InputEvent& p_ev) {
search->grab_focus(); search->grab_focus();
search->select_all(); search->select_all();
} else if (p_ev.key.mod.shift && p_ev.key.scancode==KEY_F1) {
class_search->popup();
} }
} }
@ -351,17 +470,19 @@ void EditorHelp::_search(const String&) {
String stext=search->get_text(); String stext=search->get_text();
bool keep = prev_search==stext && class_list->get_selected() && prev_search_page==class_list->get_selected()->get_text(0); bool keep = prev_search==stext;
class_desc->search(stext, keep); bool ret = class_desc->search(stext, keep);
if (!ret) {
class_desc->search(stext, false);
}
prev_search=stext; prev_search=stext;
if (class_list->get_selected())
prev_search_page=class_list->get_selected()->get_text(0);
} }
#if 0
void EditorHelp::_button_pressed(int p_idx) { void EditorHelp::_button_pressed(int p_idx) {
if (p_idx==PAGE_CLASS_LIST) { if (p_idx==PAGE_CLASS_LIST) {
@ -399,16 +520,11 @@ void EditorHelp::_button_pressed(int p_idx) {
} else if (p_idx==PAGE_SEARCH) { } else if (p_idx==PAGE_SEARCH) {
_search(""); _search("");
} else if (p_idx==CLASS_SEARCH) {
class_search->popup();
} }
} }
#endif
void EditorHelp::_class_list_select(const String& p_select) { void EditorHelp::_class_list_select(const String& p_select) {
@ -417,16 +533,28 @@ void EditorHelp::_class_list_select(const String& p_select) {
void EditorHelp::_class_desc_select(const String& p_select) { void EditorHelp::_class_desc_select(const String& p_select) {
// print_line("LINK: "+p_select);
if (p_select.begins_with("#")) { if (p_select.begins_with("#")) {
_goto_desc(p_select.substr(1,p_select.length())); //_goto_desc(p_select.substr(1,p_select.length()));
emit_signal("go_to_help","class_name:"+p_select.substr(1,p_select.length()));
return; return;
} else if (p_select.begins_with("@")) { } else if (p_select.begins_with("@")) {
String m = p_select.substr(1,p_select.length()); String m = p_select.substr(1,p_select.length());
if (m.find(".")!=-1) {
//must go somewhere else
emit_signal("go_to_help","class_method:"+m.get_slice(".",0)+":"+m.get_slice(".",0));
} else {
if (!method_line.has(m)) if (!method_line.has(m))
return; return;
class_desc->scroll_to_line(method_line[m]); class_desc->scroll_to_line(method_line[m]);
return; }
} }
@ -449,68 +577,40 @@ void EditorHelp::_add_type(const String& p_type) {
} }
void EditorHelp::_update_history_buttons() {
back->set_disabled(history_pos<2);
forward->set_disabled(history_pos>=history.size());
}
void EditorHelp::_scroll_changed(double p_scroll) { void EditorHelp::_scroll_changed(double p_scroll) {
if (scroll_locked) if (scroll_locked)
return; return;
int p = history_pos -1;
if (p<0 || p>=history.size())
return;
if (class_desc->get_v_scroll()->is_hidden()) if (class_desc->get_v_scroll()->is_hidden())
p_scroll=0; p_scroll=0;
history[p].scroll=p_scroll; //history[p].scroll=p_scroll;
} }
Error EditorHelp::_goto_desc(const String& p_class,bool p_update_history,int p_vscr) { Error EditorHelp::_goto_desc(const String& p_class,int p_vscr) {
//ERR_FAIL_COND(!doc->class_list.has(p_class)); //ERR_FAIL_COND(!doc->class_list.has(p_class));
if (!doc->class_list.has(p_class)) if (!doc->class_list.has(p_class))
return ERR_DOES_NOT_EXIST; return ERR_DOES_NOT_EXIST;
if (tree_item_map.has(p_class)) { //if (tree_item_map.has(p_class)) {
select_locked = true; select_locked = true;
tree_item_map[p_class]->select(0); //}
class_list->ensure_cursor_is_visible();
}
class_desc->show(); class_desc->show();
//tabs->set_current_tab(PAGE_CLASS_DESC); //tabs->set_current_tab(PAGE_CLASS_DESC);
edited_class->set_pressed(true);
class_list_button->set_pressed(false);
description_line=0; description_line=0;
if (p_class==edited_class->get_text()) if (p_class==edited_class)
return OK; //already there return OK; //already there
scroll_locked=true; scroll_locked=true;
if (p_update_history) {
history.resize(history_pos);
history_pos++;
History h;
h.c=p_class;
h.scroll=0;
history.push_back(h);
_update_history_buttons();
class_desc->get_v_scroll()->set_val(0);
}
class_desc->clear(); class_desc->clear();
method_line.clear(); method_line.clear();
edited_class->set_text(p_class); edited_class=p_class;
//edited_class->show(); //edited_class->show();
@ -925,10 +1025,7 @@ Error EditorHelp::_goto_desc(const String& p_class,bool p_update_history,int p_v
} }
if (!p_update_history) {
class_desc->get_v_scroll()->set_val(history[history_pos-1].scroll);
}
scroll_locked=false; scroll_locked=false;
@ -939,8 +1036,6 @@ void EditorHelp::_request_help(const String& p_string) {
Error err = _goto_desc(p_string); Error err = _goto_desc(p_string);
if (err==OK) { if (err==OK) {
editor->call("_editor_select",3); editor->call("_editor_select",3);
} else {
class_search->popup(p_string);
} }
//100 palabras //100 palabras
} }
@ -1209,63 +1304,11 @@ void EditorHelp::_add_text(const String& p_bbcode) {
} }
void EditorHelp::add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root) {
if (p_types.has(p_type))
return;
// if (!ObjectTypeDB::is_type(p_type,base) || p_type==base)
// return;
String inherits=doc->class_list[p_type].inherits;
TreeItem *parent=p_root;
if (inherits.length()) {
if (!p_types.has(inherits)) {
add_type(inherits,p_types,p_root);
}
if (p_types.has(inherits) )
parent=p_types[inherits];
}
TreeItem *item = class_list->create_item(parent);
item->set_metadata(0,p_type);
item->set_tooltip(0,doc->class_list[p_type].brief_description);
item->set_text(0,p_type);
if (has_icon(p_type,"EditorIcons")) {
item->set_icon(0, get_icon(p_type,"EditorIcons"));
}
p_types[p_type]=item;
}
void EditorHelp::_update_doc() { void EditorHelp::_update_doc() {
class_list->clear();
List<StringName> type_list;
tree_item_map.clear();
TreeItem *root = class_list->create_item();
class_list->set_hide_root(true);
List<StringName>::Element *I=type_list.front();
for(Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
add_type(E->key(),tree_item_map,root);
}
} }
@ -1289,8 +1332,8 @@ void EditorHelp::_notification(int p_what) {
case NOTIFICATION_READY: { case NOTIFICATION_READY: {
forward->set_icon(get_icon("Forward","EditorIcons")); // forward->set_icon(get_icon("Forward","EditorIcons"));
back->set_icon(get_icon("Back","EditorIcons")); // back->set_icon(get_icon("Back","EditorIcons"));
_update_doc(); _update_doc();
editor->connect("request_help",this,"_request_help"); editor->connect("request_help",this,"_request_help");
@ -1298,226 +1341,121 @@ void EditorHelp::_notification(int p_what) {
} }
} }
void EditorHelp::_tree_item_selected() {
if (select_locked) {
select_locked = false;
return; void EditorHelp::go_to_help(const String& p_help) {
}
TreeItem *s=class_list->get_selected(); _help_callback(p_help);
if (!s) }
return;
select_locked=true; void EditorHelp::go_to_class(const String& p_class,int p_scroll) {
_goto_desc(s->get_text(0));
select_locked=false; _goto_desc(p_class,p_scroll);
}
void EditorHelp::popup_search() {
search_dialog->popup_centered(Size2(250,80));
search->grab_focus();
}
void EditorHelp::_search_cbk() {
_search(search->get_text());
}
String EditorHelp::get_class_name() {
return edited_class;
}
void EditorHelp::search_again() {
_search(prev_search);
}
int EditorHelp::get_scroll() const {
return class_desc->get_v_scroll()->get_val();
}
void EditorHelp::set_scroll(int p_scroll) {
class_desc->get_v_scroll()->set_val(p_scroll);
} }
void EditorHelp::_bind_methods() { void EditorHelp::_bind_methods() {
ObjectTypeDB::bind_method("_class_list_select",&EditorHelp::_class_list_select); ObjectTypeDB::bind_method("_class_list_select",&EditorHelp::_class_list_select);
ObjectTypeDB::bind_method("_class_desc_select",&EditorHelp::_class_desc_select); ObjectTypeDB::bind_method("_class_desc_select",&EditorHelp::_class_desc_select);
ObjectTypeDB::bind_method("_button_pressed",&EditorHelp::_button_pressed); // ObjectTypeDB::bind_method("_button_pressed",&EditorHelp::_button_pressed);
ObjectTypeDB::bind_method("_scroll_changed",&EditorHelp::_scroll_changed); ObjectTypeDB::bind_method("_scroll_changed",&EditorHelp::_scroll_changed);
ObjectTypeDB::bind_method("_request_help",&EditorHelp::_request_help); ObjectTypeDB::bind_method("_request_help",&EditorHelp::_request_help);
ObjectTypeDB::bind_method("_unhandled_key_input",&EditorHelp::_unhandled_key_input); ObjectTypeDB::bind_method("_unhandled_key_input",&EditorHelp::_unhandled_key_input);
ObjectTypeDB::bind_method("_search",&EditorHelp::_search); ObjectTypeDB::bind_method("_search",&EditorHelp::_search);
ObjectTypeDB::bind_method("_tree_item_selected",&EditorHelp::_tree_item_selected); ObjectTypeDB::bind_method("_search_cbk",&EditorHelp::_search_cbk);
ObjectTypeDB::bind_method("_help_callback",&EditorHelp::_help_callback); ObjectTypeDB::bind_method("_help_callback",&EditorHelp::_help_callback);
ADD_SIGNAL(MethodInfo("go_to_help"));
} }
EditorHelp::EditorHelp(EditorNode *p_editor) { EditorHelp::EditorHelp() {
editor=p_editor; editor=EditorNode::get_singleton();
VBoxContainer *vbc = this; VBoxContainer *vbc = this;
HBoxContainer *panel_hb = memnew( HBoxContainer );
Button *b = memnew( Button );
b->set_text("Class List");
panel_hb->add_child(b);
vbc->add_child(panel_hb);
b->set_toggle_mode(true);
b->set_pressed(true);
b->connect("pressed",this,"_button_pressed",make_binds(PAGE_CLASS_LIST));
class_list_button=b;
class_list_button->hide();
b = memnew( Button );
b->set_text("Class");
panel_hb->add_child(b);
edited_class=b;
edited_class->hide();
b->set_toggle_mode(true);
b->connect("pressed",this,"_button_pressed",make_binds(PAGE_CLASS_DESC));
b = memnew( Button );
b->set_text("Search in Classes");
panel_hb->add_child(b);
b->connect("pressed",this,"_button_pressed",make_binds(CLASS_SEARCH));
Control *expand = memnew( Control );
expand->set_h_size_flags(SIZE_EXPAND_FILL);
panel_hb->add_child(expand);
b = memnew( Button );
panel_hb->add_child(b);
back=b;
b->connect("pressed",this,"_button_pressed",make_binds(PAGE_CLASS_PREV));
b = memnew( Button );
panel_hb->add_child(b);
forward=b;
b->connect("pressed",this,"_button_pressed",make_binds(PAGE_CLASS_NEXT));
Separator *hs = memnew( VSeparator );
panel_hb->add_child(hs);
Control *ec = memnew( Control );
ec->set_custom_minimum_size(Size2(200,1));
panel_hb->add_child(ec);
search = memnew( LineEdit );
ec->add_child(search);
search->set_area_as_parent_rect();
search->connect("text_entered",this,"_search");
b = memnew( Button );
b->set_text("Find");
panel_hb->add_child(b);
b->connect("pressed",this,"_button_pressed",make_binds(PAGE_SEARCH));
hs = memnew( VSeparator );
panel_hb->add_child(hs);
h_split = memnew( HSplitContainer );
h_split->set_v_size_flags(SIZE_EXPAND_FILL);
vbc->add_child(h_split);
class_list = memnew( Tree );
h_split->add_child(class_list);
//class_list->connect("meta_clicked",this,"_class_list_select"); //class_list->connect("meta_clicked",this,"_class_list_select");
//class_list->set_selection_enabled(true); //class_list->set_selection_enabled(true);
{ {
PanelContainer *pc = memnew( PanelContainer ); Panel *pc = memnew( Panel );
Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) ); Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) );
style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/background_color") ); style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/background_color") );
style->set_default_margin(MARGIN_LEFT,20); pc->set_v_size_flags(SIZE_EXPAND_FILL);
style->set_default_margin(MARGIN_TOP,20);
pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit")); pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit"));
h_split->add_child(pc); vbc->add_child(pc);
class_desc = memnew( RichTextLabel ); class_desc = memnew( RichTextLabel );
pc->add_child(class_desc); pc->add_child(class_desc);
class_desc->set_area_as_parent_rect(8);
class_desc->connect("meta_clicked",this,"_class_desc_select"); class_desc->connect("meta_clicked",this,"_class_desc_select");
} }
class_desc->get_v_scroll()->connect("value_changed",this,"_scroll_changed"); class_desc->get_v_scroll()->connect("value_changed",this,"_scroll_changed");
class_desc->set_selection_enabled(true); class_desc->set_selection_enabled(true);
editor=p_editor;
history_pos=0;
scroll_locked=false; scroll_locked=false;
select_locked=false; select_locked=false;
set_process_unhandled_key_input(true); set_process_unhandled_key_input(true);
h_split->set_split_offset(200);
class_list->connect("cell_selected",this,"_tree_item_selected");
class_desc->hide(); class_desc->hide();
class_search = memnew( EditorHelpSearch(editor) ); search_dialog = memnew( ConfirmationDialog );
add_child(search_dialog);
VBoxContainer *search_vb = memnew( VBoxContainer );
search_dialog->add_child(search_vb);
search_dialog->set_child_rect(search_vb);
search = memnew( LineEdit );
search_dialog->register_text_enter(search);
search_vb->add_margin_child("Search Text",search);
search_dialog->get_ok()->set_text("Find");
search_dialog->connect("confirmed",this,"_search_cbk");
search_dialog->set_hide_on_ok(false);
search_dialog->set_self_opacity(0.8);
/*class_search = memnew( EditorHelpSearch(editor) );
editor->get_gui_base()->add_child(class_search); editor->get_gui_base()->add_child(class_search);
class_search->connect("go_to_help",this,"_help_callback"); class_search->connect("go_to_help",this,"_help_callback");*/
// prev_search_page=-1; // prev_search_page=-1;
} }
EditorHelp::~EditorHelp() { EditorHelp::~EditorHelp() {
if (doc)
memdelete(doc);
}
void EditorHelpPlugin::edit(Object *p_object) {
if (!p_object->cast_to<Script>())
return;
//editor_help->edit(p_object->cast_to<Script>());
}
bool EditorHelpPlugin::handles(Object *p_object) const {
return false;
}
void EditorHelpPlugin::make_visible(bool p_visible) {
if (p_visible) {
editor_help->show();
} else {
editor_help->hide();
}
} }
void EditorHelpPlugin::selected_notify() {
//editor_help->ensure_select_current();
}
Dictionary EditorHelpPlugin::get_state() const {
return Dictionary();
}
void EditorHelpPlugin::set_state(const Dictionary& p_state) {
//editor_help->set_state(p_state);
}
void EditorHelpPlugin::clear() {
//editor_help->clear();
}
void EditorHelpPlugin::save_external_data() {
//editor_help->save_external_data();
}
void EditorHelpPlugin::apply_changes() {
//editor_help->apply_helps();
}
void EditorHelpPlugin::restore_global_state() {
//if (bool(EDITOR_DEF("text_editor/restore_helps_on_load",true))) {
// editor_help->_load_files_state();
//}
}
void EditorHelpPlugin::save_global_state() {
//if (bool(EDITOR_DEF("text_editor/restore_helps_on_load",true))) {
// editor_help->_save_files_state();
// }
}
EditorHelpPlugin::EditorHelpPlugin(EditorNode *p_node) {
editor=p_node;
editor_help = memnew( EditorHelp(p_node) );
editor->get_viewport()->add_child(editor_help);
editor_help->set_area_as_parent_rect();
editor_help->hide();
}
EditorHelpPlugin::~EditorHelpPlugin()
{
}

View File

@ -70,9 +70,29 @@ public:
void popup(const String& p_term=""); void popup(const String& p_term="");
EditorHelpSearch(EditorNode *p_editor); EditorHelpSearch();
}; };
class EditorHelpIndex : public ConfirmationDialog {
OBJ_TYPE( EditorHelpIndex, ConfirmationDialog );
Tree *class_list;
HashMap<String,TreeItem*> tree_item_map;
void _tree_item_selected();
void add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root);
protected:
void _notification(int p_what);
static void _bind_methods();
public:
void select_class(const String& p_class);
EditorHelpIndex();
};
class EditorHelp : public VBoxContainer { class EditorHelp : public VBoxContainer {
@ -91,17 +111,11 @@ class EditorHelp : public VBoxContainer {
}; };
struct History {
String c;
int scroll;
};
Vector<History> history;
int history_pos;
bool select_locked; bool select_locked;
String prev_search; String prev_search;
String prev_search_page;
String edited_class;
EditorNode *editor; EditorNode *editor;
Map<String,int> method_line; Map<String,int> method_line;
@ -111,21 +125,17 @@ class EditorHelp : public VBoxContainer {
Map<String,int> constant_line; Map<String,int> constant_line;
int description_line; int description_line;
Tree *class_list;
RichTextLabel *class_desc; RichTextLabel *class_desc;
HSplitContainer *h_split; HSplitContainer *h_split;
static DocData *doc; static DocData *doc;
Button *class_list_button;
Button *edited_class; ConfirmationDialog *search_dialog;
Button *back;
Button *forward;
LineEdit *search; LineEdit *search;
String base_path;
HashMap<String,TreeItem*> tree_item_map; String base_path;
void _help_callback(const String& p_topic); void _help_callback(const String& p_topic);
@ -133,25 +143,24 @@ class EditorHelp : public VBoxContainer {
void _add_text(const String& p_text); void _add_text(const String& p_text);
bool scroll_locked; bool scroll_locked;
void _button_pressed(int p_idx); //void _button_pressed(int p_idx);
void _add_type(const String& p_type); void _add_type(const String& p_type);
void _scroll_changed(double p_scroll); void _scroll_changed(double p_scroll);
void _class_list_select(const String& p_select); void _class_list_select(const String& p_select);
void _class_desc_select(const String& p_select); void _class_desc_select(const String& p_select);
Error _goto_desc(const String& p_class,bool p_update_history=true,int p_vscr=-1); Error _goto_desc(const String& p_class, int p_vscr=-1);
void _update_history_buttons(); //void _update_history_buttons();
void _update_doc(); void _update_doc();
void _request_help(const String& p_string); void _request_help(const String& p_string);
void _search(const String& p_str); void _search(const String& p_str);
void _search_cbk();
void _unhandled_key_input(const InputEvent& p_ev); void _unhandled_key_input(const InputEvent& p_ev);
void add_type(const String& p_type,HashMap<String,TreeItem*>& p_types,TreeItem *p_root);
void _tree_item_selected();
EditorHelpSearch *class_search;
protected: protected:
@ -163,41 +172,25 @@ public:
static void generate_doc(); static void generate_doc();
static DocData *get_doc_data() { return doc; } static DocData *get_doc_data() { return doc; }
EditorHelp(EditorNode *p_editor=NULL); void go_to_help(const String& p_help);
void go_to_class(const String& p_class,int p_scroll=0);
void popup_search();
void search_again();
String get_class_name();
void set_focused() { class_desc->grab_focus(); }
int get_scroll() const;
void set_scroll(int p_scroll);
EditorHelp();
~EditorHelp(); ~EditorHelp();
}; };
class EditorHelpPlugin : public EditorPlugin {
OBJ_TYPE( EditorHelpPlugin, EditorPlugin );
EditorHelp *editor_help;
EditorNode *editor;
public:
virtual String get_name() const { return "Help"; }
bool has_main_screen() const { return true; }
virtual void edit(Object *p_node);
virtual bool handles(Object *p_node) const;
virtual void make_visible(bool p_visible);
virtual void selected_notify();
Dictionary get_state() const;
virtual void set_state(const Dictionary& p_state);
virtual void clear();
virtual void save_external_data();
virtual void apply_changes();
virtual void restore_global_state();
virtual void save_global_state();
EditorHelpPlugin(EditorNode *p_node);
~EditorHelpPlugin();
};
#endif // EDITOR_HELP_H #endif // EDITOR_HELP_H

View File

@ -163,12 +163,12 @@ void EditorNode::_unhandled_input(const InputEvent& p_event) {
switch(p_event.key.scancode) { switch(p_event.key.scancode) {
case KEY_F1: /*case KEY_F1:
if (!p_event.key.mod.shift && !p_event.key.mod.command) if (!p_event.key.mod.shift && !p_event.key.mod.command)
_editor_select(3); _editor_select(3);
break; break;*/
case KEY_F2: _editor_select(0); break; case KEY_F1: _editor_select(0); break;
case KEY_F3: _editor_select(1); break; case KEY_F2: _editor_select(1); break;
case KEY_F4: _editor_select(2); break; case KEY_F4: _editor_select(2); break;
case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break; case KEY_F5: _menu_option_confirm((p_event.key.mod.control&&p_event.key.mod.shift)?RUN_PLAY_CUSTOM_SCENE:RUN_PLAY,true); break;
case KEY_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break; case KEY_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break;
@ -2846,7 +2846,7 @@ Control* EditorNode::get_viewport() {
void EditorNode::_editor_select(int p_which) { void EditorNode::_editor_select(int p_which) {
static bool selecting=false; static bool selecting=false;
if (selecting) if (selecting || changing_scene)
return; return;
selecting=true; selecting=true;
@ -3223,9 +3223,14 @@ Dictionary EditorNode::_get_main_scene_state() {
void EditorNode::_set_main_scene_state(Dictionary p_state) { void EditorNode::_set_main_scene_state(Dictionary p_state) {
//print_line("set current 7 "); //print_line("set current 7 ");
changing_scene=false;
#if 0
if (p_state.has("main_tab")) { if (p_state.has("main_tab")) {
int idx = p_state["main_tab"]; int idx = p_state["main_tab"];
print_line("comes with tab: "+itos(idx));
int current=-1; int current=-1;
for(int i=0;i<editor_table.size();i++) { for(int i=0;i<editor_table.size();i++) {
if (editor_plugin_screen==editor_table[i]) { if (editor_plugin_screen==editor_table[i]) {
@ -3234,12 +3239,41 @@ void EditorNode::_set_main_scene_state(Dictionary p_state) {
} }
} }
if (idx<2 && current<2) { if (idx<2 && current<2) {
//only set tab for 2D and 3D //only set tab for 2D and 3D
_editor_select(p_state["main_tab"]); _editor_select(idx);
//print_line(" setting main tab: "+itos(p_state["main_tab"])); //print_line(" setting main tab: "+itos(p_state["main_tab"]));
} }
} }
#else
if (get_edited_scene()) {
int current=-1;
for(int i=0;i<editor_table.size();i++) {
if (editor_plugin_screen==editor_table[i]) {
current=i;
break;
}
}
if (current<2) {
//use heuristic instead
int n2d=0,n3d=0;
_find_node_types(get_edited_scene(),n2d,n3d);
if (n2d>n3d) {
_editor_select(0);
} else if (n3d>n2d) {
_editor_select(1);
}
}
}
#endif
if (p_state.has("scene_tree_offset")) if (p_state.has("scene_tree_offset"))
scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->set_val(p_state["scene_tree_offset"]); scene_tree_dock->get_tree_editor()->get_scene_tree()->get_vscroll_bar()->set_val(p_state["scene_tree_offset"]);
@ -3248,6 +3282,12 @@ void EditorNode::_set_main_scene_state(Dictionary p_state) {
//print_line("set current 8 "); //print_line("set current 8 ");
//this should only happen at the very end
//changing_scene=true; //avoid script change from opening editor
ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
ScriptEditor::get_singleton()->set_scene_root_script( editor_data.get_scene_root_script(editor_data.get_edited_scene()) );
//changing_scene=false;
} }
@ -3312,8 +3352,6 @@ void EditorNode::set_current_scene(int p_idx) {
call_deferred("_set_main_scene_state",state); //do after everything else is done setting up call_deferred("_set_main_scene_state",state); //do after everything else is done setting up
//print_line("set current 6 "); //print_line("set current 6 ");
changing_scene=false;
ScriptEditor::get_singleton()->get_debugger()->update_live_edit_root();
} }
@ -5493,7 +5531,6 @@ EditorNode::EditorNode() {
add_editor_plugin( memnew( CanvasItemEditorPlugin(this) ) ); add_editor_plugin( memnew( CanvasItemEditorPlugin(this) ) );
add_editor_plugin( memnew( SpatialEditorPlugin(this) ) ); add_editor_plugin( memnew( SpatialEditorPlugin(this) ) );
add_editor_plugin( memnew( ScriptEditorPlugin(this) ) ); add_editor_plugin( memnew( ScriptEditorPlugin(this) ) );
add_editor_plugin( memnew( EditorHelpPlugin(this) ) );
add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) ); add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) );
add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,true) ) ); add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,true) ) );
add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,false) ) ); add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,false) ) );
@ -5669,6 +5706,7 @@ EditorNode::EditorNode() {
EditorNode::~EditorNode() { EditorNode::~EditorNode() {
memdelete( EditorHelp::get_doc_data() );
memdelete(editor_selection); memdelete(editor_selection);
memdelete(file_server); memdelete(file_server);
EditorSettings::destroy(); EditorSettings::destroy();

Binary file not shown.

Before

Width:  |  Height:  |  Size: 822 B

After

Width:  |  Height:  |  Size: 841 B

View File

@ -572,28 +572,119 @@ void ScriptEditor::_goto_script_line(REF p_script,int p_line) {
} }
void ScriptEditor::_update_history_arrows() {
script_back->set_disabled( history_pos<=0 );
script_forward->set_disabled( history_pos>=history.size()-1 );
}
void ScriptEditor::_go_to_tab(int p_idx) {
Node *cn = tab_container->get_child(p_idx);
if (!cn)
return;
Control *c = cn->cast_to<Control>();
if (!c)
return;
if (history_pos>=0 && history_pos<history.size() && history[history_pos].control==tab_container->get_current_tab_control()) {
Node *n = tab_container->get_current_tab_control();
if (n->cast_to<ScriptTextEditor>()) {
history[history_pos].scroll_pos=n->cast_to<ScriptTextEditor>()->get_text_edit()->get_v_scroll();
history[history_pos].cursor_column=n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_get_column();
history[history_pos].cursor_row=n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_get_line();
}
if (n->cast_to<EditorHelp>()) {
history[history_pos].scroll_pos=n->cast_to<EditorHelp>()->get_scroll();
}
}
history.resize(history_pos+1);
ScriptHistory sh;
sh.control=c;
sh.scroll_pos=0;
history.push_back(sh);
history_pos++;
tab_container->set_current_tab(p_idx);
c = tab_container->get_current_tab_control();
if (c->cast_to<ScriptTextEditor>()) {
script_name_label->set_text(c->cast_to<ScriptTextEditor>()->get_name());
script_icon->set_texture(c->cast_to<ScriptTextEditor>()->get_icon());
if (is_visible())
c->cast_to<ScriptTextEditor>()->get_text_edit()->grab_focus();
}
if (c->cast_to<EditorHelp>()) {
script_name_label->set_text(c->cast_to<EditorHelp>()->get_class_name());
script_icon->set_texture(get_icon("Help","EditorIcons"));
if (is_visible())
c->cast_to<EditorHelp>()->set_focused();
}
c->set_meta("__editor_pass",++edit_pass);
_update_history_arrows();
_update_script_colors();
}
void ScriptEditor::_close_current_tab() { void ScriptEditor::_close_current_tab() {
int selected = tab_container->get_current_tab(); int selected = tab_container->get_current_tab();
if (selected<0 || selected>=tab_container->get_child_count()) if (selected<0 || selected>=tab_container->get_child_count())
return; return;
Node *tselected = tab_container->get_child(selected);
ScriptTextEditor *current = tab_container->get_child(selected)->cast_to<ScriptTextEditor>(); ScriptTextEditor *current = tab_container->get_child(selected)->cast_to<ScriptTextEditor>();
if (!current) if (current) {
return;
apply_scripts(); apply_scripts();
}
//remove from history
history.resize(history_pos+1);
for(int i=0;i<history.size();i++) {
if (history[i].control==tselected) {
history.remove(i);
i--;
history_pos--;
}
}
if (history_pos>=history.size()) {
history_pos=history.size()-1;
}
int idx = tab_container->get_current_tab(); int idx = tab_container->get_current_tab();
memdelete(current); memdelete(tselected);
if (idx>=tab_container->get_child_count()) if (idx>=tab_container->get_child_count())
idx=tab_container->get_child_count()-1; idx=tab_container->get_child_count()-1;
if (idx>=0) { if (idx>=0) {
if (history_pos>=0) {
idx = history[history_pos].control->get_index();
}
tab_container->set_current_tab(idx); tab_container->set_current_tab(idx);
//script_list->select(idx); //script_list->select(idx);
} }
_update_history_arrows();
_update_script_names(); _update_script_names();
EditorNode::get_singleton()->save_layout(); EditorNode::get_singleton()->save_layout();
@ -755,33 +846,15 @@ void ScriptEditor::swap_lines(TextEdit *tx, int line1, int line2)
void ScriptEditor::_menu_option(int p_option) { void ScriptEditor::_menu_option(int p_option) {
if (p_option==FILE_OPEN) {
editor->open_resource("Script");
return;
}
int selected = tab_container->get_current_tab();
if (selected<0 || selected>=tab_container->get_child_count())
return;
ScriptTextEditor *current = tab_container->get_child(selected)->cast_to<ScriptTextEditor>();
if (!current)
return;
switch(p_option) { switch(p_option) {
case FILE_NEW: { case FILE_NEW: {
script_create_dialog->config("Node", ".gd"); script_create_dialog->config("Node", ".gd");
script_create_dialog->popup_centered(Size2(300, 300)); script_create_dialog->popup_centered(Size2(300, 300));
} break; } break;
case FILE_SAVE: { case FILE_OPEN: {
if (!_test_script_times_on_disk())
editor->open_resource("Script");
return; return;
editor->save_resource( current->get_edited_script() );
} break;
case FILE_SAVE_AS: {
editor->save_resource_as( current->get_edited_script() );
} break; } break;
case FILE_SAVE_ALL: { case FILE_SAVE_ALL: {
@ -805,6 +878,67 @@ void ScriptEditor::_menu_option(int p_option) {
} }
} break;
case SEARCH_HELP: {
help_search_dialog->popup("current");
} break;
case SEARCH_CLASSES: {
if (tab_container->get_tab_count()==0)
break;
String current;
EditorHelp *eh = tab_container->get_child( tab_container->get_current_tab() )->cast_to<EditorHelp>();
if (eh) {
current=eh->get_class_name();
}
help_index->popup_centered_ratio(0.6);
if (current!="") {
help_index->call_deferred("select_class",current);
}
} break;
case SEARCH_WEBSITE: {
OS::get_singleton()->shell_open("http://www.godotengine.org/projects/godot-engine/wiki/Documentation#Tutorials");
} break;
case WINDOW_NEXT: {
_history_forward();
} break;
case WINDOW_PREV: {
_history_back();
} break;
}
int selected = tab_container->get_current_tab();
if (selected<0 || selected>=tab_container->get_child_count())
return;
ScriptTextEditor *current = tab_container->get_child(selected)->cast_to<ScriptTextEditor>();
if (current) {
switch(p_option) {
case FILE_NEW: {
script_create_dialog->config("Node", ".gd");
script_create_dialog->popup_centered(Size2(300, 300));
} break;
case FILE_SAVE: {
if (!_test_script_times_on_disk())
return;
editor->save_resource( current->get_edited_script() );
} break;
case FILE_SAVE_AS: {
editor->save_resource_as( current->get_edited_script() );
} break; } break;
case EDIT_UNDO: { case EDIT_UNDO: {
current->get_text_edit()->undo(); current->get_text_edit()->undo();
@ -1146,7 +1280,7 @@ void ScriptEditor::_menu_option(int p_option) {
if (text == "") if (text == "")
text = current->get_text_edit()->get_word_under_cursor(); text = current->get_text_edit()->get_word_under_cursor();
if (text != "") if (text != "")
editor->emit_signal("request_help", text); help_search_dialog->popup(text);
} break; } break;
case FILE_CLOSE: { case FILE_CLOSE: {
if (current->get_text_edit()->get_version()!=current->get_text_edit()->get_saved_version()) { if (current->get_text_edit()->get_version()!=current->get_text_edit()->get_saved_version()) {
@ -1176,6 +1310,7 @@ void ScriptEditor::_menu_option(int p_option) {
} break; } break;
default: { default: {
if (p_option>=WINDOW_SELECT_BASE) { if (p_option>=WINDOW_SELECT_BASE) {
@ -1186,6 +1321,27 @@ void ScriptEditor::_menu_option(int p_option) {
} }
} }
} }
}
EditorHelp *help = tab_container->get_child(selected)->cast_to<EditorHelp>();
if (help) {
switch(p_option) {
case SEARCH_FIND: {
help->popup_search();
} break;
case SEARCH_FIND_NEXT: {
help->search_again();
} break;
case FILE_CLOSE: {
_close_current_tab();
} break;
}
}
} }
@ -1217,6 +1373,14 @@ void ScriptEditor::_notification(int p_what) {
} }
EditorSettings::get_singleton()->connect("settings_changed",this,"_editor_settings_changed"); EditorSettings::get_singleton()->connect("settings_changed",this,"_editor_settings_changed");
help_search->set_icon(get_icon("Help","EditorIcons"));
site_search->set_icon(get_icon("Godot","EditorIcons"));
class_search->set_icon(get_icon("ClassList","EditorIcons"));
script_forward->set_icon(get_icon("Forward","EditorIcons"));
script_back->set_icon(get_icon("Back","EditorIcons"));
} }
@ -1346,7 +1510,7 @@ void ScriptEditor::set_state(const Dictionary& p_state) {
} }
void ScriptEditor::clear() { void ScriptEditor::clear() {
#if 0
List<ScriptTextEditor*> stes; List<ScriptTextEditor*> stes;
for(int i=0;i<tab_container->get_child_count();i++) { for(int i=0;i<tab_container->get_child_count();i++) {
@ -1371,7 +1535,7 @@ void ScriptEditor::clear() {
script_list->select( script_list->find_metadata(idx) ); script_list->select( script_list->find_metadata(idx) );
} }
#endif
} }
@ -1402,31 +1566,6 @@ void ScriptEditor::get_breakpoints(List<String> *p_breakpoints) {
void ScriptEditor::_bind_methods() {
ObjectTypeDB::bind_method("_tab_changed",&ScriptEditor::_tab_changed);
ObjectTypeDB::bind_method("_menu_option",&ScriptEditor::_menu_option);
ObjectTypeDB::bind_method("_close_current_tab",&ScriptEditor::_close_current_tab);
ObjectTypeDB::bind_method("_editor_play",&ScriptEditor::_editor_play);
ObjectTypeDB::bind_method("_editor_pause",&ScriptEditor::_editor_pause);
ObjectTypeDB::bind_method("_editor_stop",&ScriptEditor::_editor_stop);
ObjectTypeDB::bind_method("_add_callback",&ScriptEditor::_add_callback);
ObjectTypeDB::bind_method("_reload_scripts",&ScriptEditor::_reload_scripts);
ObjectTypeDB::bind_method("_resave_scripts",&ScriptEditor::_resave_scripts);
ObjectTypeDB::bind_method("_res_saved_callback",&ScriptEditor::_res_saved_callback);
ObjectTypeDB::bind_method("_goto_script_line",&ScriptEditor::_goto_script_line);
ObjectTypeDB::bind_method("_goto_script_line2",&ScriptEditor::_goto_script_line2);
ObjectTypeDB::bind_method("_breaked",&ScriptEditor::_breaked);
ObjectTypeDB::bind_method("_show_debugger",&ScriptEditor::_show_debugger);
ObjectTypeDB::bind_method("_get_debug_tooltip",&ScriptEditor::_get_debug_tooltip);
ObjectTypeDB::bind_method("_autosave_scripts",&ScriptEditor::_autosave_scripts);
ObjectTypeDB::bind_method("_editor_settings_changed",&ScriptEditor::_editor_settings_changed);
ObjectTypeDB::bind_method("_update_script_names",&ScriptEditor::_update_script_names);
ObjectTypeDB::bind_method("_tree_changed",&ScriptEditor::_tree_changed);
ObjectTypeDB::bind_method("_script_selected",&ScriptEditor::_script_selected);
ObjectTypeDB::bind_method("_script_created",&ScriptEditor::_script_created);
ObjectTypeDB::bind_method("_script_split_dragged",&ScriptEditor::_script_split_dragged);
}
void ScriptEditor::ensure_focus_current() { void ScriptEditor::ensure_focus_current() {
@ -1448,7 +1587,8 @@ void ScriptEditor::ensure_focus_current() {
void ScriptEditor::_script_selected(int p_idx) { void ScriptEditor::_script_selected(int p_idx) {
grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing grab_focus_block = !Input::get_singleton()->is_mouse_button_pressed(1); //amazing hack, simply amazing
tab_container->set_current_tab(script_list->get_item_metadata(p_idx));
_go_to_tab(script_list->get_item_metadata(p_idx));
grab_focus_block=false; grab_focus_block=false;
} }
@ -1457,15 +1597,37 @@ void ScriptEditor::ensure_select_current() {
if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) { if (tab_container->get_child_count() && tab_container->get_current_tab()>=0) {
ScriptTextEditor *ste = tab_container->get_child(tab_container->get_current_tab())->cast_to<ScriptTextEditor>(); Node *current = tab_container->get_child(tab_container->get_current_tab());
if (!ste)
return;
ScriptTextEditor *ste = current->cast_to<ScriptTextEditor>();
if (ste) {
Ref<Script> script = ste->get_edited_script(); Ref<Script> script = ste->get_edited_script();
if (!grab_focus_block && is_inside_tree()) if (!grab_focus_block && is_inside_tree())
ste->get_text_edit()->grab_focus(); ste->get_text_edit()->grab_focus();
edit_menu->show();
search_menu->show();
script_search_menu->hide();
} }
EditorHelp *eh = current->cast_to<EditorHelp>();
if (eh) {
edit_menu->hide();
search_menu->hide();
script_search_menu->show();
}
}
} }
@ -1485,6 +1647,56 @@ void ScriptEditor::_find_scripts(Node* p_base, Node* p_current, Set<Ref<Script>
} }
struct _ScriptEditorItemData {
String name;
Ref<Texture> icon;
int index;
String tooltip;
bool used;
bool operator<(const _ScriptEditorItemData& id) const {
return name.nocasecmp_to(id.name)<0;
}
};
void ScriptEditor::_update_script_colors() {
bool enabled = EditorSettings::get_singleton()->get("text_editor/script_temperature_enabled");
if (!enabled)
return;
int hist_size = EditorSettings::get_singleton()->get("text_editor/script_temperature_history_size");
Color hot_color=EditorSettings::get_singleton()->get("text_editor/script_temperature_hot_color");
Color cold_color=EditorSettings::get_singleton()->get("text_editor/script_temperature_cold_color");
for(int i=0;i<script_list->get_item_count();i++) {
int c = script_list->get_item_metadata(i);
Node *n = tab_container->get_child(c);
if (!n)
continue;
script_list->set_item_custom_bg_color(i,Color(0,0,0,0));
if (!n->has_meta("__editor_pass")) {
continue;
}
int pass=n->get_meta("__editor_pass");
int h = edit_pass - pass;
if (h>hist_size) {
continue;
}
float v = Math::ease((edit_pass-pass)/float_t(hist_size),0.4);
script_list->set_item_custom_bg_color(i,hot_color.linear_interpolate(cold_color,v));
}
}
void ScriptEditor::_update_script_names() { void ScriptEditor::_update_script_names() {
@ -1496,31 +1708,73 @@ void ScriptEditor::_update_script_names() {
} }
script_list->clear(); script_list->clear();
Vector<_ScriptEditorItemData> sedata;
for(int i=0;i<tab_container->get_child_count();i++) { for(int i=0;i<tab_container->get_child_count();i++) {
ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>(); ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
if (!ste) if (ste) {
continue;
String script = ste->get_name(); String name = ste->get_name();
Ref<Texture> icon = ste->get_icon(); Ref<Texture> icon = ste->get_icon();
String path = ste->get_edited_script()->get_path(); String tooltip = ste->get_edited_script()->get_path();
script_list->add_item(script,icon);
_ScriptEditorItemData sd;
sd.icon=icon;
sd.name=name;
sd.tooltip=tooltip;
sd.index=i;
sd.used=used.has(ste->get_edited_script());
sedata.push_back(sd);
}
EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
if (eh) {
String name = eh->get_class_name();
Ref<Texture> icon = get_icon("Help","EditorIcons");
String tooltip = name+" Class Reference";
_ScriptEditorItemData sd;
sd.icon=icon;
sd.name=name;
sd.tooltip=tooltip;
sd.index=i;
sd.used=false;
sedata.push_back(sd);
}
}
sedata.sort();
for(int i=0;i<sedata.size();i++) {
script_list->add_item(sedata[i].name,sedata[i].icon);
int index = script_list->get_item_count()-1; int index = script_list->get_item_count()-1;
script_list->set_item_tooltip(index,sedata[i].tooltip);
script_list->set_item_tooltip(index,path); script_list->set_item_metadata(index,sedata[i].index);
script_list->set_item_metadata(index,i); if (sedata[i].used) {
if (used.has(ste->get_edited_script())) {
script_list->set_item_custom_bg_color(index,Color(88/255.0,88/255.0,60/255.0)); script_list->set_item_custom_bg_color(index,Color(88/255.0,88/255.0,60/255.0));
} }
if (tab_container->get_current_tab()==index) { if (tab_container->get_current_tab()==sedata[i].index) {
script_list->select(index); script_list->select(index);
script_name_label->set_text(sedata[i].name);
script_icon->set_texture(sedata[i].icon);
} }
} }
script_list->sort_items_by_text(); _update_script_colors();
} }
@ -1531,6 +1785,8 @@ void ScriptEditor::edit(const Ref<Script>& p_script) {
// see if already has it // see if already has it
bool open_dominant = EditorSettings::get_singleton()->get("text_editor/open_dominant_script_on_scene_change");
if (p_script->get_path().is_resource_file() && bool(EditorSettings::get_singleton()->get("external_editor/use_external_editor"))) { if (p_script->get_path().is_resource_file() && bool(EditorSettings::get_singleton()->get("external_editor/use_external_editor"))) {
String path = EditorSettings::get_singleton()->get("external_editor/exec_path"); String path = EditorSettings::get_singleton()->get("external_editor/exec_path");
@ -1559,11 +1815,12 @@ void ScriptEditor::edit(const Ref<Script>& p_script) {
if (ste->get_edited_script()==p_script) { if (ste->get_edited_script()==p_script) {
if (!EditorNode::get_singleton()->is_changing_scene()) { if (open_dominant || !EditorNode::get_singleton()->is_changing_scene()) {
if (tab_container->get_current_tab()!=i) { if (tab_container->get_current_tab()!=i) {
tab_container->set_current_tab(i); _go_to_tab(i);
script_list->select( script_list->find_metadata(i) ); script_list->select( script_list->find_metadata(i) );
} }
if (is_visible())
ste->get_text_edit()->grab_focus(); ste->get_text_edit()->grab_focus();
} }
return; return;
@ -1576,7 +1833,8 @@ void ScriptEditor::edit(const Ref<Script>& p_script) {
ste->set_edited_script(p_script); ste->set_edited_script(p_script);
ste->get_text_edit()->set_tooltip_request_func(this,"_get_debug_tooltip",ste); ste->get_text_edit()->set_tooltip_request_func(this,"_get_debug_tooltip",ste);
tab_container->add_child(ste); tab_container->add_child(ste);
tab_container->set_current_tab(tab_container->get_tab_count()-1); _go_to_tab(tab_container->get_tab_count()-1);
@ -1675,7 +1933,7 @@ void ScriptEditor::_add_callback(Object *p_obj, const String& p_function, const
ste->get_text_edit()->insert_text_at_cursor("\n\n"+func); ste->get_text_edit()->insert_text_at_cursor("\n\n"+func);
} }
tab_container->set_current_tab(i); _go_to_tab(i);
ste->get_text_edit()->cursor_set_line(pos); ste->get_text_edit()->cursor_set_line(pos);
ste->get_text_edit()->cursor_set_column(1); ste->get_text_edit()->cursor_set_column(1);
@ -1726,10 +1984,13 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
return; return;
} }
if (!p_layout->has_section_key("ScriptEditor","open_scripts")) if (!p_layout->has_section_key("ScriptEditor","open_scripts") && !p_layout->has_section_key("ScriptEditor","open_help"))
return; return;
Array scripts = p_layout->get_value("ScriptEditor","open_scripts"); Array scripts = p_layout->get_value("ScriptEditor","open_scripts");
Array helps;
if (p_layout->has_section_key("ScriptEditor","open_help"))
helps=p_layout->get_value("ScriptEditor","open_help");
restoring_layout=true; restoring_layout=true;
@ -1742,6 +2003,18 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
} }
} }
for(int i=0;i<helps.size();i++) {
String path = helps[i];
_help_class_open(path);
}
for(int i=0;i<tab_container->get_child_count();i++) {
tab_container->get_child(i)->set_meta("__editor_pass",Variant());
}
if (p_layout->has_section_key("ScriptEditor","split_offset")) { if (p_layout->has_section_key("ScriptEditor","split_offset")) {
script_split->set_split_offset(p_layout->get_value("ScriptEditor","split_offset")); script_split->set_split_offset(p_layout->get_value("ScriptEditor","split_offset"));
} }
@ -1754,27 +2027,184 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) { void ScriptEditor::get_window_layout(Ref<ConfigFile> p_layout) {
Array scripts; Array scripts;
Array helps;
for(int i=0;i<tab_container->get_child_count();i++) { for(int i=0;i<tab_container->get_child_count();i++) {
ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>(); ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
if (!ste) if (ste) {
continue;
String path = ste->get_edited_script()->get_path(); String path = ste->get_edited_script()->get_path();
if (!path.is_resource_file()) if (!path.is_resource_file())
continue; continue;
scripts.push_back(path); scripts.push_back(path);
}
EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
if (eh) {
helps.push_back(eh->get_class_name());
}
} }
p_layout->set_value("ScriptEditor","open_scripts",scripts); p_layout->set_value("ScriptEditor","open_scripts",scripts);
p_layout->set_value("ScriptEditor","open_help",helps);
p_layout->set_value("ScriptEditor","split_offset",script_split->get_split_offset()); p_layout->set_value("ScriptEditor","split_offset",script_split->get_split_offset());
} }
void ScriptEditor::_help_class_open(const String& p_class) {
for(int i=0;i<tab_container->get_child_count();i++) {
EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
if (eh && eh->get_class_name()==p_class) {
_go_to_tab(i);
_update_script_names();
return;
}
}
EditorHelp * eh = memnew( EditorHelp );
eh->set_name(p_class);
tab_container->add_child(eh);
_go_to_tab(tab_container->get_tab_count()-1);
eh->go_to_class(p_class,0);
eh->connect("go_to_help",this,"_help_class_goto");
_update_script_names();
}
void ScriptEditor::_help_class_goto(const String& p_desc) {
String cname=p_desc.get_slice(":",1);
for(int i=0;i<tab_container->get_child_count();i++) {
EditorHelp *eh = tab_container->get_child(i)->cast_to<EditorHelp>();
if (eh && eh->get_class_name()==cname) {
_go_to_tab(i);
eh->go_to_help(p_desc);
_update_script_names();
return;
}
}
EditorHelp * eh = memnew( EditorHelp );
eh->set_name(cname);
tab_container->add_child(eh);
_go_to_tab(tab_container->get_tab_count()-1);
eh->go_to_help(p_desc);
eh->connect("go_to_help",this,"_help_class_goto");
_update_script_names();
}
void ScriptEditor::_update_history_pos(int p_new_pos) {
Node *n = tab_container->get_current_tab_control();
if (n->cast_to<ScriptTextEditor>()) {
history[history_pos].scroll_pos=n->cast_to<ScriptTextEditor>()->get_text_edit()->get_v_scroll();
history[history_pos].cursor_column=n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_get_column();
history[history_pos].cursor_row=n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_get_line();
}
if (n->cast_to<EditorHelp>()) {
history[history_pos].scroll_pos=n->cast_to<EditorHelp>()->get_scroll();
}
history_pos=p_new_pos;
tab_container->set_current_tab(history[history_pos].control->get_index());
n = history[history_pos].control;
if (n->cast_to<ScriptTextEditor>()) {
n->cast_to<ScriptTextEditor>()->get_text_edit()->set_v_scroll(history[history_pos].scroll_pos);
n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_set_column( history[history_pos].cursor_column );
n->cast_to<ScriptTextEditor>()->get_text_edit()->cursor_set_line( history[history_pos].cursor_row );
n->cast_to<ScriptTextEditor>()->get_text_edit()->grab_focus();
}
if (n->cast_to<EditorHelp>()) {
n->cast_to<EditorHelp>()->set_scroll(history[history_pos].scroll_pos);
n->cast_to<EditorHelp>()->set_focused();
}
n->set_meta("__editor_pass",++edit_pass);
_update_script_names();
_update_history_arrows();
}
void ScriptEditor::_history_forward() {
if (history_pos<history.size()-1) {
_update_history_pos(history_pos+1);
}
}
void ScriptEditor::_history_back(){
if (history_pos>0) {
_update_history_pos(history_pos-1);
}
}
void ScriptEditor::set_scene_root_script( Ref<Script> p_script ) {
bool open_dominant = EditorSettings::get_singleton()->get("text_editor/open_dominant_script_on_scene_change");
if (open_dominant && p_script.is_valid()) {
edit(p_script);
}
}
void ScriptEditor::_bind_methods() {
ObjectTypeDB::bind_method("_tab_changed",&ScriptEditor::_tab_changed);
ObjectTypeDB::bind_method("_menu_option",&ScriptEditor::_menu_option);
ObjectTypeDB::bind_method("_close_current_tab",&ScriptEditor::_close_current_tab);
ObjectTypeDB::bind_method("_editor_play",&ScriptEditor::_editor_play);
ObjectTypeDB::bind_method("_editor_pause",&ScriptEditor::_editor_pause);
ObjectTypeDB::bind_method("_editor_stop",&ScriptEditor::_editor_stop);
ObjectTypeDB::bind_method("_add_callback",&ScriptEditor::_add_callback);
ObjectTypeDB::bind_method("_reload_scripts",&ScriptEditor::_reload_scripts);
ObjectTypeDB::bind_method("_resave_scripts",&ScriptEditor::_resave_scripts);
ObjectTypeDB::bind_method("_res_saved_callback",&ScriptEditor::_res_saved_callback);
ObjectTypeDB::bind_method("_goto_script_line",&ScriptEditor::_goto_script_line);
ObjectTypeDB::bind_method("_goto_script_line2",&ScriptEditor::_goto_script_line2);
ObjectTypeDB::bind_method("_breaked",&ScriptEditor::_breaked);
ObjectTypeDB::bind_method("_show_debugger",&ScriptEditor::_show_debugger);
ObjectTypeDB::bind_method("_get_debug_tooltip",&ScriptEditor::_get_debug_tooltip);
ObjectTypeDB::bind_method("_autosave_scripts",&ScriptEditor::_autosave_scripts);
ObjectTypeDB::bind_method("_editor_settings_changed",&ScriptEditor::_editor_settings_changed);
ObjectTypeDB::bind_method("_update_script_names",&ScriptEditor::_update_script_names);
ObjectTypeDB::bind_method("_tree_changed",&ScriptEditor::_tree_changed);
ObjectTypeDB::bind_method("_script_selected",&ScriptEditor::_script_selected);
ObjectTypeDB::bind_method("_script_created",&ScriptEditor::_script_created);
ObjectTypeDB::bind_method("_script_split_dragged",&ScriptEditor::_script_split_dragged);
ObjectTypeDB::bind_method("_help_class_open",&ScriptEditor::_help_class_open);
ObjectTypeDB::bind_method("_help_class_goto",&ScriptEditor::_help_class_goto);
ObjectTypeDB::bind_method("_history_forward",&ScriptEditor::_history_forward);
ObjectTypeDB::bind_method("_history_back",&ScriptEditor::_history_back);
}
ScriptEditor::ScriptEditor(EditorNode *p_editor) { ScriptEditor::ScriptEditor(EditorNode *p_editor) {
@ -1816,6 +2246,9 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu->get_popup()->add_item("Save As..",FILE_SAVE_AS); file_menu->get_popup()->add_item("Save As..",FILE_SAVE_AS);
file_menu->get_popup()->add_item("Save All",FILE_SAVE_ALL,KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_S); file_menu->get_popup()->add_item("Save All",FILE_SAVE_ALL,KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_S);
file_menu->get_popup()->add_separator(); file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_item("History Prev",WINDOW_PREV,KEY_MASK_CTRL|KEY_MASK_ALT|KEY_LEFT);
file_menu->get_popup()->add_item("History Next",WINDOW_NEXT,KEY_MASK_CTRL|KEY_MASK_ALT|KEY_RIGHT);
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_item("Close",FILE_CLOSE,KEY_MASK_CMD|KEY_W); file_menu->get_popup()->add_item("Close",FILE_CLOSE,KEY_MASK_CMD|KEY_W);
file_menu->get_popup()->connect("item_pressed", this,"_menu_option"); file_menu->get_popup()->connect("item_pressed", this,"_menu_option");
@ -1851,13 +2284,22 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
menu_hb->add_child(search_menu); menu_hb->add_child(search_menu);
search_menu->set_text("Search"); search_menu->set_text("Search");
search_menu->get_popup()->add_item("Find..",SEARCH_FIND,KEY_MASK_CMD|KEY_F); search_menu->get_popup()->add_item("Find..",SEARCH_FIND,KEY_MASK_CMD|KEY_F);
search_menu->get_popup()->add_item("Find Next",SEARCH_FIND_NEXT,KEY_MASK_CMD|KEY_G); search_menu->get_popup()->add_item("Find Next",SEARCH_FIND_NEXT,KEY_F3);
search_menu->get_popup()->add_item("Replace..",SEARCH_REPLACE,KEY_MASK_CMD|KEY_R); search_menu->get_popup()->add_item("Replace..",SEARCH_REPLACE,KEY_MASK_CMD|KEY_R);
search_menu->get_popup()->add_separator(); search_menu->get_popup()->add_separator();
search_menu->get_popup()->add_item("Goto Function..",SEARCH_LOCATE_FUNCTION,KEY_MASK_SHIFT|KEY_MASK_CMD|KEY_F); search_menu->get_popup()->add_item("Goto Function..",SEARCH_LOCATE_FUNCTION,KEY_MASK_SHIFT|KEY_MASK_CMD|KEY_F);
search_menu->get_popup()->add_item("Goto Line..",SEARCH_GOTO_LINE,KEY_MASK_CMD|KEY_L); search_menu->get_popup()->add_item("Goto Line..",SEARCH_GOTO_LINE,KEY_MASK_CMD|KEY_L);
search_menu->get_popup()->connect("item_pressed", this,"_menu_option"); search_menu->get_popup()->connect("item_pressed", this,"_menu_option");
script_search_menu = memnew( MenuButton );
menu_hb->add_child(script_search_menu);
script_search_menu->set_text("Search");
script_search_menu->get_popup()->add_item("Find..",SEARCH_FIND,KEY_MASK_CMD|KEY_F);
script_search_menu->get_popup()->add_item("Find Next",SEARCH_FIND_NEXT,KEY_F3);
script_search_menu->get_popup()->connect("item_pressed", this,"_menu_option");
script_search_menu->hide();
debug_menu = memnew( MenuButton ); debug_menu = memnew( MenuButton );
menu_hb->add_child(debug_menu); menu_hb->add_child(debug_menu);
debug_menu->set_text("Debug"); debug_menu->set_text("Debug");
@ -1897,6 +2339,53 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
help_menu->get_popup()->add_item("Contextual", HELP_CONTEXTUAL, KEY_MASK_SHIFT|KEY_F1); help_menu->get_popup()->add_item("Contextual", HELP_CONTEXTUAL, KEY_MASK_SHIFT|KEY_F1);
help_menu->get_popup()->connect("item_pressed", this,"_menu_option"); help_menu->get_popup()->connect("item_pressed", this,"_menu_option");
menu_hb->add_spacer();
script_icon = memnew( TextureFrame );
menu_hb->add_child(script_icon);
script_name_label = memnew( Label );
menu_hb->add_child(script_name_label);
script_icon->hide();
script_name_label->hide();
menu_hb->add_spacer();
site_search = memnew( ToolButton );
site_search->set_text("Tutorials");
site_search->connect("pressed",this,"_menu_option",varray(SEARCH_WEBSITE));
menu_hb->add_child(site_search);
site_search->set_tooltip("Open http://www.godotengine.org at tutorials section.");
class_search = memnew( ToolButton );
class_search->set_text("Classes");
class_search->connect("pressed",this,"_menu_option",varray(SEARCH_CLASSES));
menu_hb->add_child(class_search);
class_search->set_tooltip("Search the class hierarchy.");
help_search = memnew( ToolButton );
help_search->set_text("Search Help");
help_search->connect("pressed",this,"_menu_option",varray(SEARCH_HELP));
menu_hb->add_child(help_search);
help_search->set_tooltip("Search the reference documentation.");
menu_hb->add_child( memnew( VSeparator) );
script_back = memnew( ToolButton );
script_back->connect("pressed",this,"_history_back");
menu_hb->add_child(script_back);
script_back->set_disabled(true);
help_search->set_tooltip("Go to previous edited document.");
script_forward = memnew( ToolButton );
script_forward->connect("pressed",this,"_history_forward");
menu_hb->add_child(script_forward);
script_forward->set_disabled(true);
help_search->set_tooltip("Go to next edited document.");
tab_container->connect("tab_changed", this,"_tab_changed"); tab_container->connect("tab_changed", this,"_tab_changed");
find_replace_dialog = memnew(FindReplaceDialog); find_replace_dialog = memnew(FindReplaceDialog);
@ -1959,8 +2448,20 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
grab_focus_block=false; grab_focus_block=false;
help_search_dialog = memnew( EditorHelpSearch );
add_child(help_search_dialog);
help_search_dialog->connect("go_to_help",this,"_help_class_goto");
help_index = memnew( EditorHelpIndex );
add_child(help_index);
help_index->connect("open_class",this,"_help_class_open");
history_pos=-1;
// debugger_gui->hide(); // debugger_gui->hide();
edit_pass=0;
} }
@ -2062,8 +2563,13 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) {
script_editor->hide(); script_editor->hide();
EDITOR_DEF("text_editor/auto_reload_changed_scripts",false); EDITOR_DEF("text_editor/auto_reload_changed_scripts",false);
EDITOR_DEF("text_editor/open_dominant_script_on_scene_change",true);
EDITOR_DEF("external_editor/use_external_editor",false); EDITOR_DEF("external_editor/use_external_editor",false);
EDITOR_DEF("external_editor/exec_path",""); EDITOR_DEF("external_editor/exec_path","");
EDITOR_DEF("text_editor/script_temperature_enabled",true);
EDITOR_DEF("text_editor/script_temperature_history_size",15);
EDITOR_DEF("text_editor/script_temperature_hot_color",Color(1,0,0,0.3));
EDITOR_DEF("text_editor/script_temperature_cold_color",Color(0,0,1,0.3));
EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"external_editor/exec_path",PROPERTY_HINT_GLOBAL_FILE)); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING,"external_editor/exec_path",PROPERTY_HINT_GLOBAL_FILE));
EDITOR_DEF("external_editor/exec_flags",""); EDITOR_DEF("external_editor/exec_flags","");

View File

@ -41,6 +41,7 @@
#include "tools/editor/code_editor.h" #include "tools/editor/code_editor.h"
#include "scene/gui/split_container.h" #include "scene/gui/split_container.h"
#include "scene/gui/item_list.h" #include "scene/gui/item_list.h"
#include "tools/editor/editor_help.h"
class ScriptEditorQuickOpen : public ConfirmationDialog { class ScriptEditorQuickOpen : public ConfirmationDialog {
@ -141,6 +142,9 @@ class ScriptEditor : public VBoxContainer {
SEARCH_REPLACE, SEARCH_REPLACE,
SEARCH_LOCATE_FUNCTION, SEARCH_LOCATE_FUNCTION,
SEARCH_GOTO_LINE, SEARCH_GOTO_LINE,
SEARCH_HELP,
SEARCH_CLASSES,
SEARCH_WEBSITE,
DEBUG_TOGGLE_BREAKPOINT, DEBUG_TOGGLE_BREAKPOINT,
DEBUG_NEXT, DEBUG_NEXT,
DEBUG_STEP, DEBUG_STEP,
@ -150,6 +154,8 @@ class ScriptEditor : public VBoxContainer {
HELP_CONTEXTUAL, HELP_CONTEXTUAL,
WINDOW_MOVE_LEFT, WINDOW_MOVE_LEFT,
WINDOW_MOVE_RIGHT, WINDOW_MOVE_RIGHT,
WINDOW_NEXT,
WINDOW_PREV,
WINDOW_SELECT_BASE=100 WINDOW_SELECT_BASE=100
}; };
@ -157,11 +163,17 @@ class ScriptEditor : public VBoxContainer {
MenuButton *file_menu; MenuButton *file_menu;
MenuButton *edit_menu; MenuButton *edit_menu;
MenuButton *search_menu; MenuButton *search_menu;
MenuButton *script_search_menu;
MenuButton *debug_menu; MenuButton *debug_menu;
MenuButton *help_menu; MenuButton *help_menu;
Timer *autosave_timer; Timer *autosave_timer;
uint64_t idle; uint64_t idle;
Button *help_search;
Button *site_search;
Button *class_search;
EditorHelpSearch *help_search_dialog;
ItemList *script_list; ItemList *script_list;
HSplitContainer *script_split; HSplitContainer *script_split;
TabContainer *tab_container; TabContainer *tab_container;
@ -172,6 +184,27 @@ class ScriptEditor : public VBoxContainer {
ScriptEditorDebugger* debugger; ScriptEditorDebugger* debugger;
ToolButton *scripts_visible; ToolButton *scripts_visible;
TextureFrame *script_icon;
Label *script_name_label;
ToolButton *script_back;
ToolButton *script_forward;
struct ScriptHistory {
Control *control;
int scroll_pos;
int cursor_column;
int cursor_row;
};
Vector<ScriptHistory> history;
int history_pos;
EditorHelpIndex *help_index;
void _tab_changed(int p_which); void _tab_changed(int p_which);
void _menu_option(int p_optin); void _menu_option(int p_optin);
@ -201,6 +234,8 @@ class ScriptEditor : public VBoxContainer {
void _editor_pause(); void _editor_pause();
void _editor_stop(); void _editor_stop();
int edit_pass;
void _add_callback(Object *p_obj, const String& p_function, const StringArray& p_args); void _add_callback(Object *p_obj, const String& p_function, const StringArray& p_args);
void _res_saved_callback(const Ref<Resource>& p_res); void _res_saved_callback(const Ref<Resource>& p_res);
@ -224,8 +259,20 @@ class ScriptEditor : public VBoxContainer {
void _script_split_dragged(float); void _script_split_dragged(float);
void _history_forward();
void _history_back();
bool waiting_update_names; bool waiting_update_names;
void _help_class_open(const String& p_class);
void _help_class_goto(const String& p_desc);
void _update_history_arrows();
void _go_to_tab(int p_idx);
void _update_history_pos(int p_new_pos);
void _update_script_colors();
static ScriptEditor *script_editor; static ScriptEditor *script_editor;
protected: protected:
void _notification(int p_what); void _notification(int p_what);
@ -253,6 +300,8 @@ public:
void set_window_layout(Ref<ConfigFile> p_layout); void set_window_layout(Ref<ConfigFile> p_layout);
void get_window_layout(Ref<ConfigFile> p_layout); void get_window_layout(Ref<ConfigFile> p_layout);
void set_scene_root_script( Ref<Script> p_script );
ScriptEditorDebugger *get_debugger() { return debugger; } ScriptEditorDebugger *get_debugger() { return debugger; }
ScriptEditor(EditorNode *p_editor); ScriptEditor(EditorNode *p_editor);