Revision: 28401
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28401
Author:   campbellbarton
Date:     2010-04-24 21:26:05 +0200 (Sat, 24 Apr 2010)

Log Message:
-----------
py api: fix for context returning None for an empty list such as 
'context.selected_objects', now returns []

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_context.h
    trunk/blender/source/blender/blenkernel/intern/context.c
    trunk/blender/source/blender/editors/screen/screen_context.c
    trunk/blender/source/blender/editors/space_node/space_node.c
    trunk/blender/source/blender/editors/space_view3d/space_view3d.c
    trunk/blender/source/blender/python/intern/bpy_rna.c

Modified: trunk/blender/source/blender/blenkernel/BKE_context.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_context.h       2010-04-24 
18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/blenkernel/BKE_context.h       2010-04-24 
19:26:05 UTC (rev 28401)
@@ -170,11 +170,17 @@
         freed with BLI_freelistN!
    - the dir listbase consits of LinkData items */
 
+/* data type, needed so we can tell between a NULL pointer and an empty list */
+enum {
+       CTX_DATA_TYPE_POINTER = 0,
+       CTX_DATA_TYPE_COLLECTION
+};
+
 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(const bContext *C);
-int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, 
ListBase *r_lb);
+int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, 
ListBase *r_lb, short *r_type);
 
 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);
@@ -184,6 +190,9 @@
 
 void CTX_data_dir_set(bContextDataResult *result, const char **member);
 
+void CTX_data_type_set(struct bContextDataResult *result, short type);
+short CTX_data_type_get(struct bContextDataResult *result);
+
 int CTX_data_equals(const char *member, const char *str);
 int CTX_data_dir(const char *member);
 

Modified: trunk/blender/source/blender/blenkernel/intern/context.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/context.c    2010-04-24 
18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/blenkernel/intern/context.c    2010-04-24 
19:26:05 UTC (rev 28401)
@@ -404,6 +404,7 @@
        PointerRNA ptr;
        ListBase list;
        const char **dir;
+       short type; /* 0: normal, 1: seq */
 };
 
 static int ctx_data_get(bContext *C, const char *member, bContextDataResult 
*result)
@@ -548,7 +549,7 @@
 }
 
 /* 1:found,  -1:found but not set,  0:not found */
-int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, 
ListBase *r_lb)
+int CTX_data_get(const bContext *C, const char *member, PointerRNA *r_ptr, 
ListBase *r_lb, short *r_type)
 {
        bContextDataResult result;
        int ret= ctx_data_get((bContext*)C, member, &result);
@@ -556,10 +557,12 @@
        if(ret==1) {
                *r_ptr= result.ptr;
                *r_lb= result.list;
+               *r_type= result.type;
        }
        else {
                memset(r_ptr, 0, sizeof(*r_ptr));
                memset(r_lb, 0, sizeof(*r_lb));
+               *r_type= 0;
        }
 
        return ret;
@@ -682,6 +685,16 @@
        result->dir= dir;
 }
 
+void CTX_data_type_set(bContextDataResult *result, short type)
+{
+       result->type= type;
+}
+
+short CTX_data_type_get(bContextDataResult *result)
+{
+       return result->type;
+}
+
 /* data context */
 
 Main *CTX_data_main(const bContext *C)

Modified: trunk/blender/source/blender/editors/screen/screen_context.c
===================================================================
--- trunk/blender/source/blender/editors/screen/screen_context.c        
2010-04-24 18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/editors/screen/screen_context.c        
2010-04-24 19:26:05 UTC (rev 28401)
@@ -86,7 +86,7 @@
                                        CTX_data_list_add(result, &scene->id, 
&RNA_ObjectBase, base);
                        }
                }
-
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selected_objects") || 
CTX_data_equals(member, "selected_bases")) {
@@ -100,7 +100,7 @@
                                        CTX_data_list_add(result, &scene->id, 
&RNA_ObjectBase, base);
                        }
                }
-
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selected_editable_objects") || 
CTX_data_equals(member, "selected_editable_bases")) {
@@ -118,7 +118,7 @@
                                }
                        }
                }
-
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "visible_bones") || 
CTX_data_equals(member, "editable_bones")) {
@@ -159,7 +159,7 @@
                                        }
                                }
                        }       
-                       
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                        return 1;
                }
        }
@@ -201,7 +201,7 @@
                                        }
                                }
                        }       
-                       
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                        return 1;
                }
        }
@@ -216,7 +216,7 @@
                                        CTX_data_list_add(result, &obact->id, 
&RNA_PoseBone, pchan);
                                }
                        }
-                       
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                        return 1;
                }
        }
@@ -232,7 +232,7 @@
                                                CTX_data_list_add(result, 
&obact->id, &RNA_PoseBone, pchan);
                                }
                        }
-                       
+                       CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                        return 1;
                }
        }

Modified: trunk/blender/source/blender/editors/space_node/space_node.c
===================================================================
--- trunk/blender/source/blender/editors/space_node/space_node.c        
2010-04-24 18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/editors/space_node/space_node.c        
2010-04-24 19:26:05 UTC (rev 28401)
@@ -340,6 +340,7 @@
                                CTX_data_list_add(result, &snode->edittree->id, 
&RNA_Node, node);
                        }
                }
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        

Modified: trunk/blender/source/blender/editors/space_view3d/space_view3d.c
===================================================================
--- trunk/blender/source/blender/editors/space_view3d/space_view3d.c    
2010-04-24 18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/editors/space_view3d/space_view3d.c    
2010-04-24 19:26:05 UTC (rev 28401)
@@ -817,7 +817,7 @@
                                }
                        }
                }
-
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selected_editable_objects") || 
CTX_data_equals(member, "selected_editable_bases")) {
@@ -835,7 +835,7 @@
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "visible_objects") || 
CTX_data_equals(member, "visible_bases")) {
@@ -851,7 +851,7 @@
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "selectable_objects") || 
CTX_data_equals(member, "selectable_bases")) {
@@ -867,7 +867,7 @@
                                }
                        }
                }
-               
+               CTX_data_type_set(result, CTX_DATA_TYPE_COLLECTION);
                return 1;
        }
        else if(CTX_data_equals(member, "active_base")) {

Modified: trunk/blender/source/blender/python/intern/bpy_rna.c
===================================================================
--- trunk/blender/source/blender/python/intern/bpy_rna.c        2010-04-24 
18:11:28 UTC (rev 28400)
+++ trunk/blender/source/blender/python/intern/bpy_rna.c        2010-04-24 
19:26:05 UTC (rev 28401)
@@ -2236,29 +2236,30 @@
                else {
                        PointerRNA newptr;
                        ListBase newlb;
+                       short newtype;
 
-                       int done= CTX_data_get(C, name, &newptr, &newlb);
+                       int done= CTX_data_get(C, name, &newptr, &newlb, 
&newtype);
 
                        if(done==1) { /* found */
-                               if (newptr.data) {
-                                       ret = 
pyrna_struct_CreatePyObject(&newptr);
-                               }
-                               else if (newlb.first) {
-                                       CollectionPointerLink *link;
-                                       PyObject *linkptr;
-
-                                       ret = PyList_New(0);
-
-                                       for(link=newlb.first; link; 
link=link->next) {
-                                               linkptr= 
pyrna_struct_CreatePyObject(&link->ptr);
-                                               PyList_Append(ret, linkptr);
-                                               Py_DECREF(linkptr);
+                               switch(newtype) {
+                               case CTX_DATA_TYPE_POINTER:
+                                       ret = 
pyrna_struct_CreatePyObject(&newptr); /* can return a bpy_struct or None */
+                                       break;
+                               case CTX_DATA_TYPE_COLLECTION:
+                                       {
+                                               CollectionPointerLink *link;
+                                               PyObject *linkptr;
+       
+                                               ret = PyList_New(0);
+       
+                                               for(link=newlb.first; link; 
link=link->next) {
+                                                       linkptr= 
pyrna_struct_CreatePyObject(&link->ptr);
+                                                       PyList_Append(ret, 
linkptr);
+                                                       Py_DECREF(linkptr);
+                                               }
                                        }
+                                       break;
                                }
-                               else {
-                                       ret = Py_None;
-                                       Py_INCREF(ret);
-                               }
                        }
                        else if (done==-1) { /* found but not set */
                                ret = Py_None;


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

Reply via email to