* 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.
This commit is contained in:
2009-04-08 18:45:41 +00:00
parent d979085614
commit 25d0720dc4
3 changed files with 19 additions and 6 deletions

View File

@@ -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 @@ PyObject *PyPanel_wrap_add(PyObject *self, PyObject *args)
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;
}

View File

@@ -244,7 +244,7 @@ PyObject *PyObject_GetAttrStringArgs(PyObject *o, Py_ssize_t n, ...)
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 @@ int BPY_class_validate(const char *class_type, PyObject *class, PyObject *base_c
}
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);