[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [53154] trunk/blender/source/blender: improve info view property output for properties.
Campbell Barton
ideasman42 at gmail.com
Wed Dec 19 03:09:01 CET 2012
Revision: 53154
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=53154
Author: campbellbarton
Date: 2012-12-19 02:08:58 +0000 (Wed, 19 Dec 2012)
Log Message:
-----------
improve info view property output for properties.
- Include RNA properties when checking for matches.
- Don't include the context's property store (these are normally set by the UI code and not accessible by a script author)
Note: added CTX_data_dir_get_ex() which has options for returning different members from the context.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_context.h
trunk/blender/source/blender/blenkernel/intern/context.c
trunk/blender/source/blender/windowmanager/intern/wm_operators.c
Modified: trunk/blender/source/blender/blenkernel/BKE_context.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_context.h 2012-12-19 01:49:58 UTC (rev 53153)
+++ trunk/blender/source/blender/blenkernel/BKE_context.h 2012-12-19 02:08:58 UTC (rev 53154)
@@ -185,6 +185,7 @@
PointerRNA CTX_data_pointer_get(const bContext *C, const char *member);
PointerRNA CTX_data_pointer_get_type(const bContext *C, const char *member, StructRNA *type);
ListBase CTX_data_collection_get(const bContext *C, const char *member);
+ListBase CTX_data_dir_get_ex(const bContext *C, const short use_store, const short use_rna, const short use_all);
ListBase CTX_data_dir_get(const bContext *C);
int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb, short *r_type);
Modified: trunk/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/context.c 2012-12-19 01:49:58 UTC (rev 53153)
+++ trunk/blender/source/blender/blenkernel/intern/context.c 2012-12-19 02:08:58 UTC (rev 53154)
@@ -427,11 +427,11 @@
return ret;
}
-static void data_dir_add(ListBase *lb, const char *member)
+static void data_dir_add(ListBase *lb, const char *member, const short use_all)
{
LinkData *link;
- if (strcmp(member, "scene") == 0) /* exception */
+ if ((use_all == FALSE) && strcmp(member, "scene") == 0) /* exception */
return;
if (BLI_findstring(lb, member, offsetof(LinkData, data)))
@@ -442,7 +442,13 @@
BLI_addtail(lb, link);
}
-ListBase CTX_data_dir_get(const bContext *C)
+/**
+ * \param C Context
+ * \param use_store Use 'C->wm.store'
+ * \param use_rna Use Include the properties from 'RNA_Context'
+ * \param use_all Don't skip values (currently only "scene")
+ */
+ListBase CTX_data_dir_get_ex(const bContext *C, const short use_store, const short use_rna, const short use_all)
{
bContextDataResult result;
ListBase lb;
@@ -453,11 +459,33 @@
memset(&lb, 0, sizeof(lb));
- if (C->wm.store) {
+ if (use_rna) {
+ char name[256], *nameptr;
+ int namelen;
+
+ PropertyRNA *iterprop;
+ PointerRNA ctx_ptr;
+ RNA_pointer_create(NULL, &RNA_Context, (void *)C, &ctx_ptr);
+
+ iterprop = RNA_struct_iterator_property(ctx_ptr.type);
+
+ RNA_PROP_BEGIN (&ctx_ptr, itemptr, iterprop)
+ {
+ nameptr = RNA_struct_name_get_alloc(&itemptr, name, sizeof(name), &namelen);
+ data_dir_add(&lb, name, use_all);
+ if (nameptr) {
+ if (name != nameptr) {
+ MEM_freeN(nameptr);
+ }
+ }
+ }
+ RNA_PROP_END;
+ }
+ if (use_store && C->wm.store) {
bContextStoreEntry *entry;
for (entry = C->wm.store->entries.first; entry; entry = entry->next)
- data_dir_add(&lb, entry->name);
+ data_dir_add(&lb, entry->name, use_all);
}
if ((ar = CTX_wm_region(C)) && ar->type && ar->type->context) {
memset(&result, 0, sizeof(result));
@@ -465,7 +493,7 @@
if (result.dir)
for (a = 0; result.dir[a]; a++)
- data_dir_add(&lb, result.dir[a]);
+ data_dir_add(&lb, result.dir[a], use_all);
}
if ((sa = CTX_wm_area(C)) && sa->type && sa->type->context) {
memset(&result, 0, sizeof(result));
@@ -473,7 +501,7 @@
if (result.dir)
for (a = 0; result.dir[a]; a++)
- data_dir_add(&lb, result.dir[a]);
+ data_dir_add(&lb, result.dir[a], use_all);
}
if ((sc = CTX_wm_screen(C)) && sc->context) {
bContextDataCallback cb = sc->context;
@@ -482,12 +510,17 @@
if (result.dir)
for (a = 0; result.dir[a]; a++)
- data_dir_add(&lb, result.dir[a]);
+ data_dir_add(&lb, result.dir[a], use_all);
}
return lb;
}
+ListBase CTX_data_dir_get(const bContext *C)
+{
+ return CTX_data_dir_get_ex(C, TRUE, FALSE, FALSE);
+}
+
int CTX_data_equals(const char *member, const char *str)
{
return (strcmp(member, str) == 0);
Modified: trunk/blender/source/blender/windowmanager/intern/wm_operators.c
===================================================================
--- trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2012-12-19 01:49:58 UTC (rev 53153)
+++ trunk/blender/source/blender/windowmanager/intern/wm_operators.c 2012-12-19 02:08:58 UTC (rev 53154)
@@ -570,7 +570,8 @@
* - see if the pointers ID is in the context.
*/
- ListBase lb = CTX_data_dir_get(C);
+ /* don't get from the context store since this is normally set only for the UI and not usable elsewhere */
+ ListBase lb = CTX_data_dir_get_ex(C, FALSE, TRUE, TRUE);
LinkData *link;
const char *member_found = NULL;
@@ -582,21 +583,21 @@
for (link = lb.first; link; link = link->next) {
const char *identifier = link->data;
- PointerRNA ctx_ptr = CTX_data_pointer_get(C, identifier);
+ PointerRNA ctx_item_ptr = CTX_data_pointer_get(C, identifier);
- if (ctx_ptr.type == NULL) {
+ if (ctx_item_ptr.type == NULL) {
continue;
}
- if (ptr->id.data == ctx_ptr.id.data) {
- if ((ptr->data == ctx_ptr.data) &&
- (ptr->type == ctx_ptr.type))
+ if (ptr->id.data == ctx_item_ptr.id.data) {
+ if ((ptr->data == ctx_item_ptr.data) &&
+ (ptr->type == ctx_item_ptr.type))
{
/* found! */
member_found = identifier;
break;
}
- else if (RNA_struct_is_ID(ctx_ptr.type)) {
+ else if (RNA_struct_is_ID(ctx_item_ptr.type)) {
/* we found a reference to this ID,
* so fallback to it if there is no direct reference */
member_id = identifier;
@@ -604,15 +605,6 @@
}
}
- /* grr, CTX_data_dir_get skips scene */
- if ((member_id == NULL) &&
- (ptr->id.data != NULL) &&
- (GS(((ID *)ptr->id.data)->name) == ID_SCE) &&
- (CTX_data_scene(C) == ptr->id.data))
- {
- member_id = "scene";
- }
-
if (member_found) {
prop_str = RNA_path_property_py(ptr, prop, index);
if (prop_str) {
More information about the Bf-blender-cvs
mailing list