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. @@

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to