-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:
parent
8420c24f7f
commit
081a236c67
@ -244,6 +244,8 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
|
||||
int stateflag = 0;
|
||||
|
||||
int audio_track_skip=audio_track;
|
||||
|
||||
|
||||
while(!stateflag){
|
||||
int ret=buffer_data();
|
||||
if(ret==0)break;
|
||||
@ -273,6 +275,10 @@ void VideoStreamPlaybackTheora::set_file(const String& p_file) {
|
||||
if (audio_track_skip) {
|
||||
vorbis_info_clear(&vi);
|
||||
vorbis_comment_clear(&vc);
|
||||
ogg_stream_clear(&test);
|
||||
vorbis_info_init(&vi);
|
||||
vorbis_comment_init(&vc);
|
||||
|
||||
audio_track_skip--;
|
||||
} else {
|
||||
copymem(&vo,&test,sizeof(test));
|
||||
|
@ -235,6 +235,37 @@ int ItemList::get_current() const {
|
||||
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{
|
||||
|
||||
|
@ -101,6 +101,7 @@ public:
|
||||
void set_current(int p_current);
|
||||
int get_current() const;
|
||||
|
||||
void move_item(int p_item,int p_to_pos);
|
||||
|
||||
int get_item_count() const;
|
||||
void remove_item(int p_idx);
|
||||
|
@ -54,6 +54,8 @@ void MenuButton::_unhandled_key_input(InputEvent p_event) {
|
||||
|
||||
|
||||
int item = popup->find_item_by_accelerator(code);
|
||||
|
||||
|
||||
if (item>=0 && ! popup->is_item_disabled(item))
|
||||
popup->activate_item(item);
|
||||
/*
|
||||
|
@ -719,7 +719,7 @@ void RichTextLabel::_input_event(InputEvent p_event) {
|
||||
case InputEvent::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;
|
||||
switch(k.scancode) {
|
||||
case KEY_PAGEUP: {
|
||||
@ -765,6 +765,7 @@ void RichTextLabel::_input_event(InputEvent p_event) {
|
||||
default: handled=false;
|
||||
}
|
||||
|
||||
|
||||
if (handled)
|
||||
accept_event();
|
||||
}
|
||||
|
@ -384,12 +384,12 @@ void VideoPlayer::_bind_methods() {
|
||||
ObjectTypeDB::bind_method(_MD("set_buffering_msec","msec"),&VideoPlayer::set_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::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::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::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") );
|
||||
}
|
||||
|
||||
|
@ -188,6 +188,7 @@ void make_default_theme() {
|
||||
// Font Colors
|
||||
|
||||
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_hover = Color::html("f0f0f0");
|
||||
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_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("line_separation","ItemList",2);
|
||||
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("guide_color","ItemList", Color(0,0,0,0.1) );
|
||||
t->set_stylebox("selected","ItemList", item_selected_oof );
|
||||
|
@ -618,7 +618,7 @@ CodeTextEditor::CodeTextEditor() {
|
||||
line_col = memnew( Label );
|
||||
add_child(line_col);
|
||||
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_RIGHT,ANCHOR_END,5);
|
||||
//line_col->set_align(Label::ALIGN_RIGHT);
|
||||
@ -637,7 +637,7 @@ CodeTextEditor::CodeTextEditor() {
|
||||
error = memnew( Label );
|
||||
add_child(error);
|
||||
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_RIGHT,ANCHOR_END,130);
|
||||
error->hide();
|
||||
|
@ -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 );
|
||||
add_child(vbc);
|
||||
set_child_rect(vbc);
|
||||
@ -318,17 +318,138 @@ EditorHelpSearch::EditorHelpSearch(EditorNode *p_editor) {
|
||||
search_box->connect("input_event",this,"_sbox_input");
|
||||
search_options = memnew( Tree );
|
||||
vbc->add_margin_child("Matches:",search_options,true);
|
||||
get_ok()->set_text("View");
|
||||
get_ok()->set_text("Open");
|
||||
get_ok()->set_disabled(true);
|
||||
register_text_enter(search_box);
|
||||
set_hide_on_ok(false);
|
||||
search_options->connect("item_activated",this,"_confirmed");
|
||||
set_title("Search Classes");
|
||||
|
||||
// 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;
|
||||
|
||||
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->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();
|
||||
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;
|
||||
if (class_list->get_selected())
|
||||
prev_search_page=class_list->get_selected()->get_text(0);
|
||||
|
||||
|
||||
}
|
||||
|
||||
#if 0
|
||||
void EditorHelp::_button_pressed(int p_idx) {
|
||||
|
||||
if (p_idx==PAGE_CLASS_LIST) {
|
||||
@ -399,16 +520,11 @@ void EditorHelp::_button_pressed(int p_idx) {
|
||||
} else if (p_idx==PAGE_SEARCH) {
|
||||
|
||||
_search("");
|
||||
} else if (p_idx==CLASS_SEARCH) {
|
||||
|
||||
class_search->popup();
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
#endif
|
||||
|
||||
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) {
|
||||
|
||||
|
||||
|
||||
// print_line("LINK: "+p_select);
|
||||
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;
|
||||
} else if (p_select.begins_with("@")) {
|
||||
|
||||
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))
|
||||
return;
|
||||
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) {
|
||||
|
||||
if (scroll_locked)
|
||||
return;
|
||||
|
||||
int p = history_pos -1;
|
||||
if (p<0 || p>=history.size())
|
||||
return;
|
||||
|
||||
if (class_desc->get_v_scroll()->is_hidden())
|
||||
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));
|
||||
if (!doc->class_list.has(p_class))
|
||||
return ERR_DOES_NOT_EXIST;
|
||||
|
||||
|
||||
if (tree_item_map.has(p_class)) {
|
||||
//if (tree_item_map.has(p_class)) {
|
||||
select_locked = true;
|
||||
tree_item_map[p_class]->select(0);
|
||||
class_list->ensure_cursor_is_visible();
|
||||
}
|
||||
//}
|
||||
|
||||
class_desc->show();
|
||||
//tabs->set_current_tab(PAGE_CLASS_DESC);
|
||||
edited_class->set_pressed(true);
|
||||
class_list_button->set_pressed(false);
|
||||
description_line=0;
|
||||
|
||||
if (p_class==edited_class->get_text())
|
||||
if (p_class==edited_class)
|
||||
return OK; //already there
|
||||
|
||||
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();
|
||||
method_line.clear();
|
||||
edited_class->set_text(p_class);
|
||||
edited_class=p_class;
|
||||
//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;
|
||||
|
||||
@ -939,8 +1036,6 @@ void EditorHelp::_request_help(const String& p_string) {
|
||||
Error err = _goto_desc(p_string);
|
||||
if (err==OK) {
|
||||
editor->call("_editor_select",3);
|
||||
} else {
|
||||
class_search->popup(p_string);
|
||||
}
|
||||
//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() {
|
||||
|
||||
|
||||
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: {
|
||||
|
||||
|
||||
forward->set_icon(get_icon("Forward","EditorIcons"));
|
||||
back->set_icon(get_icon("Back","EditorIcons"));
|
||||
// forward->set_icon(get_icon("Forward","EditorIcons"));
|
||||
// back->set_icon(get_icon("Back","EditorIcons"));
|
||||
_update_doc();
|
||||
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;
|
||||
}
|
||||
TreeItem *s=class_list->get_selected();
|
||||
if (!s)
|
||||
return;
|
||||
select_locked=true;
|
||||
_goto_desc(s->get_text(0));
|
||||
select_locked=false;
|
||||
|
||||
|
||||
void EditorHelp::go_to_help(const String& p_help) {
|
||||
|
||||
_help_callback(p_help);
|
||||
}
|
||||
|
||||
void EditorHelp::go_to_class(const String& p_class,int p_scroll) {
|
||||
|
||||
_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() {
|
||||
|
||||
ObjectTypeDB::bind_method("_class_list_select",&EditorHelp::_class_list_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("_request_help",&EditorHelp::_request_help);
|
||||
ObjectTypeDB::bind_method("_unhandled_key_input",&EditorHelp::_unhandled_key_input);
|
||||
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);
|
||||
|
||||
ADD_SIGNAL(MethodInfo("go_to_help"));
|
||||
|
||||
}
|
||||
|
||||
EditorHelp::EditorHelp(EditorNode *p_editor) {
|
||||
EditorHelp::EditorHelp() {
|
||||
|
||||
editor=p_editor;
|
||||
editor=EditorNode::get_singleton();
|
||||
|
||||
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->set_selection_enabled(true);
|
||||
|
||||
{
|
||||
PanelContainer *pc = memnew( PanelContainer );
|
||||
Panel *pc = memnew( Panel );
|
||||
Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) );
|
||||
style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/background_color") );
|
||||
style->set_default_margin(MARGIN_LEFT,20);
|
||||
style->set_default_margin(MARGIN_TOP,20);
|
||||
pc->set_v_size_flags(SIZE_EXPAND_FILL);
|
||||
pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit"));
|
||||
h_split->add_child(pc);
|
||||
vbc->add_child(pc);
|
||||
class_desc = memnew( RichTextLabel );
|
||||
pc->add_child(class_desc);
|
||||
class_desc->set_area_as_parent_rect(8);
|
||||
class_desc->connect("meta_clicked",this,"_class_desc_select");
|
||||
}
|
||||
|
||||
class_desc->get_v_scroll()->connect("value_changed",this,"_scroll_changed");
|
||||
class_desc->set_selection_enabled(true);
|
||||
editor=p_editor;
|
||||
history_pos=0;
|
||||
|
||||
scroll_locked=false;
|
||||
select_locked=false;
|
||||
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_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);
|
||||
class_search->connect("go_to_help",this,"_help_callback");
|
||||
class_search->connect("go_to_help",this,"_help_callback");*/
|
||||
|
||||
// prev_search_page=-1;
|
||||
}
|
||||
|
||||
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()
|
||||
{
|
||||
}
|
||||
|
@ -70,9 +70,29 @@ public:
|
||||
|
||||
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 {
|
||||
@ -91,17 +111,11 @@ class EditorHelp : public VBoxContainer {
|
||||
};
|
||||
|
||||
|
||||
struct History {
|
||||
String c;
|
||||
int scroll;
|
||||
};
|
||||
|
||||
Vector<History> history;
|
||||
int history_pos;
|
||||
bool select_locked;
|
||||
|
||||
String prev_search;
|
||||
String prev_search_page;
|
||||
|
||||
String edited_class;
|
||||
|
||||
EditorNode *editor;
|
||||
Map<String,int> method_line;
|
||||
@ -111,21 +125,17 @@ class EditorHelp : public VBoxContainer {
|
||||
Map<String,int> constant_line;
|
||||
int description_line;
|
||||
|
||||
Tree *class_list;
|
||||
|
||||
RichTextLabel *class_desc;
|
||||
HSplitContainer *h_split;
|
||||
static DocData *doc;
|
||||
|
||||
Button *class_list_button;
|
||||
Button *edited_class;
|
||||
Button *back;
|
||||
Button *forward;
|
||||
|
||||
ConfirmationDialog *search_dialog;
|
||||
LineEdit *search;
|
||||
|
||||
String base_path;
|
||||
|
||||
HashMap<String,TreeItem*> tree_item_map;
|
||||
String base_path;
|
||||
|
||||
|
||||
void _help_callback(const String& p_topic);
|
||||
@ -133,25 +143,24 @@ class EditorHelp : public VBoxContainer {
|
||||
void _add_text(const String& p_text);
|
||||
bool scroll_locked;
|
||||
|
||||
void _button_pressed(int p_idx);
|
||||
//void _button_pressed(int p_idx);
|
||||
void _add_type(const String& p_type);
|
||||
|
||||
void _scroll_changed(double p_scroll);
|
||||
void _class_list_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);
|
||||
void _update_history_buttons();
|
||||
Error _goto_desc(const String& p_class, int p_vscr=-1);
|
||||
//void _update_history_buttons();
|
||||
void _update_doc();
|
||||
|
||||
void _request_help(const String& p_string);
|
||||
void _search(const String& p_str);
|
||||
void _search_cbk();
|
||||
|
||||
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:
|
||||
|
||||
@ -163,41 +172,25 @@ public:
|
||||
static void generate_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();
|
||||
};
|
||||
|
||||
|
||||
|
||||
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
|
||||
|
@ -163,12 +163,12 @@ void EditorNode::_unhandled_input(const InputEvent& p_event) {
|
||||
|
||||
switch(p_event.key.scancode) {
|
||||
|
||||
case KEY_F1:
|
||||
/*case KEY_F1:
|
||||
if (!p_event.key.mod.shift && !p_event.key.mod.command)
|
||||
_editor_select(3);
|
||||
break;
|
||||
case KEY_F2: _editor_select(0); break;
|
||||
case KEY_F3: _editor_select(1); break;
|
||||
break;*/
|
||||
case KEY_F1: _editor_select(0); break;
|
||||
case KEY_F2: _editor_select(1); 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_F6: _menu_option_confirm(RUN_PLAY_SCENE,true); break;
|
||||
@ -2846,7 +2846,7 @@ Control* EditorNode::get_viewport() {
|
||||
void EditorNode::_editor_select(int p_which) {
|
||||
|
||||
static bool selecting=false;
|
||||
if (selecting)
|
||||
if (selecting || changing_scene)
|
||||
return;
|
||||
|
||||
selecting=true;
|
||||
@ -3223,9 +3223,14 @@ Dictionary EditorNode::_get_main_scene_state() {
|
||||
void EditorNode::_set_main_scene_state(Dictionary p_state) {
|
||||
|
||||
//print_line("set current 7 ");
|
||||
changing_scene=false;
|
||||
|
||||
#if 0
|
||||
if (p_state.has("main_tab")) {
|
||||
int idx = p_state["main_tab"];
|
||||
|
||||
|
||||
print_line("comes with tab: "+itos(idx));
|
||||
int current=-1;
|
||||
for(int i=0;i<editor_table.size();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) {
|
||||
//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"]));
|
||||
}
|
||||
}
|
||||
#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"))
|
||||
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 ");
|
||||
|
||||
//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
|
||||
//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( SpatialEditorPlugin(this) ) );
|
||||
add_editor_plugin( memnew( ScriptEditorPlugin(this) ) );
|
||||
add_editor_plugin( memnew( EditorHelpPlugin(this) ) );
|
||||
add_editor_plugin( memnew( AnimationPlayerEditorPlugin(this) ) );
|
||||
add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,true) ) );
|
||||
add_editor_plugin( memnew( ShaderGraphEditorPlugin(this,false) ) );
|
||||
@ -5669,6 +5706,7 @@ EditorNode::EditorNode() {
|
||||
EditorNode::~EditorNode() {
|
||||
|
||||
|
||||
memdelete( EditorHelp::get_doc_data() );
|
||||
memdelete(editor_selection);
|
||||
memdelete(file_server);
|
||||
EditorSettings::destroy();
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 822 B After Width: | Height: | Size: 841 B |
@ -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() {
|
||||
|
||||
int selected = tab_container->get_current_tab();
|
||||
if (selected<0 || selected>=tab_container->get_child_count())
|
||||
return;
|
||||
|
||||
Node *tselected = tab_container->get_child(selected);
|
||||
ScriptTextEditor *current = tab_container->get_child(selected)->cast_to<ScriptTextEditor>();
|
||||
if (!current)
|
||||
return;
|
||||
|
||||
if (current) {
|
||||
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();
|
||||
memdelete(current);
|
||||
memdelete(tselected);
|
||||
if (idx>=tab_container->get_child_count())
|
||||
idx=tab_container->get_child_count()-1;
|
||||
if (idx>=0) {
|
||||
|
||||
if (history_pos>=0) {
|
||||
idx = history[history_pos].control->get_index();
|
||||
}
|
||||
tab_container->set_current_tab(idx);
|
||||
|
||||
//script_list->select(idx);
|
||||
}
|
||||
|
||||
|
||||
_update_history_arrows();
|
||||
|
||||
|
||||
|
||||
_update_script_names();
|
||||
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) {
|
||||
|
||||
|
||||
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) {
|
||||
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())
|
||||
case FILE_OPEN: {
|
||||
|
||||
editor->open_resource("Script");
|
||||
return;
|
||||
editor->save_resource( current->get_edited_script() );
|
||||
|
||||
} break;
|
||||
case FILE_SAVE_AS: {
|
||||
|
||||
editor->save_resource_as( current->get_edited_script() );
|
||||
|
||||
} break;
|
||||
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;
|
||||
case EDIT_UNDO: {
|
||||
current->get_text_edit()->undo();
|
||||
@ -1146,7 +1280,7 @@ void ScriptEditor::_menu_option(int p_option) {
|
||||
if (text == "")
|
||||
text = current->get_text_edit()->get_word_under_cursor();
|
||||
if (text != "")
|
||||
editor->emit_signal("request_help", text);
|
||||
help_search_dialog->popup(text);
|
||||
} break;
|
||||
case FILE_CLOSE: {
|
||||
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;
|
||||
|
||||
default: {
|
||||
|
||||
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");
|
||||
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() {
|
||||
|
||||
#if 0
|
||||
List<ScriptTextEditor*> stes;
|
||||
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) );
|
||||
}
|
||||
|
||||
|
||||
#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() {
|
||||
@ -1448,7 +1587,8 @@ void ScriptEditor::ensure_focus_current() {
|
||||
void ScriptEditor::_script_selected(int p_idx) {
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1457,15 +1597,37 @@ void ScriptEditor::ensure_select_current() {
|
||||
|
||||
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>();
|
||||
if (!ste)
|
||||
return;
|
||||
Node *current = tab_container->get_child(tab_container->get_current_tab());
|
||||
|
||||
|
||||
ScriptTextEditor *ste = current->cast_to<ScriptTextEditor>();
|
||||
if (ste) {
|
||||
|
||||
Ref<Script> script = ste->get_edited_script();
|
||||
|
||||
if (!grab_focus_block && is_inside_tree())
|
||||
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() {
|
||||
|
||||
@ -1496,31 +1708,73 @@ void ScriptEditor::_update_script_names() {
|
||||
}
|
||||
|
||||
script_list->clear();
|
||||
|
||||
Vector<_ScriptEditorItemData> sedata;
|
||||
|
||||
for(int i=0;i<tab_container->get_child_count();i++) {
|
||||
|
||||
|
||||
ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
|
||||
if (!ste)
|
||||
continue;
|
||||
if (ste) {
|
||||
|
||||
String script = ste->get_name();
|
||||
String name = ste->get_name();
|
||||
Ref<Texture> icon = ste->get_icon();
|
||||
String path = ste->get_edited_script()->get_path();
|
||||
script_list->add_item(script,icon);
|
||||
String tooltip = ste->get_edited_script()->get_path();
|
||||
|
||||
_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;
|
||||
|
||||
script_list->set_item_tooltip(index,path);
|
||||
script_list->set_item_metadata(index,i);
|
||||
if (used.has(ste->get_edited_script())) {
|
||||
script_list->set_item_tooltip(index,sedata[i].tooltip);
|
||||
script_list->set_item_metadata(index,sedata[i].index);
|
||||
if (sedata[i].used) {
|
||||
|
||||
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_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
|
||||
|
||||
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"))) {
|
||||
|
||||
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 (!EditorNode::get_singleton()->is_changing_scene()) {
|
||||
if (open_dominant || !EditorNode::get_singleton()->is_changing_scene()) {
|
||||
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) );
|
||||
}
|
||||
if (is_visible())
|
||||
ste->get_text_edit()->grab_focus();
|
||||
}
|
||||
return;
|
||||
@ -1576,7 +1833,8 @@ void ScriptEditor::edit(const Ref<Script>& p_script) {
|
||||
ste->set_edited_script(p_script);
|
||||
ste->get_text_edit()->set_tooltip_request_func(this,"_get_debug_tooltip",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);
|
||||
}
|
||||
|
||||
tab_container->set_current_tab(i);
|
||||
_go_to_tab(i);
|
||||
ste->get_text_edit()->cursor_set_line(pos);
|
||||
ste->get_text_edit()->cursor_set_column(1);
|
||||
|
||||
@ -1726,10 +1984,13 @@ void ScriptEditor::set_window_layout(Ref<ConfigFile> p_layout) {
|
||||
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;
|
||||
|
||||
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;
|
||||
|
||||
@ -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")) {
|
||||
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) {
|
||||
|
||||
Array scripts;
|
||||
Array helps;
|
||||
|
||||
for(int i=0;i<tab_container->get_child_count();i++) {
|
||||
|
||||
ScriptTextEditor *ste = tab_container->get_child(i)->cast_to<ScriptTextEditor>();
|
||||
if (!ste)
|
||||
continue;
|
||||
if (ste) {
|
||||
|
||||
String path = ste->get_edited_script()->get_path();
|
||||
if (!path.is_resource_file())
|
||||
continue;
|
||||
|
||||
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_help",helps);
|
||||
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) {
|
||||
|
||||
@ -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 All",FILE_SAVE_ALL,KEY_MASK_CMD|KEY_MASK_SHIFT|KEY_S);
|
||||
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()->connect("item_pressed", this,"_menu_option");
|
||||
|
||||
@ -1851,13 +2284,22 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
|
||||
menu_hb->add_child(search_menu);
|
||||
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 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_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 Line..",SEARCH_GOTO_LINE,KEY_MASK_CMD|KEY_L);
|
||||
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 );
|
||||
menu_hb->add_child(debug_menu);
|
||||
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()->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");
|
||||
|
||||
find_replace_dialog = memnew(FindReplaceDialog);
|
||||
@ -1959,8 +2448,20 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
|
||||
|
||||
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();
|
||||
|
||||
edit_pass=0;
|
||||
|
||||
}
|
||||
|
||||
|
||||
@ -2062,8 +2563,13 @@ ScriptEditorPlugin::ScriptEditorPlugin(EditorNode *p_node) {
|
||||
script_editor->hide();
|
||||
|
||||
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/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));
|
||||
EDITOR_DEF("external_editor/exec_flags","");
|
||||
|
||||
|
@ -41,6 +41,7 @@
|
||||
#include "tools/editor/code_editor.h"
|
||||
#include "scene/gui/split_container.h"
|
||||
#include "scene/gui/item_list.h"
|
||||
#include "tools/editor/editor_help.h"
|
||||
|
||||
class ScriptEditorQuickOpen : public ConfirmationDialog {
|
||||
|
||||
@ -141,6 +142,9 @@ class ScriptEditor : public VBoxContainer {
|
||||
SEARCH_REPLACE,
|
||||
SEARCH_LOCATE_FUNCTION,
|
||||
SEARCH_GOTO_LINE,
|
||||
SEARCH_HELP,
|
||||
SEARCH_CLASSES,
|
||||
SEARCH_WEBSITE,
|
||||
DEBUG_TOGGLE_BREAKPOINT,
|
||||
DEBUG_NEXT,
|
||||
DEBUG_STEP,
|
||||
@ -150,6 +154,8 @@ class ScriptEditor : public VBoxContainer {
|
||||
HELP_CONTEXTUAL,
|
||||
WINDOW_MOVE_LEFT,
|
||||
WINDOW_MOVE_RIGHT,
|
||||
WINDOW_NEXT,
|
||||
WINDOW_PREV,
|
||||
WINDOW_SELECT_BASE=100
|
||||
};
|
||||
|
||||
@ -157,11 +163,17 @@ class ScriptEditor : public VBoxContainer {
|
||||
MenuButton *file_menu;
|
||||
MenuButton *edit_menu;
|
||||
MenuButton *search_menu;
|
||||
MenuButton *script_search_menu;
|
||||
MenuButton *debug_menu;
|
||||
MenuButton *help_menu;
|
||||
Timer *autosave_timer;
|
||||
uint64_t idle;
|
||||
|
||||
Button *help_search;
|
||||
Button *site_search;
|
||||
Button *class_search;
|
||||
EditorHelpSearch *help_search_dialog;
|
||||
|
||||
ItemList *script_list;
|
||||
HSplitContainer *script_split;
|
||||
TabContainer *tab_container;
|
||||
@ -172,6 +184,27 @@ class ScriptEditor : public VBoxContainer {
|
||||
ScriptEditorDebugger* debugger;
|
||||
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 _menu_option(int p_optin);
|
||||
|
||||
@ -201,6 +234,8 @@ class ScriptEditor : public VBoxContainer {
|
||||
void _editor_pause();
|
||||
void _editor_stop();
|
||||
|
||||
int edit_pass;
|
||||
|
||||
void _add_callback(Object *p_obj, const String& p_function, const StringArray& p_args);
|
||||
void _res_saved_callback(const Ref<Resource>& p_res);
|
||||
|
||||
@ -224,8 +259,20 @@ class ScriptEditor : public VBoxContainer {
|
||||
|
||||
void _script_split_dragged(float);
|
||||
|
||||
|
||||
void _history_forward();
|
||||
void _history_back();
|
||||
|
||||
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;
|
||||
protected:
|
||||
void _notification(int p_what);
|
||||
@ -253,6 +300,8 @@ public:
|
||||
void set_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; }
|
||||
|
||||
ScriptEditor(EditorNode *p_editor);
|
||||
|
Loading…
Reference in New Issue
Block a user