[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [19606] branches/blender2.5/blender/source /blender: 2.5:

Brecht Van Lommel brecht at blender.org
Wed Apr 8 20:45:41 CEST 2009


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);
 





More information about the Bf-blender-cvs mailing list