Show documentation for properties on hover.

This works if the property has been documented (about half are at this point)
This commit is contained in:
Juan Linietsky 2015-08-25 23:00:11 -03:00
parent 04cb3c9eb1
commit d50921b550
7 changed files with 117 additions and 1 deletions

View file

@ -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;

View file

@ -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);

View file

@ -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;

View file

@ -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;

View file

@ -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();

View file

@ -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;
}

View file

@ -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();