From d50921b55089e0396ee5f11675b6093dd49b7cbb Mon Sep 17 00:00:00 2001 From: Juan Linietsky Date: Tue, 25 Aug 2015 23:00:11 -0300 Subject: [PATCH] Show documentation for properties on hover. This works if the property has been documented (about half are at this point) --- core/object_type_db.cpp | 19 +++++++++++ core/object_type_db.h | 4 ++- core/ustring.cpp | 32 +++++++++++++++++++ core/ustring.h | 1 + tools/editor/editor_node.cpp | 1 + tools/editor/property_editor.cpp | 55 ++++++++++++++++++++++++++++++++ tools/editor/property_editor.h | 6 ++++ 7 files changed, 117 insertions(+), 1 deletion(-) diff --git a/core/object_type_db.cpp b/core/object_type_db.cpp index c2917145737..a64b3d27151 100644 --- a/core/object_type_db.cpp +++ b/core/object_type_db.cpp @@ -746,6 +746,25 @@ bool ObjectTypeDB::has_method(StringName p_type,StringName p_method,bool p_no_in } +bool ObjectTypeDB::get_setter_and_type_for_property(const StringName& p_class, const StringName& p_prop, StringName& r_class, StringName& r_setter) { + + TypeInfo *type=types.getptr(p_class); + TypeInfo *check=type; + while(check) { + + if (check->property_setget.has(p_prop)) { + r_class=check->name; + r_setter=check->property_setget[p_prop].setter; + return true; + } + + check=check->inherits_ptr; + } + + return false; + +} + #ifdef DEBUG_METHODS_ENABLED MethodBind* ObjectTypeDB::bind_methodfi(uint32_t p_flags, MethodBind *p_bind , const MethodDefinition &method_name, const Variant **p_defs, int p_defcount) { StringName mdname=method_name.name; diff --git a/core/object_type_db.h b/core/object_type_db.h index caa5baddd5a..bfa0f921e50 100644 --- a/core/object_type_db.h +++ b/core/object_type_db.h @@ -475,7 +475,9 @@ public: static void get_integer_constant_list(const StringName& p_type, List *p_constants, bool p_no_inheritance=false); static int get_integer_constant(const StringName& p_type, const StringName &p_name, bool *p_success=NULL); static StringName get_category(const StringName& p_node); - + + static bool get_setter_and_type_for_property(const StringName& p_class, const StringName& p_prop, StringName& r_class, StringName& r_setter); + static void set_type_enabled(StringName p_type,bool p_enable); static bool is_type_enabled(StringName p_type); diff --git a/core/ustring.cpp b/core/ustring.cpp index 3cfc1e4a3c0..32ef1eb5ff9 100644 --- a/core/ustring.cpp +++ b/core/ustring.cpp @@ -3048,6 +3048,38 @@ bool String::is_valid_identifier() const { //kind of poor should be rewritten properly +String String::world_wrap(int p_chars_per_line) const { + + int from=0; + int last_space=0; + String ret; + for(int i=0;i=p_chars_per_line) { + if (last_space==-1) { + ret+=substr(from,i-from+1)+"\n"; + from=i+1; + } else { + ret+=substr(from,last_space-from)+"\n"; + i=last_space; + from=i+1; + } + last_space=-1; + } else if (operator[](i)==' ' || operator[](i)=='\t') { + last_space=i; + } else if (operator[](i)=='\n') { + ret+=substr(from,i-from); + from=i+1; + last_space=-1; + } + } + + if (fromset_autoclear(true); property_editor->set_show_categories(true); property_editor->set_v_size_flags(Control::SIZE_EXPAND_FILL); + property_editor->set_use_doc_hints(true); property_editor->hide_top_label(); diff --git a/tools/editor/property_editor.cpp b/tools/editor/property_editor.cpp index 62cafc039ad..39b9c72313f 100644 --- a/tools/editor/property_editor.cpp +++ b/tools/editor/property_editor.cpp @@ -41,6 +41,7 @@ #include "editor_node.h" #include "multi_node_edit.h" #include "array_property_edit.h" +#include "editor_help.h" void CustomPropertyEditor::_notification(int p_what) { @@ -2214,6 +2215,23 @@ void PropertyEditor::update_tree() { sep->set_selectable(1,false); sep->set_custom_bg_color(0,get_color("prop_category","Editor")); sep->set_custom_bg_color(1,get_color("prop_category","Editor")); + + if (use_doc_hints) { + StringName type=p.name; + if (!class_descr_cache.has(type)) { + + String descr; + DocData *dd=EditorHelp::get_doc_data(); + Map::Element *E=dd->class_list.find(type); + if (E) { + descr=E->get().brief_description; + } + class_descr_cache[type]=descr.world_wrap(80); + + } + + sep->set_tooltip(0,"Class: "+p.name+":\n\n"+class_descr_cache[type]); + } //sep->set_custom_color(0,Color(1,1,1)); @@ -2267,6 +2285,42 @@ void PropertyEditor::update_tree() { item->set_tooltip(0, p.name); + if (use_doc_hints) { + StringName setter; + StringName type; + if (ObjectTypeDB::get_setter_and_type_for_property(obj->get_type_name(),p.name,type,setter)) { + + String descr; + bool found=false; + Map >::Element *E=descr_cache.find(type); + if (E) { + + Map::Element *F=E->get().find(setter); + if (F) { + found=true; + descr=F->get(); + } + } + if (!found) { + + DocData *dd=EditorHelp::get_doc_data(); + Map::Element *E=dd->class_list.find(type); + if (E) { + for(int i=0;iget().methods.size();i++) { + if (E->get().methods[i].name==setter.operator String()) { + descr=E->get().methods[i].description.strip_edges().world_wrap(80); + } + } + } + + descr_cache[type][setter]=descr; + } + + item->set_tooltip(0, "Property: "+p.name+"\n\n"+descr); + } + } + //EditorHelp::get_doc_data(); + Dictionary d; d["name"]=p.name; d["type"]=(int)p.type; @@ -3277,6 +3331,7 @@ PropertyEditor::PropertyEditor() { read_only=false; show_categories=false; refresh_countdown=0; + use_doc_hints=false; } diff --git a/tools/editor/property_editor.h b/tools/editor/property_editor.h index de5cac87110..36ecc794ed8 100644 --- a/tools/editor/property_editor.h +++ b/tools/editor/property_editor.h @@ -95,6 +95,7 @@ class CustomPropertyEditor : public Popup { Button *checks20[20]; + Control *easing_draw; Object* owner; @@ -157,9 +158,13 @@ class PropertyEditor : public Control { bool read_only; bool show_categories; float refresh_countdown; + bool use_doc_hints; HashMap pending; String selected_property; + + Map > descr_cache; + Map class_descr_cache; CustomPropertyEditor *custom_editor; @@ -217,6 +222,7 @@ public: void set_autoclear(bool p_enable); void set_show_categories(bool p_show); + void set_use_doc_hints(bool p_enable) { use_doc_hints=p_enable; } PropertyEditor(); ~PropertyEditor();