[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21035] branches/blender2.5/blender/source /blender: Context

Brecht Van Lommel brecht at blender.org
Sat Jun 20 16:55:28 CEST 2009


Revision: 21035
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21035
Author:   blendix
Date:     2009-06-20 16:55:28 +0200 (Sat, 20 Jun 2009)

Log Message:
-----------
Context

Python dir(context) now gives the items from the data context
too, modified context callbacks to also return a list of items
in the context.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h
    branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
    branches/blender2.5/blender/source/blender/editors/screen/screen_context.c
    branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
    branches/blender2.5/blender/source/blender/editors/space_image/space_image.c
    branches/blender2.5/blender/source/blender/editors/space_node/space_node.c
    branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
    branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_context.h	2009-06-20 14:55:28 UTC (rev 21035)
@@ -126,12 +126,14 @@
 
 /* Data Context
 
-   - note: listbases consist of LinkData items and must be
-     freed with BLI_freelistN! */
+   - listbases consist of CollectionPointerLink items and must be
+     freed with BLI_freelistN!
+   - the dir listbase consits of LinkData items */
 
-PointerRNA CTX_data_pointer_get(bContext *C, const char *member);
-ListBase CTX_data_collection_get(bContext *C, const char *member);
-void CTX_data_get(bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb);
+PointerRNA CTX_data_pointer_get(const bContext *C, const char *member);
+ListBase CTX_data_collection_get(const bContext *C, const char *member);
+ListBase CTX_data_dir_get(const bContext *C);
+void CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb);
 
 void CTX_data_id_pointer_set(bContextDataResult *result, struct ID *id);
 void CTX_data_pointer_set(bContextDataResult *result, struct ID *id, StructRNA *type, void *data);
@@ -139,7 +141,10 @@
 void CTX_data_id_list_add(bContextDataResult *result, struct ID *id);
 void CTX_data_list_add(bContextDataResult *result, struct ID *id, StructRNA *type, void *data);
 
+void CTX_data_dir_set(bContextDataResult *result, const char **member);
+
 int CTX_data_equals(const char *member, const char *str);
+int CTX_data_dir(const char *member);
 
 /*void CTX_data_pointer_set(bContextDataResult *result, void *data);
 void CTX_data_list_add(bContextDataResult *result, void *data);*/

Modified: branches/blender2.5/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/blenkernel/intern/context.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -280,6 +280,7 @@
 struct bContextDataResult {
 	PointerRNA ptr;
 	ListBase list;
+	const char **dir;
 };
 
 static int ctx_data_get(bContext *C, const char *member, bContextDataResult *result)
@@ -360,7 +361,7 @@
 	return 0;
 }
 
-PointerRNA CTX_data_pointer_get(bContext *C, const char *member)
+PointerRNA CTX_data_pointer_get(const bContext *C, const char *member)
 {
 	bContextDataResult result;
 
@@ -375,7 +376,7 @@
 
 }
 
-ListBase CTX_data_collection_get(bContext *C, const char *member)
+ListBase CTX_data_collection_get(const bContext *C, const char *member)
 {
 	bContextDataResult result;
 
@@ -389,7 +390,7 @@
 	}
 }
 
-void CTX_data_get(bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb)
+void CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb)
 {
 	bContextDataResult result;
 
@@ -403,11 +404,75 @@
 	}
 }
 
+static void data_dir_add(ListBase *lb, const char *member)
+{
+	LinkData *link;
+
+	if(strcmp(member, "scene") == 0) /* exception */
+		return;
+
+	for(link=lb->first; link; link=link->next)
+		if(strcmp(link->data, member) == 0)
+			return;
+	
+	link= MEM_callocN(sizeof(LinkData), "LinkData");
+	link->data= (void*)member;
+	BLI_addtail(lb, link);
+}
+
+ListBase CTX_data_dir_get(const bContext *C)
+{
+	bContextDataResult result;
+	ListBase lb;
+	int a;
+
+	memset(&lb, 0, sizeof(lb));
+
+	if(C->wm.store) {
+		bContextStoreEntry *entry;
+
+		for(entry=C->wm.store->entries.first; entry; entry=entry->next)
+			data_dir_add(&lb, entry->name);
+	}
+	if(C->wm.region && C->wm.region->type && C->wm.region->type->context) {
+		memset(&result, 0, sizeof(result));
+		C->wm.region->type->context(C, "", &result);
+
+		if(result.dir)
+			for(a=0; result.dir[a]; a++)
+				data_dir_add(&lb, result.dir[a]);
+	}
+	if(C->wm.area && C->wm.area->type && C->wm.area->type->context) {
+		memset(&result, 0, sizeof(result));
+		C->wm.area->type->context(C, "", &result);
+
+		if(result.dir)
+			for(a=0; result.dir[a]; a++)
+				data_dir_add(&lb, result.dir[a]);
+	}
+	if(C->wm.screen && C->wm.screen->context) {
+		bContextDataCallback cb= C->wm.screen->context;
+		memset(&result, 0, sizeof(result));
+		cb(C, "", &result);
+
+		if(result.dir)
+			for(a=0; result.dir[a]; a++)
+				data_dir_add(&lb, result.dir[a]);
+	}
+
+	return lb;
+}
+
 int CTX_data_equals(const char *member, const char *str)
 {
 	return (strcmp(member, str) == 0);
 }
 
+int CTX_data_dir(const char *member)
+{
+	return (strcmp(member, "") == 0);
+}
+
 void CTX_data_id_pointer_set(bContextDataResult *result, ID *id)
 {
 	RNA_id_pointer_create(id, &result->ptr);
@@ -451,6 +516,11 @@
 		return 0;
 }
 
+void CTX_data_dir_set(bContextDataResult *result, const char **dir)
+{
+	result->dir= dir;
+}
+
 /* data context */
 
 Main *CTX_data_main(const bContext *C)

Modified: branches/blender2.5/blender/source/blender/editors/screen/screen_context.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/screen/screen_context.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/screen/screen_context.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -42,7 +42,15 @@
 	Scene *scene= sc->scene;
 	Base *base;
 
-	if(CTX_data_equals(member, "scene")) {
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {
+			"scene", "selected_objects", "selected_bases", "active_base",
+			"active_object", "edit_object", NULL};
+
+		CTX_data_dir_set(result, dir);
+		return 1;
+	}
+	else if(CTX_data_equals(member, "scene")) {
 		CTX_data_id_pointer_set(result, &scene->id);
 		return 1;
 	}

Modified: branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/space_buttons/buttons_context.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -492,8 +492,17 @@
 		return 0;
 
 	/* here we handle context, getting data from precomputed path */
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {
+			"world", "object", "meshe", "armature", "lattice", "curve",
+			"meta_ball", "lamp", "camera", "material", "material_slot",
+			"texture", "texture_slot", "bone", "edit_bone", "particle_system",
+			"cloth", "soft_body", "fluid", NULL};
 
-	if(CTX_data_equals(member, "world")) {
+		CTX_data_dir_set(result, dir);
+		return 1;
+	}
+	else if(CTX_data_equals(member, "world")) {
 		set_pointer_type(path, result, &RNA_World);
 		return 1;
 	}

Modified: branches/blender2.5/blender/source/blender/editors/space_image/space_image.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_image/space_image.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/space_image/space_image.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -301,7 +301,11 @@
 {
 	SpaceImage *sima= (SpaceImage*)CTX_wm_space_data(C);
 
-	if(CTX_data_equals(member, "edit_image")) {
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {"edit_image", NULL};
+		CTX_data_dir_set(result, dir);
+	}
+	else if(CTX_data_equals(member, "edit_image")) {
 		CTX_data_id_pointer_set(result, (ID*)ED_space_image(sima));
 		return 1;
 	}

Modified: branches/blender2.5/blender/source/blender/editors/space_node/space_node.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_node/space_node.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/space_node/space_node.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -283,7 +283,12 @@
 {
 	SpaceNode *snode= (SpaceNode*)CTX_wm_space_data(C);
 	
-	if(CTX_data_equals(member, "selected_nodes")) {
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {"selected_nodes", NULL};
+		CTX_data_dir_set(result, dir);
+		return 1;
+	}
+	else if(CTX_data_equals(member, "selected_nodes")) {
 		bNode *node;
 		
 		for(next_node(snode->edittree); (node=next_node(NULL));) {

Modified: branches/blender2.5/blender/source/blender/editors/space_text/space_text.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_text/space_text.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/space_text/space_text.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -293,7 +293,12 @@
 {
 	SpaceText *st= CTX_wm_space_text(C);
 
-	if(CTX_data_equals(member, "edit_text")) {
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {"edit_text", NULL};
+		CTX_data_dir_set(result, dir);
+		return 1;
+	}
+	else if(CTX_data_equals(member, "edit_text")) {
 		CTX_data_id_pointer_set(result, &st->text->id);
 		return 1;
 	}

Modified: branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c	2009-06-20 14:53:30 UTC (rev 21034)
+++ branches/blender2.5/blender/source/blender/editors/space_view3d/space_view3d.c	2009-06-20 14:55:28 UTC (rev 21035)
@@ -565,7 +565,17 @@
 
 	if(v3d==NULL) return 0;
 
-	if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
+	if(CTX_data_dir(member)) {
+		static const char *dir[] = {
+			"selected_objects", "selected_bases" "selected_editable_objects",
+			"selected_editable_bases" "visible_objects", "visible_bases",
+			"active_base", "active_object", "visible_bones", "editable_bones",
+			"selected_bones", "selected_editable_bones" "visible_pchans",
+			"selected_pchans", "active_bone", "active_pchan", NULL};
+
+		CTX_data_dir_set(result, dir);
+	}
+	else if(CTX_data_equals(member, "selected_objects") || CTX_data_equals(member, "selected_bases")) {
 		int selected_objects= CTX_data_equals(member, "selected_objects");
 
 		for(base=scene->base.first; base; base=base->next) {

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_rna.c
===================================================================

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list