aboutsummaryrefslogtreecommitdiff
path: root/editor/editor_help.cpp
diff options
context:
space:
mode:
authorRémi Verschelde2017-03-05 14:21:25 +0100
committerRémi Verschelde2017-03-05 14:21:25 +0100
commit49c065d29ca07040c3fd810026121164ad86b247 (patch)
tree285176e0c80a41c22c3e8f171024472cfdc7d765 /editor/editor_help.cpp
parent532f6d4b431f940432e82b7fc7826652b7a4520d (diff)
downloadgodot-49c065d29ca07040c3fd810026121164ad86b247.tar.gz
godot-49c065d29ca07040c3fd810026121164ad86b247.tar.zst
godot-49c065d29ca07040c3fd810026121164ad86b247.zip
Diffstat (limited to 'editor/editor_help.cpp')
-rw-r--r--editor/editor_help.cpp1929
1 files changed, 1929 insertions, 0 deletions
diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp
new file mode 100644
index 000000000..7ef765813
--- /dev/null
+++ b/editor/editor_help.cpp
@@ -0,0 +1,1929 @@
+/*************************************************************************/
+/* editor_help.cpp */
+/*************************************************************************/
+/* This file is part of: */
+/* GODOT ENGINE */
+/* http://www.godotengine.org */
+/*************************************************************************/
+/* Copyright (c) 2007-2017 Juan Linietsky, Ariel Manzur. */
+/* */
+/* Permission is hereby granted, free of charge, to any person obtaining */
+/* a copy of this software and associated documentation files (the */
+/* "Software"), to deal in the Software without restriction, including */
+/* without limitation the rights to use, copy, modify, merge, publish, */
+/* distribute, sublicense, and/or sell copies of the Software, and to */
+/* permit persons to whom the Software is furnished to do so, subject to */
+/* the following conditions: */
+/* */
+/* The above copyright notice and this permission notice shall be */
+/* included in all copies or substantial portions of the Software. */
+/* */
+/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
+/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
+/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/
+/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
+/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
+/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
+/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
+/*************************************************************************/
+#include "editor_help.h"
+
+#include "editor_node.h"
+#include "editor_settings.h"
+#include "os/keyboard.h"
+#include "doc_data_compressed.h"
+#include "editor/plugins/script_editor_plugin.h"
+
+void EditorHelpSearch::popup() {
+ popup_centered_ratio(0.6);
+ if (search_box->get_text()!="") {
+ search_box->select_all();
+ _update_search();
+ }
+ search_box->grab_focus();
+}
+
+void EditorHelpSearch::popup(const String& p_term) {
+
+ popup_centered_ratio(0.6);
+ if (p_term!="") {
+ search_box->set_text(p_term);
+ search_box->select_all();
+ _update_search();
+ } else
+ search_box->clear();
+ search_box->grab_focus();
+}
+
+
+void EditorHelpSearch::_text_changed(const String& p_newtext) {
+
+ _update_search();
+}
+
+void EditorHelpSearch::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ search_options->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+
+}
+
+void EditorHelpSearch::_update_search() {
+
+ search_options->clear();
+ search_options->set_hide_root(true);
+
+ /*
+ TreeItem *root = search_options->create_item();
+ _parse_fs(EditorFileSystem::get_singleton()->get_filesystem());
+*/
+
+ List<StringName> type_list;
+ ClassDB::get_class_list(&type_list);
+
+ DocData *doc=EditorHelp::get_doc_data();
+ String term = search_box->get_text();
+ if (term.length()<2)
+ return;
+
+ TreeItem *root = search_options->create_item();
+
+
+
+ Ref<Texture> def_icon = get_icon("Node","EditorIcons");
+ //classes first
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+ if (E->key().findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_name:"+E->key());
+ item->set_text(0,E->key()+" (Class)");
+ if (has_icon(E->key(),"EditorIcons"))
+ item->set_icon(0,get_icon(E->key(),"EditorIcons"));
+ else
+ item->set_icon(0,def_icon);
+
+
+ }
+
+ }
+
+ //class methods, etc second
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+
+ DocData::ClassDoc & c = E->get();
+
+ Ref<Texture> cicon;
+ if (has_icon(E->key(),"EditorIcons"))
+ cicon=get_icon(E->key(),"EditorIcons");
+ else
+ cicon=def_icon;
+
+
+ for(int i=0;i<c.methods.size();i++) {
+ if( (term.begins_with(".") && c.methods[i].name.begins_with(term.right(1)))
+ || (term.ends_with("(") && c.methods[i].name.ends_with(term.left(term.length()-1).strip_edges()))
+ || (term.begins_with(".") && term.ends_with("(") && c.methods[i].name==term.substr(1,term.length()-2).strip_edges())
+ || c.methods[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_method:"+E->key()+":"+c.methods[i].name);
+ item->set_text(0,E->key()+"."+c.methods[i].name+" (Method)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.signals.size();i++) {
+
+ if (c.signals[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_signal:"+E->key()+":"+c.signals[i].name);
+ item->set_text(0,E->key()+"."+c.signals[i].name+" (Signal)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ if (c.constants[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_constant:"+E->key()+":"+c.constants[i].name);
+ item->set_text(0,E->key()+"."+c.constants[i].name+" (Constant)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.properties.size();i++) {
+
+ if (c.properties[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_property:"+E->key()+":"+c.properties[i].name);
+ item->set_text(0,E->key()+"."+c.properties[i].name+" (Property)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.theme_properties.size();i++) {
+
+ if (c.theme_properties[i].name.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_theme_item:"+E->key()+":"+c.theme_properties[i].name);
+ item->set_text(0,E->key()+"."+c.theme_properties[i].name+" (Theme Item)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+
+ }
+
+ //same but descriptions
+
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+
+ DocData::ClassDoc & c = E->get();
+
+ Ref<Texture> cicon;
+ if (has_icon(E->key(),"EditorIcons"))
+ cicon=get_icon(E->key(),"EditorIcons");
+ else
+ cicon=def_icon;
+
+ if (c.description.findn(term)!=-1) {
+
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_desc:"+E->key());
+ item->set_text(0,E->key()+" (Class Description)");
+ item->set_icon(0,cicon);
+
+ }
+
+ for(int i=0;i<c.methods.size();i++) {
+
+ if (c.methods[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_method_desc:"+E->key()+":"+c.methods[i].name);
+ item->set_text(0,E->key()+"."+c.methods[i].name+" (Method Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.signals.size();i++) {
+
+ if (c.signals[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_signal:"+E->key()+":"+c.signals[i].name);
+ item->set_text(0,E->key()+"."+c.signals[i].name+" (Signal Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.constants.size();i++) {
+
+ if (c.constants[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_constant:"+E->key()+":"+c.constants[i].name);
+ item->set_text(0,E->key()+"."+c.constants[i].name+" (Constant Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ for(int i=0;i<c.properties.size();i++) {
+
+ if (c.properties[i].description.findn(term)!=-1) {
+
+ TreeItem *item = search_options->create_item(root);
+ item->set_metadata(0,"class_property_desc:"+E->key()+":"+c.properties[i].name);
+ item->set_text(0,E->key()+"."+c.properties[i].name+" (Property Description)");
+ item->set_icon(0,cicon);
+ }
+ }
+
+ }
+
+ get_ok()->set_disabled(root->get_children()==NULL);
+
+}
+
+void EditorHelpSearch::_confirmed() {
+
+ TreeItem *ti = search_options->get_selected();
+ if (!ti)
+ return;
+
+ String mdata=ti->get_metadata(0);
+ emit_signal("go_to_help",mdata);
+ editor->call("_editor_select",EditorNode::EDITOR_SCRIPT); // in case EditorHelpSearch beeen invoked on top of other editor window
+ // go to that
+ hide();
+}
+
+void EditorHelpSearch::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ connect("confirmed",this,"_confirmed");
+ _update_search();
+ }
+
+ if (p_what==NOTIFICATION_VISIBILITY_CHANGED) {
+
+ if (is_visible_in_tree()) {
+
+ search_box->call_deferred("grab_focus"); // still not visible
+ search_box->select_all();
+ }
+ }
+
+}
+
+
+void EditorHelpSearch::_bind_methods() {
+
+ ClassDB::bind_method(D_METHOD("_text_changed"),&EditorHelpSearch::_text_changed);
+ ClassDB::bind_method(D_METHOD("_confirmed"),&EditorHelpSearch::_confirmed);
+ ClassDB::bind_method(D_METHOD("_sbox_input"),&EditorHelpSearch::_sbox_input);
+ ClassDB::bind_method(D_METHOD("_update_search"),&EditorHelpSearch::_update_search);
+
+ ADD_SIGNAL(MethodInfo("go_to_help"));
+
+}
+
+
+EditorHelpSearch::EditorHelpSearch() {
+
+ editor=EditorNode::get_singleton();
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ HBoxContainer *sb_hb = memnew( HBoxContainer);
+ search_box = memnew( LineEdit );
+ sb_hb->add_child(search_box);
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ Button *sb = memnew( Button(TTR("Search")));
+ sb->connect("pressed",this,"_update_search");
+ sb_hb->add_child(sb);
+ vbc->add_margin_child(TTR("Search:"),sb_hb);
+ search_box->connect("text_changed",this,"_text_changed");
+ search_box->connect("gui_input",this,"_sbox_input");
+ search_options = memnew( Tree );
+ vbc->add_margin_child(TTR("Matches:"),search_options,true);
+ get_ok()->set_text(TTR("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(TTR("Search Help"));
+
+ //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 (!ClassDB::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::popup() {
+
+ popup_centered_ratio(0.6);
+
+ search_box->set_text("");
+ _update_class_list();
+}
+
+void EditorHelpIndex::_notification(int p_what) {
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+
+ _update_class_list();
+
+ connect("confirmed",this,"_tree_item_selected");
+
+ } else if (p_what==NOTIFICATION_POST_POPUP) {
+
+ search_box->call_deferred("grab_focus");
+ }
+}
+
+void EditorHelpIndex::_text_changed(const String& p_text) {
+
+ _update_class_list();
+}
+
+void EditorHelpIndex::_update_class_list() {
+
+ class_list->clear();
+ tree_item_map.clear();
+ TreeItem *root = class_list->create_item();
+ class_list->set_hide_root(true);
+
+ String filter = search_box->get_text().strip_edges();
+ String to_select = "";
+
+ for(Map<String,DocData::ClassDoc>::Element *E=EditorHelp::get_doc_data()->class_list.front();E;E=E->next()) {
+
+ if (filter == "") {
+ add_type(E->key(),tree_item_map,root);
+ } else {
+
+ bool found = false;
+ String type = E->key();
+
+ while(type != "") {
+ if (filter.is_subsequence_ofi(type)) {
+
+ if (to_select.empty()) {
+ to_select = type;
+ }
+
+ found=true;
+ break;
+ }
+
+ type = EditorHelp::get_doc_data()->class_list[type].inherits;
+ }
+
+ if (found) {
+ add_type(E->key(),tree_item_map,root);
+ }
+ }
+ }
+
+ if (tree_item_map.has(filter)) {
+ select_class(filter);
+ } else if (to_select != "") {
+ select_class(to_select);
+ }
+}
+
+
+void EditorHelpIndex::_sbox_input(const InputEvent& p_ie) {
+
+ if (p_ie.type==InputEvent::KEY && (
+ p_ie.key.scancode == KEY_UP ||
+ p_ie.key.scancode == KEY_DOWN ||
+ p_ie.key.scancode == KEY_PAGEUP ||
+ p_ie.key.scancode == KEY_PAGEDOWN ) ) {
+
+ class_list->call("_gui_input",p_ie);
+ search_box->accept_event();
+ }
+}
+
+void EditorHelpIndex::_bind_methods() {
+
+ ClassDB::bind_method("_tree_item_selected",&EditorHelpIndex::_tree_item_selected);
+ ClassDB::bind_method("_text_changed",&EditorHelpIndex::_text_changed);
+ ClassDB::bind_method("_sbox_input",&EditorHelpIndex::_sbox_input);
+ ClassDB::bind_method("select_class",&EditorHelpIndex::select_class);
+ ADD_SIGNAL( MethodInfo("open_class"));
+}
+
+
+
+EditorHelpIndex::EditorHelpIndex() {
+
+ VBoxContainer *vbc = memnew( VBoxContainer );
+ add_child(vbc);
+
+ search_box = memnew( LineEdit );
+ vbc->add_margin_child(TTR("Search:"), search_box);
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+
+ register_text_enter(search_box);
+
+ search_box->connect("text_changed", this, "_text_changed");
+ search_box->connect("gui_input", this, "_sbox_input");
+
+ class_list = memnew( Tree );
+ vbc->add_margin_child(TTR("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(TTR("Open"));
+ set_title(TTR("Search Classes"));
+}
+
+
+
+/////////////////////////////////
+
+////////////////////////////////////
+/// /////////////////////////////////
+DocData *EditorHelp::doc=NULL;
+
+void EditorHelp::_unhandled_key_input(const InputEvent& p_ev) {
+
+ if (!is_visible_in_tree())
+ return;
+ if ( p_ev.key.mod.control && p_ev.key.scancode==KEY_F) {
+
+ search->grab_focus();
+ search->select_all();
+ }
+}
+
+void EditorHelp::_search(const String&) {
+
+ if (search->get_text()=="")
+ return;
+
+
+ String stext=search->get_text();
+ bool keep = prev_search==stext;
+
+ bool ret = class_desc->search(stext, keep);
+ if (!ret) {
+ class_desc->search(stext, false);
+ }
+
+ prev_search=stext;
+
+
+}
+
+#if 0
+void EditorHelp::_button_pressed(int p_idx) {
+
+ if (p_idx==PAGE_CLASS_LIST) {
+
+ //edited_class->set_pressed(false);
+ //class_list_button->set_pressed(true);
+ //tabs->set_current_tab(PAGE_CLASS_LIST);
+
+ } else if (p_idx==PAGE_CLASS_DESC) {
+
+ //edited_class->set_pressed(true);
+ //class_list_button->set_pressed(false);
+ //tabs->set_current_tab(PAGE_CLASS_DESC);
+
+ } else if (p_idx==PAGE_CLASS_PREV) {
+
+ if (history_pos<2)
+ return;
+ history_pos--;
+ ERR_FAIL_INDEX(history_pos-1,history.size());
+ _goto_desc(history[history_pos-1].c,false,history[history_pos-1].scroll);
+ _update_history_buttons();
+
+
+ } else if (p_idx==PAGE_CLASS_NEXT) {
+
+ if (history_pos>=history.size())
+ return;
+
+ history_pos++;
+ ERR_FAIL_INDEX(history_pos-1,history.size());
+ _goto_desc(history[history_pos-1].c,false,history[history_pos-1].scroll);
+ _update_history_buttons();
+
+ } else if (p_idx==PAGE_SEARCH) {
+
+ _search("");
+ }
+}
+
+
+#endif
+
+void EditorHelp::_class_list_select(const String& p_select) {
+
+ _goto_desc(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()));
+ 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]);
+ }
+
+ }
+
+
+}
+
+void EditorHelp::_class_desc_input(const InputEvent& p_input) {
+ if (p_input.type==InputEvent::MOUSE_BUTTON && p_input.mouse_button.pressed && p_input.mouse_button.button_index==1) {
+ class_desc->set_selection_enabled(false);
+ class_desc->set_selection_enabled(true);
+ }
+ set_focused();
+}
+
+void EditorHelp::_add_type(const String& p_type) {
+
+ String t = p_type;
+ if (t=="")
+ t="void";
+ bool can_ref = (t!="int" && t!="real" && t!="bool" && t!="void");
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ if (can_ref)
+ class_desc->push_meta("#"+t); //class
+ class_desc->add_text(t);
+ if (can_ref)
+ class_desc->pop();
+ class_desc->pop();
+
+}
+
+void EditorHelp::_scroll_changed(double p_scroll) {
+
+ if (scroll_locked)
+ return;
+
+ if (!class_desc->get_v_scroll()->is_visible())
+ p_scroll=0;
+
+ //history[p].scroll=p_scroll;
+}
+
+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)) {
+ select_locked = true;
+ //}
+
+ class_desc->show();
+ //tabs->set_current_tab(PAGE_CLASS_DESC);
+ description_line=0;
+
+ if (p_class==edited_class)
+ return OK; //already there
+
+ scroll_locked=true;
+
+ class_desc->clear();
+ method_line.clear();
+ edited_class=p_class;
+ //edited_class->show();
+
+
+ DocData::ClassDoc cd=doc->class_list[p_class]; //make a copy, so we can sort without worrying
+
+ Color h_color;
+
+ Ref<Font> doc_font = get_font("doc","EditorFonts");
+ Ref<Font> doc_title_font = get_font("doc_title","EditorFonts");
+ Ref<Font> doc_code_font = get_font("doc_source","EditorFonts");
+
+
+ h_color=Color(1,1,1,1);
+
+ class_desc->push_font(doc_title_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(TTR("Class:")+" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ _add_text(p_class);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+
+ if (cd.inherits!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Inherits:")+" ");
+ class_desc->pop();
+ class_desc->pop();
+
+ String inherits = cd.inherits;
+
+ class_desc->push_font(doc_font);
+
+ while (inherits != "") {
+ _add_type(inherits);
+
+ inherits = doc->class_list[inherits].inherits;
+
+ if (inherits != "") {
+ class_desc->add_text(" , ");
+ }
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+ }
+
+ if (ClassDB::class_exists(cd.name)) {
+
+ bool found = false;
+ bool prev = false;
+
+ for (Map<String,DocData::ClassDoc>::Element *E=doc->class_list.front();E;E=E->next()) {
+
+ if (E->get().inherits == cd.name) {
+
+ if (!found) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Inherited by:")+" ");
+ class_desc->pop();
+ class_desc->pop();
+
+ found = true;
+ class_desc->push_font(doc_font);
+ }
+
+ if (prev) {
+
+ class_desc->add_text(" , ");
+ prev = false;
+ }
+
+ _add_type(E->get().name);
+ prev = true;
+ }
+ }
+
+ if (found)
+ class_desc->pop();
+
+ class_desc->add_newline();
+ }
+
+ class_desc->add_newline();
+
+ if (cd.brief_description!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Brief Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ //class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.brief_description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+ Set<String> skip_methods;
+ bool property_descr=false;
+
+ if (cd.properties.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Members:"));
+ class_desc->pop();
+ class_desc->pop();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+ class_desc->push_table(2);
+ class_desc->set_table_column_expand(1,1);
+
+ for(int i=0;i<cd.properties.size();i++) {
+ property_line[cd.properties[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+
+ class_desc->push_cell();
+ class_desc->push_align(RichTextLabel::ALIGN_RIGHT);
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.properties[i].type);
+ class_desc->add_text(" ");
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+
+ bool describe=false;
+
+ if (cd.properties[i].setter!="") {
+ skip_methods.insert(cd.properties[i].setter);
+ describe=true;
+
+ }
+ if (cd.properties[i].getter!="") {
+ skip_methods.insert(cd.properties[i].getter);
+ describe=true;
+ }
+
+ if (cd.properties[i].description!="") {
+ describe=true;
+
+ }
+ class_desc->push_cell();
+ if (describe) {
+ class_desc->push_meta("@"+cd.properties[i].name);
+ }
+
+ class_desc->push_font(doc_code_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.properties[i].name);
+
+ if (describe) {
+ class_desc->pop();
+ }
+
+
+ if (cd.properties[i].brief_description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+ if (describe) {
+ property_descr=true;
+ }
+
+
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+
+ class_desc->pop(); //table
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+
+ bool method_descr=false;
+ bool sort_methods = EditorSettings::get_singleton()->get("text_editor/help/sort_functions_alphabetically");
+
+ Vector<DocData::MethodDoc> methods;
+
+ for(int i=0;i<cd.methods.size();i++) {
+ if (skip_methods.has(cd.methods[i].name))
+ continue;
+ methods.push_back(cd.methods[i]);
+ }
+
+ if (methods.size()) {
+
+ if (sort_methods)
+ methods.sort();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Public Methods:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ //class_desc->add_newline();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+ class_desc->push_table(2);
+ class_desc->set_table_column_expand(1,1);
+
+ for(int i=0;i<methods.size();i++) {
+
+ class_desc->push_cell();
+
+
+ method_line[methods[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_align(RichTextLabel::ALIGN_RIGHT);
+ class_desc->push_font(doc_code_font);
+ _add_type(methods[i].return_type);
+ //class_desc->add_text(" ");
+ class_desc->pop(); //align
+ class_desc->pop(); //font
+ class_desc->pop(); //cell
+ class_desc->push_cell();
+ class_desc->push_font(doc_code_font);
+
+ if (methods[i].description!="") {
+ method_descr=true;
+ class_desc->push_meta("@"+methods[i].name);
+ }
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(methods[i].name);
+ class_desc->pop();
+ if (methods[i].description!="")
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<methods[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(methods[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(methods[i].arguments[j].name);
+ if (methods[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(methods[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ if (methods[i].qualifiers.find("vararg")!=-1) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(",");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(" ... ");
+ class_desc->pop();
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?" )":")");
+ class_desc->pop();
+ if (methods[i].qualifiers!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(" ");
+ _add_text(methods[i].qualifiers);
+ class_desc->pop();
+
+ }
+ class_desc->pop();//monofont
+ //class_desc->add_newline();
+ class_desc->pop(); //cell
+
+ }
+ class_desc->pop(); //table
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+
+ if (cd.theme_properties.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("GUI Theme Items:"));
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+
+ class_desc->push_indent(1);
+
+ //class_desc->add_newline();
+
+ for(int i=0;i<cd.theme_properties.size();i++) {
+
+ theme_property_line[cd.theme_properties[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.theme_properties[i].type);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(" ");
+ _add_text(cd.theme_properties[i].name);
+ class_desc->pop();
+ class_desc->pop();
+
+ if (cd.theme_properties[i].description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.theme_properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+
+ }
+
+ class_desc->add_newline();
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+ }
+
+ if (cd.signals.size()) {
+
+ if (sort_methods) {
+ cd.signals.sort();
+ }
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Signals:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ //class_desc->add_newline();
+
+ class_desc->push_indent(1);
+
+ for(int i=0;i<cd.signals.size();i++) {
+
+ signal_line[cd.signals[i].name]=class_desc->get_line_count()-2; //gets overriden if description
+ class_desc->push_font(doc_code_font); // monofont
+ //_add_type("void");
+ //class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.signals[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(cd.signals[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<cd.signals[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(cd.signals[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(cd.signals[i].arguments[j].name);
+ if (cd.signals[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(cd.signals[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(cd.signals[i].arguments.size()?" )":")");
+ class_desc->pop();
+ class_desc->pop(); // end monofont
+ if (cd.signals[i].description!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ class_desc->add_text(" ");
+ _add_text(cd.signals[i].description);
+ class_desc->pop();
+
+ }
+ class_desc->add_newline();
+
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+
+ }
+
+ if (cd.constants.size()) {
+
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Constants:"));
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->push_indent(1);
+
+ class_desc->add_newline();
+ //class_desc->add_newline();
+
+ for(int i=0;i<cd.constants.size();i++) {
+
+ constant_line[cd.constants[i].name]=class_desc->get_line_count()-2;
+ class_desc->push_font(doc_code_font);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/base_type_color"));
+ _add_text(cd.constants[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(" = ");
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ _add_text(cd.constants[i].value);
+ class_desc->pop();
+ class_desc->pop();
+ if (cd.constants[i].description!="") {
+ class_desc->push_font(doc_font);
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/comment_color"));
+ _add_text(cd.constants[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ }
+
+ class_desc->add_newline();
+ }
+
+ class_desc->pop();
+ class_desc->add_newline();
+
+
+ }
+
+ if (cd.description!="") {
+
+ description_line=class_desc->get_line_count()-2;
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ }
+
+ if (property_descr) {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Property Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+
+ for(int i=0;i<cd.properties.size();i++) {
+
+ method_line[cd.properties[i].name]=class_desc->get_line_count()-2;
+
+ class_desc->push_font(doc_code_font);
+ _add_type(cd.properties[i].type);
+
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(cd.properties[i].name);
+ class_desc->pop(); //color
+
+ class_desc->add_text(" ");
+
+ class_desc->pop(); //font
+
+ if (cd.properties[i].setter!="") {
+
+ class_desc->push_font( doc_font );
+
+ class_desc->push_indent(2);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text("Setter: ");
+ class_desc->pop();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(cd.properties[i].setter+"(value)");
+ class_desc->pop(); //color
+
+ class_desc->pop(); //indent
+
+ class_desc->pop(); //font
+
+ }
+
+ if (cd.properties[i].getter!="") {
+
+ class_desc->push_font( doc_font );
+
+ class_desc->push_indent(2);
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text("Getter: ");
+ class_desc->pop();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->add_text(cd.properties[i].getter+"()");
+ class_desc->pop(); //color
+
+ class_desc->pop(); //indent
+
+ class_desc->pop(); //font
+
+ }
+
+ class_desc->add_newline();
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(cd.properties[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+ }
+
+ if (method_descr) {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->push_font(doc_title_font);
+ class_desc->add_text(TTR("Method Description:"));
+ class_desc->pop();
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+
+ for(int i=0;i<methods.size();i++) {
+
+ method_line[methods[i].name]=class_desc->get_line_count()-2;
+
+ class_desc->push_font(doc_code_font);
+ _add_type(methods[i].return_type);
+
+ class_desc->add_text(" ");
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ _add_text(methods[i].name);
+ class_desc->pop();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?"( ":"(");
+ class_desc->pop();
+ for(int j=0;j<methods[i].arguments.size();j++) {
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ if (j>0)
+ class_desc->add_text(", ");
+ _add_type(methods[i].arguments[j].type);
+ class_desc->add_text(" ");
+ _add_text(methods[i].arguments[j].name);
+ if (methods[i].arguments[j].default_value!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text("=");
+ class_desc->pop();
+ _add_text(methods[i].arguments[j].default_value);
+ }
+
+ class_desc->pop();
+ }
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/symbol_color"));
+ class_desc->add_text(methods[i].arguments.size()?" )":")");
+ class_desc->pop();
+ if (methods[i].qualifiers!="") {
+
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ class_desc->add_text(" ");
+ _add_text(methods[i].qualifiers);
+ class_desc->pop();
+
+ }
+
+ class_desc->pop();
+
+ class_desc->add_newline();
+ class_desc->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ class_desc->push_font( doc_font );
+ class_desc->push_indent(1);
+ _add_text(methods[i].description);
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->pop();
+ class_desc->add_newline();
+ class_desc->add_newline();
+ class_desc->add_newline();
+
+ }
+
+
+
+
+
+ }
+
+
+
+ scroll_locked=false;
+
+ return OK;
+}
+
+void EditorHelp::_request_help(const String& p_string) {
+ Error err = _goto_desc(p_string);
+ if (err==OK) {
+ editor->call("_editor_select",EditorNode::EDITOR_SCRIPT);
+ }
+ //100 palabras
+}
+
+
+void EditorHelp::_help_callback(const String& p_topic) {
+
+ String what = p_topic.get_slice(":",0);
+ String clss = p_topic.get_slice(":",1);
+ String name;
+ if (p_topic.get_slice_count(":")==3)
+ name=p_topic.get_slice(":",2);
+
+ _request_help(clss); //first go to class
+
+ int line=0;
+
+ if (what=="class_desc") {
+ line=description_line;
+ } else if (what=="class_signal") {
+ if (signal_line.has(name))
+ line=signal_line[name];
+ } else if (what=="class_method" || what=="class_method_desc") {
+ if (method_line.has(name))
+ line=method_line[name];
+ } else if (what=="class_property") {
+
+ if (property_line.has(name))
+ line=property_line[name];
+ } else if (what=="class_theme_item") {
+
+ if (theme_property_line.has(name))
+ line=theme_property_line[name];
+ } else if (what=="class_constant") {
+
+ if (constant_line.has(name))
+ line=constant_line[name];
+ }
+
+ class_desc->call_deferred("scroll_to_line", line);
+
+}
+
+
+
+static void _add_text_to_rt(const String& p_bbcode,RichTextLabel *p_rt) {
+
+ DocData *doc = EditorHelp::get_doc_data();
+ String base_path;
+
+ /*p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/text_color"));
+ p_rt->push_font( get_font("normal","Fonts") );
+ p_rt->push_indent(1);*/
+ int pos = 0;
+
+ Ref<Font> doc_font = p_rt->get_font("doc","EditorFonts");
+ Ref<Font> doc_code_font = p_rt->get_font("doc_source","EditorFonts");
+
+ String bbcode=p_bbcode.replace("\t"," ").replace("\r"," ").strip_edges();
+
+ //change newlines for double newlines
+ for(int i=0;i<bbcode.length();i++) {
+
+ //find valid newlines (double)
+ if (bbcode[i]=='\n') {
+ bool dnl=false;
+ int j=i+1;
+ for(;j<p_bbcode.length();j++) {
+ if (bbcode[j]==' ')
+ continue;
+ if (bbcode[j]=='\n') {
+ dnl=true;
+ break;
+ }
+ break;
+ }
+
+ if (dnl) {
+ bbcode[i]=0xFFFF;
+ //keep
+ i=j;
+ } else {
+ bbcode=bbcode.insert(i,"\n");
+ i++;
+ //bbcode[i]=' ';
+ //i=j-1;
+ }
+ }
+ }
+
+ //remove double spaces or spaces after newlines
+ for(int i=0;i<bbcode.length();i++) {
+
+ if (bbcode[i]==' ' || bbcode[i]=='\n' || bbcode[i]==0xFFFF) {
+
+ for(int j=i+1;j<p_bbcode.length();j++) {
+ if (bbcode[j]==' ') {
+ bbcode.remove(j);
+ j--;
+ continue;
+ } else {
+ break;
+ }
+ }
+ }
+ }
+
+ //change newlines to double newlines
+
+ CharType dnls[2]={0xFFFF,0};
+ bbcode=bbcode.replace(dnls,"\n");
+
+
+ List<String> tag_stack;
+
+ while(pos < bbcode.length()) {
+
+
+ int brk_pos = bbcode.find("[",pos);
+
+ if (brk_pos<0)
+ brk_pos=bbcode.length();
+
+ if (brk_pos > pos) {
+ p_rt->add_text(bbcode.substr(pos,brk_pos-pos));
+
+ }
+
+ if (brk_pos==bbcode.length())
+ break; //nothing else o add
+
+ int brk_end = bbcode.find("]",brk_pos+1);
+
+ if (brk_end==-1) {
+ //no close, add the rest
+ p_rt->add_text(bbcode.substr(brk_pos,bbcode.length()-brk_pos));
+
+ break;
+ }
+
+
+ String tag = bbcode.substr(brk_pos+1,brk_end-brk_pos-1);
+
+
+ if (tag.begins_with("/")) {
+ bool tag_ok = tag_stack.size() && tag_stack.front()->get()==tag.substr(1,tag.length());
+ if (tag_stack.size()) {
+
+
+
+ }
+ if (!tag_ok) {
+
+ p_rt->add_text("[");
+ pos++;
+ continue;
+ }
+
+ tag_stack.pop_front();
+ pos=brk_end+1;
+ if (tag!="/img")
+ p_rt->pop();
+
+ } else if (tag.begins_with("method ")) {
+
+ String m = tag.substr(7,tag.length());
+ p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ p_rt->push_meta("@"+m);
+ p_rt->add_text(m+"()");
+ p_rt->pop();
+ p_rt->pop();
+ pos=brk_end+1;
+
+ } else if (doc->class_list.has(tag)) {
+
+
+ p_rt->push_color(EditorSettings::get_singleton()->get("text_editor/highlighting/keyword_color"));
+ p_rt->push_meta("#"+tag);
+ p_rt->add_text(tag);
+ p_rt->pop();
+ p_rt->pop();
+ pos=brk_end+1;
+
+ } else if (tag=="b") {
+
+ //use bold font
+ p_rt->push_font(doc_code_font);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="i") {
+
+ //use italics font
+ Color text_color = EditorSettings::get_singleton()->get("text_editor/highlighting/text_color");
+ //no italics so emphasize with color
+ text_color.r*=1.1;
+ text_color.g*=1.1;
+ text_color.b*=1.1;
+ p_rt->push_color(text_color);
+ //p_rt->push_font(get_font("italic","Fonts"));
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="code" || tag=="codeblock") {
+
+ //use monospace font
+ p_rt->push_font(doc_code_font);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="center") {
+
+ //use monospace font
+ p_rt->push_align(RichTextLabel::ALIGN_CENTER);
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="br") {
+
+ //use monospace font
+ p_rt->add_newline();
+ pos=brk_end+1;
+ } else if (tag=="u") {
+
+ //use underline
+ p_rt->push_underline();
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag=="s") {
+
+ //use strikethrough (not supported underline instead)
+ p_rt->push_underline();
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+
+ } else if (tag=="url") {
+
+ //use strikethrough (not supported underline instead)
+ int end=bbcode.find("[",brk_end);
+ if (end==-1)
+ end=bbcode.length();
+ String url = bbcode.substr(brk_end+1,end-brk_end-1);
+ p_rt->push_meta(url);
+
+ pos=brk_end+1;
+ tag_stack.push_front(tag);
+ } else if (tag.begins_with("url=")) {
+
+ String url = tag.substr(4,tag.length());
+ p_rt->push_meta(url);
+ pos=brk_end+1;
+ tag_stack.push_front("url");
+ } else if (tag=="img") {
+
+ //use strikethrough (not supported underline instead)
+ int end=bbcode.find("[",brk_end);
+ if (end==-1)
+ end=bbcode.length();
+ String image = bbcode.substr(brk_end+1,end-brk_end-1);
+
+ Ref<Texture> texture = ResourceLoader::load(base_path+"/"+image,"Texture");
+ if (texture.is_valid())
+ p_rt->add_image(texture);
+
+ pos=end;
+ tag_stack.push_front(tag);
+ } else if (tag.begins_with("color=")) {
+
+ String col = tag.substr(6,tag.length());
+ Color color;
+
+ if (col.begins_with("#"))
+ color=Color::html(col);
+ else if (col=="aqua")
+ color=Color::html("#00FFFF");
+ else if (col=="black")
+ color=Color::html("#000000");
+ else if (col=="blue")
+ color=Color::html("#0000FF");
+ else if (col=="fuchsia")
+ color=Color::html("#FF00FF");
+ else if (col=="gray" || col=="grey")
+ color=Color::html("#808080");
+ else if (col=="green")
+ color=Color::html("#008000");
+ else if (col=="lime")
+ color=Color::html("#00FF00");
+ else if (col=="maroon")
+ color=Color::html("#800000");
+ else if (col=="navy")
+ color=Color::html("#000080");
+ else if (col=="olive")
+ color=Color::html("#808000");
+ else if (col=="purple")
+ color=Color::html("#800080");
+ else if (col=="red")
+ color=Color::html("#FF0000");
+ else if (col=="silver")
+ color=Color::html("#C0C0C0");
+ else if (col=="teal")
+ color=Color::html("#008008");
+ else if (col=="white")
+ color=Color::html("#FFFFFF");
+ else if (col=="yellow")
+ color=Color::html("#FFFF00");
+ else
+ color=Color(0,0,0,1); //base_color;
+
+
+
+ p_rt->push_color(color);
+ pos=brk_end+1;
+ tag_stack.push_front("color");
+
+ } else if (tag.begins_with("font=")) {
+
+ String fnt = tag.substr(5,tag.length());
+
+
+ Ref<Font> font = ResourceLoader::load(base_path+"/"+fnt,"Font");
+ if (font.is_valid())
+ p_rt->push_font(font);
+ else {
+ p_rt->push_font(doc_font);
+ }
+
+ pos=brk_end+1;
+ tag_stack.push_front("font");
+
+
+ } else {
+
+ p_rt->add_text("["); //ignore
+ pos=brk_pos+1;
+
+ }
+ }
+
+ /*p_rt->pop();
+ p_rt->pop();
+ p_rt->pop();*/
+
+}
+
+
+void EditorHelp::_add_text(const String& p_bbcode) {
+
+
+ _add_text_to_rt(p_bbcode,class_desc);
+
+}
+
+
+
+
+void EditorHelp::_update_doc() {
+
+
+
+}
+
+
+void EditorHelp::generate_doc() {
+
+ doc = memnew( DocData );
+ doc->generate(true);
+ DocData compdoc;
+ compdoc.load_compressed(_doc_data_compressed,_doc_data_compressed_size,_doc_data_uncompressed_size);
+ doc->merge_from(compdoc); //ensure all is up to date
+
+
+}
+
+void EditorHelp::_notification(int p_what) {
+
+
+ switch(p_what) {
+
+ case NOTIFICATION_READY: {
+
+
+ //forward->set_icon(get_icon("Forward","EditorIcons"));
+ //back->set_icon(get_icon("Back","EditorIcons"));
+ _update_doc();
+
+ } break;
+ }
+}
+
+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() {
+
+ return edited_class;
+}
+
+void EditorHelp::search_again() {
+ _search(prev_search);
+}
+
+int EditorHelp::get_scroll() const {
+
+ return class_desc->get_v_scroll()->get_value();
+}
+void EditorHelp::set_scroll(int p_scroll) {
+
+
+ class_desc->get_v_scroll()->set_value(p_scroll);
+
+}
+
+void EditorHelp::_bind_methods() {
+
+ ClassDB::bind_method("_class_list_select",&EditorHelp::_class_list_select);
+ ClassDB::bind_method("_class_desc_select",&EditorHelp::_class_desc_select);
+ ClassDB::bind_method("_class_desc_input",&EditorHelp::_class_desc_input);
+ //ClassDB::bind_method("_button_pressed",&EditorHelp::_button_pressed);
+ ClassDB::bind_method("_scroll_changed",&EditorHelp::_scroll_changed);
+ ClassDB::bind_method("_request_help",&EditorHelp::_request_help);
+ ClassDB::bind_method("_unhandled_key_input",&EditorHelp::_unhandled_key_input);
+ ClassDB::bind_method("_search",&EditorHelp::_search);
+ ClassDB::bind_method("_search_cbk",&EditorHelp::_search_cbk);
+ ClassDB::bind_method("_help_callback",&EditorHelp::_help_callback);
+
+ ADD_SIGNAL(MethodInfo("go_to_help"));
+
+}
+
+EditorHelp::EditorHelp() {
+
+ editor=EditorNode::get_singleton();
+
+ VBoxContainer *vbc = this;
+
+ EDITOR_DEF("text_editor/help/sort_functions_alphabetically",true);
+
+ //class_list->connect("meta_clicked",this,"_class_list_select");
+ //class_list->set_selection_enabled(true);
+
+ {
+ Panel *pc = memnew( Panel );
+ Ref<StyleBoxFlat> style( memnew( StyleBoxFlat ) );
+ style->set_bg_color( EditorSettings::get_singleton()->get("text_editor/highlighting/background_color") );
+ pc->set_v_size_flags(SIZE_EXPAND_FILL);
+ pc->add_style_override("panel", style); //get_stylebox("normal","TextEdit"));
+ 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->connect("gui_input",this,"_class_desc_input");
+ }
+
+ class_desc->get_v_scroll()->connect("value_changed",this,"_scroll_changed");
+ class_desc->set_selection_enabled(true);
+
+ scroll_locked=false;
+ select_locked=false;
+ set_process_unhandled_key_input(true);
+ class_desc->hide();
+
+ search_dialog = memnew( ConfirmationDialog );
+ add_child(search_dialog);
+ VBoxContainer *search_vb = memnew( VBoxContainer );
+ search_dialog->add_child(search_vb);
+
+ search = memnew( LineEdit );
+ search_dialog->register_text_enter(search);
+ search_vb->add_margin_child(TTR("Search Text"),search);
+ search_dialog->get_ok()->set_text(TTR("Find"));
+ search_dialog->connect("confirmed",this,"_search_cbk");
+ search_dialog->set_hide_on_ok(false);
+ search_dialog->set_self_modulate(Color(1,1,1,0.8));
+
+
+ /*class_search = memnew( EditorHelpSearch(editor) );
+ editor->get_gui_base()->add_child(class_search);
+ class_search->connect("go_to_help",this,"_help_callback");*/
+
+ //prev_search_page=-1;
+}
+
+EditorHelp::~EditorHelp() {
+
+}
+
+/////////////
+
+
+
+void EditorHelpBit::_go_to_help(String p_what) {
+
+ EditorNode::get_singleton()->set_visible_editor(EditorNode::EDITOR_SCRIPT);
+ ScriptEditor::get_singleton()->goto_help(p_what);
+ emit_signal("request_hide");
+}
+
+void EditorHelpBit::_meta_clicked(String p_select) {
+
+ //print_line("LINK: "+p_select);
+ if (p_select.begins_with("#")) {
+ //_goto_desc(p_select.substr(1,p_select.length()));
+ _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
+
+ _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]);
+ */
+ }
+
+ }
+
+
+}
+
+void EditorHelpBit::_bind_methods() {
+
+ ClassDB::bind_method("_meta_clicked",&EditorHelpBit::_meta_clicked);
+ ADD_SIGNAL(MethodInfo("request_hide"));
+}
+
+void EditorHelpBit::_notification(int p_what){
+
+ if (p_what==NOTIFICATION_ENTER_TREE) {
+ add_style_override("panel",get_stylebox("normal","TextEdit"));
+ }
+}
+
+
+void EditorHelpBit::set_text(const String& p_text) {
+
+ rich_text->clear();
+ _add_text_to_rt(p_text,rich_text);
+}
+
+EditorHelpBit::EditorHelpBit() {
+
+ rich_text = memnew( RichTextLabel );
+ add_child(rich_text);
+ rich_text->set_area_as_parent_rect(8*EDSCALE);
+ rich_text->connect("meta_clicked",this,"_meta_clicked");
+ set_custom_minimum_size(Size2(0,70*EDSCALE));
+
+}