From ad07fc19c0fb97540bfe8d259c0b39098b9d7b9b Mon Sep 17 00:00:00 2001 From: Brecht Van Lommel Date: Sat, 20 Jun 2009 14:55:28 +0000 Subject: 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. --- source/blender/blenkernel/BKE_context.h | 15 ++++-- source/blender/blenkernel/intern/context.c | 76 ++++++++++++++++++++++++++++-- 2 files changed, 83 insertions(+), 8 deletions(-) (limited to 'source/blender/blenkernel') diff --git a/source/blender/blenkernel/BKE_context.h b/source/blender/blenkernel/BKE_context.h index 6a43f4ca25c..898b84ecdc3 100644 --- a/source/blender/blenkernel/BKE_context.h +++ b/source/blender/blenkernel/BKE_context.h @@ -126,12 +126,14 @@ void CTX_wm_menu_set(bContext *C, struct ARegion *menu); /* 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_pointer_set(bContextDataResult *result, struct ID *id, StructRNA * 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);*/ diff --git a/source/blender/blenkernel/intern/context.c b/source/blender/blenkernel/intern/context.c index ae541365b1e..12deec838a8 100644 --- a/source/blender/blenkernel/intern/context.c +++ b/source/blender/blenkernel/intern/context.c @@ -280,6 +280,7 @@ void CTX_wm_menu_set(bContext *C, ARegion *menu) 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 @@ static int ctx_data_collection_get(const bContext *C, const char *member, ListBa 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 @@ PointerRNA CTX_data_pointer_get(bContext *C, const char *member) } -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 @@ 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) +void CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, ListBase *r_lb) { bContextDataResult result; @@ -403,11 +404,75 @@ void CTX_data_get(bContext *C, const char *member, PointerRNA *r_ptr, ListBase * } } +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 @@ int ctx_data_list_count(const bContext *C, int (*func)(const bContext*, ListBase return 0; } +void CTX_data_dir_set(bContextDataResult *result, const char **dir) +{ + result->dir= dir; +} + /* data context */ Main *CTX_data_main(const bContext *C) -- cgit v1.2.3