Browse Source

Show documentation for properties on hover.
This works if the property has been documented (about half are at this point)

Juan Linietsky 10 years ago
parent
commit
d50921b550

+ 19 - 0
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;

+ 3 - 1
core/object_type_db.h

@@ -475,7 +475,9 @@ public:
 	static void get_integer_constant_list(const StringName& p_type, List<String> *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);
 

+ 32 - 0
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<length();i++) {
+		if (i-from>=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 (from<length()) {
+		ret+=substr(from,length());
+	}
+
+	return ret;
+}
+
 String String::c_unescape() const {
 
 	String escaped=*this;

+ 1 - 0
core/ustring.h

@@ -209,6 +209,7 @@ public:
 	String xml_unescape() const;
 	String c_escape() const;
 	String c_unescape() const;
+	String world_wrap(int p_chars_per_line) const;
 	
 	String percent_encode() const;
 	String percent_decode() const;

+ 1 - 0
tools/editor/editor_node.cpp

@@ -4835,6 +4835,7 @@ EditorNode::EditorNode() {
 	property_editor->set_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();
 

+ 55 - 0
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<String,DocData::ClassDoc>::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<StringName,Map<StringName,String> >::Element *E=descr_cache.find(type);
+				if (E) {
+
+					Map<StringName,String>::Element *F=E->get().find(setter);
+					if (F) {
+						found=true;
+						descr=F->get();
+					}
+				}
+				if (!found) {
+
+					DocData *dd=EditorHelp::get_doc_data();
+					Map<String,DocData::ClassDoc>::Element *E=dd->class_list.find(type);
+					if (E) {
+						for(int i=0;i<E->get().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;
 	
 }
 

+ 6 - 0
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<String,String> pending;
 	String selected_property;
+
+	Map<StringName,Map<StringName,String> > descr_cache;
+	Map<StringName,String > 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();