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.
This commit is contained in:
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user