Revision: 19606
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=19606
Author:   blendix
Date:     2009-04-08 20:45:41 +0200 (Wed, 08 Apr 2009)

Log Message:
-----------
2.5:
* Fix to make python panels callbacks get the actual
  blender Panel as an argument, instead of any instance.
* Fix for callback validation in python 2.5, worked OK
  in python 3.0 but gave error in 2.5 because it's a
  method instead of a function there.

Modified Paths:
--------------
    branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
    branches/blender2.5/blender/source/blender/python/intern/bpy_panel_wrap.c
    branches/blender2.5/blender/source/blender/python/intern/bpy_util.c

Modified: branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h
===================================================================
--- branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h  
2009-04-08 17:40:09 UTC (rev 19605)
+++ branches/blender2.5/blender/source/blender/blenkernel/BKE_screen.h  
2009-04-08 18:45:41 UTC (rev 19606)
@@ -44,6 +44,7 @@
 struct wmWindowManager;
 struct uiLayout;
 struct uiMenuItem;
+struct StructRNA;
 
 /* spacetype has everything stored to get an editor working, it gets 
initialized via 
    ED_spacetypes_init() in editors/area/spacetypes.c   */
@@ -152,7 +153,8 @@
        void            (*draw)(const struct bContext *, struct Panel *);       
 
        /* python integration */
-       void            *py_data;
+       void                            *py_data;
+       struct StructRNA        *srna;
 } PanelType;
 
 /* header types */

Modified: 
branches/blender2.5/blender/source/blender/python/intern/bpy_panel_wrap.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_panel_wrap.c   
2009-04-08 17:40:09 UTC (rev 19605)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_panel_wrap.c   
2009-04-08 18:45:41 UTC (rev 19606)
@@ -47,15 +47,17 @@
 static int PyPanel_generic(int mode, const bContext *C, Panel *pnl)
 {
        PyObject *py_class= (PyObject *)(pnl->type->py_data);
-       //uiLayout *layout= pnl->layout;
 
        PyObject *args;
        PyObject *ret= NULL, *py_class_instance, *item;
+       PointerRNA panelptr;
        int ret_flag= 0;
 
        PyGILState_STATE gilstate = PyGILState_Ensure();
 
-       args = PyTuple_New(0);
+       args = PyTuple_New(1);
+       RNA_pointer_create(&CTX_wm_screen(C)->id, pnl->type->srna, pnl, 
&panelptr);
+       PyTuple_SET_ITEM(args, 0, pyrna_struct_CreatePyObject(&panelptr));
        py_class_instance = PyObject_Call(py_class, args, NULL);
        Py_DECREF(args);
 
@@ -211,6 +213,10 @@
        pt->py_data= (void *)py_class;
 
        BLI_addtail(&art->paneltypes, pt);
+
+       pt->srna= RNA_def_struct(&BLENDER_RNA, pt->idname, "Panel"); 
+       RNA_struct_py_type_set(pt->srna, py_class);
+
        Py_RETURN_NONE;
 }
 

Modified: branches/blender2.5/blender/source/blender/python/intern/bpy_util.c
===================================================================
--- branches/blender2.5/blender/source/blender/python/intern/bpy_util.c 
2009-04-08 17:40:09 UTC (rev 19605)
+++ branches/blender2.5/blender/source/blender/python/intern/bpy_util.c 
2009-04-08 18:45:41 UTC (rev 19606)
@@ -244,7 +244,7 @@
 
 int BPY_class_validate(const char *class_type, PyObject *class, PyObject 
*base_class, BPY_class_attr_check* class_attrs, PyObject **py_class_attrs)
 {
-       PyObject *item;
+       PyObject *item, *fitem;
        PyObject *py_arg_count;
        int i, arg_count;
 
@@ -292,12 +292,17 @@
                                        }
                                        break;
                                case 'f':
-                                       if (PyFunction_Check(item)==0) {
+                                       if (PyMethod_Check(item))
+                                               fitem= PyMethod_Function(item); 
/* py 2.x */
+                                       else
+                                               fitem= item; /* py 3.x */
+
+                                       if (PyFunction_Check(fitem)==0) {
                                                PyErr_Format( 
PyExc_AttributeError, "expected %s class \"%s\" attribute to be a function", 
class_type, class_attrs->name);
                                                return -1;
                                        }
                                        if (class_attrs->arg_count >= 0) { /* 
-1 if we dont care*/
-                                               py_arg_count = 
PyObject_GetAttrString(PyFunction_GET_CODE(item), "co_argcount");
+                                               py_arg_count = 
PyObject_GetAttrString(PyFunction_GET_CODE(fitem), "co_argcount");
                                                arg_count = 
PyLong_AsSsize_t(py_arg_count);
                                                Py_DECREF(py_arg_count);
 


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

Reply via email to