[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