Context
authorBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 20 Jun 2009 14:55:28 +0000 (14:55 +0000)
committerBrecht Van Lommel <brechtvanlommel@pandora.be>
Sat, 20 Jun 2009 14:55:28 +0000 (14:55 +0000)
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
source/blender/blenkernel/intern/context.c
source/blender/editors/screen/screen_context.c
source/blender/editors/space_buttons/buttons_context.c
source/blender/editors/space_image/space_image.c
source/blender/editors/space_node/space_node.c
source/blender/editors/space_text/space_text.c
source/blender/editors/space_view3d/space_view3d.c
source/blender/python/intern/bpy_rna.c

index 6a43f4ca25c99b0e91efb8e205bc4e3328aeeee1..898b84ecdc3cab9560e8631f8eeabd1e9000a503 100644 (file)
@@ -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);*/
index ae541365b1ebd5a384e529da08240724a0629a48..12deec838a8bd9ce6bf757a7e2c0d164592df2a5 100644 (file)
@@ -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)
index 11d1d019005a641824f720212903c9703b5b5650..1ea6f8baceb05e1e4a2b48989541b39fd0d21fff 100644 (file)
@@ -42,7 +42,15 @@ int ed_screen_context(const bContext *C, const char *member, bContextDataResult
        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;
        }
index fc280d9b5515ce65a90b22a6b8a760cd3f56241d..d97b4acdb96540797e0a1beb6e74e3c790de92f0 100644 (file)
@@ -492,8 +492,17 @@ int buttons_context(const bContext *C, const char *member, bContextDataResult *r
                return 0;
 
        /* here we handle context, getting data from precomputed path */
-
-       if(CTX_data_equals(member, "world")) {
+       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};
+
+               CTX_data_dir_set(result, dir);
+               return 1;
+       }
+       else if(CTX_data_equals(member, "world")) {
                set_pointer_type(path, result, &RNA_World);
                return 1;
        }
index e12f3bfe3578ef914043258021637cd64c47fa48..49f950fe67b8ebee18cb4680ab0e45e4c2cfdca1 100644 (file)
@@ -301,7 +301,11 @@ static int image_context(const bContext *C, const char *member, bContextDataResu
 {
        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;
        }
index 775f46b8e04f9e338023b38502039a4377e034d4..ac3a884c5f822aa54f326cd7d9b80ac3100f06bb 100644 (file)
@@ -283,7 +283,12 @@ static int node_context(const bContext *C, const char *member, bContextDataResul
 {
        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));) {
index d3c3b78cc504f6e46476e20592d4779fb71cdb48..8759fd00f74481e9c197471f218e735584bd3285 100644 (file)
@@ -293,7 +293,12 @@ static int text_context(const bContext *C, const char *member, bContextDataResul
 {
        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;
        }
index 6e33b1dcaabdef06ca1df958d9303841ae5abd02..2d6a57d5a34673d6c098ec1a8f1aa085fa0827e6 100644 (file)
@@ -565,7 +565,17 @@ static int view3d_context(const bContext *C, const char *member, bContextDataRes
 
        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) {
index e4c17e080b7303502f24dfcad3967728e542a3e3..f28f00e9c0254397eeac3ee10ef7aab366012cee 100644 (file)
@@ -875,6 +875,19 @@ static PyObject *pyrna_struct_dir(BPy_StructRNA * self)
 
                RNA_property_collection_end(&iter);
        }
+
+       if(self->ptr.type == &RNA_Context) {
+               ListBase lb = CTX_data_dir_get(self->ptr.data);
+               LinkData *link;
+
+               for(link=lb.first; link; link=link->next) {
+                       pystring = PyUnicode_FromString(link->data);
+                       PyList_Append(ret, pystring);
+                       Py_DECREF(pystring);
+               }
+
+               BLI_freelistN(&lb);
+       }
        
        return ret;
 }