##// END OF EJS Templates
- removed argument to fullSignature...
- removed argument to fullSignature - returning instance methods on class objects as well - implemented unbound calls on instance methods returned on class objects git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@59 ea8d5007-eb21-0410-b261-ccb3ea6e24a9

File last commit:

r23:0fec1cae9cb6
r23:0fec1cae9cb6
Show More
PythonQtClassWrapper.cpp
293 lines | 10.0 KiB | text/x-c | CppLexer
/ src / PythonQtClassWrapper.cpp
ezust
reorganized SVN tree into branches, tags and trunk...
r0 /*
*
* Copyright (C) 2006 MeVis Research GmbH All Rights Reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* Further, this software is distributed without any warranty that it is
* free of the rightful claim of any third person regarding infringement
* or the like. Any license provided herein, whether implied or
* otherwise, applies only to this software file. Patent licenses, if
* any, provided herein do not apply to combinations of this program with
* other software, or any other product whatsoever.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
* Contact information: MeVis Research GmbH, Universitaetsallee 29,
* 28359 Bremen, Germany or:
*
* http://www.mevis.de
*
*/
//----------------------------------------------------------------------------------
/*!
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 // \file PythonQtClassWrapper.cpp
ezust
reorganized SVN tree into branches, tags and trunk...
r0 // \author Florian Link
// \author Last changed by $Author: florian $
// \date 2006-05
*/
//----------------------------------------------------------------------------------
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 #include "PythonQtClassWrapper.h"
ezust
reorganized SVN tree into branches, tags and trunk...
r0 #include <QObject>
#include "PythonQt.h"
#include "PythonQtSlot.h"
#include "PythonQtClassInfo.h"
#include "PythonQtConversion.h"
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 #include "PythonQtInstanceWrapper.h"
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 static PyObject* PythonQtClassWrapper_alloc(PyTypeObject *self, Py_ssize_t nitems)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 // call the default type alloc
PyObject* obj = PyType_Type.tp_alloc(self, nitems);
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 // take current class type, if we are called via newPythonQtClassWrapper()
PythonQtClassWrapper* wrap = (PythonQtClassWrapper*)obj;
wrap->_classInfo = PythonQt::priv()->currentClassInfoForClassWrapperCreation();
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return obj;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 static int PythonQtClassWrapper_init(PythonQtClassWrapper* self, PyObject* args, PyObject* kwds)
{
// call the default type init
if (PyType_Type.tp_init((PyObject *)self, args, kwds) < 0) {
return -1;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18
// if we have no CPP class information, try our base class
if (!self->classInfo()) {
PyTypeObject* superType = ((PyTypeObject *)self)->tp_base;
if (!superType || (superType->ob_type != &PythonQtClassWrapper_Type)) {
PyErr_Format(PyExc_TypeError, "type %s is not derived from PythonQtClassWrapper", ((PyTypeObject*)self)->tp_name);
return -1;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18
// take the class info from the superType
self->_classInfo = ((PythonQtClassWrapper*)superType)->classInfo();
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18
return 0;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject *PythonQtClassWrapper_classname(PythonQtClassWrapper* type)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return PyString_FromString((QString("Class_") + type->classInfo()->className()).toLatin1().data());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject *PythonQtClassWrapper_help(PythonQtClassWrapper* type)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return PythonQt::self()->helpCalled(type->classInfo());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 PyObject *PythonQtClassWrapper__init__(PythonQtClassWrapper *type, PyObject *args)
{
Py_ssize_t argc = PyTuple_Size(args);
if (argc>0) {
// we need to call __init__ of the instance
PyObject* self = PyTuple_GET_ITEM(args, 0);
if (PyObject_TypeCheck(self, (PyTypeObject*)type->classInfo()->pythonQtClassWrapper())) {
PyObject* newargs = PyTuple_New(argc-1);
for (int i = 0;i<argc-1; i++) {
PyTuple_SET_ITEM(newargs, i,PyTuple_GET_ITEM(args, i+1));
}
PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)self;
int result = PythonQtInstanceWrapper_init(wrapper, newargs, NULL);
Py_DECREF(newargs);
if (result==0) {
Py_INCREF(Py_None);
return Py_None;
} else {
// init failed!
}
} else {
// self not of correct type!
}
} else {
// wrong number of args
}
return NULL;
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyMethodDef PythonQtClassWrapper_methods[] = {
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 {"__init__", (PyCFunction)PythonQtClassWrapper__init__, METH_VARARGS,
"Return the classname of the object"
},
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 {"className", (PyCFunction)PythonQtClassWrapper_classname, METH_NOARGS,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 "Return the classname of the object"
},
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 {"help", (PyCFunction)PythonQtClassWrapper_help, METH_NOARGS,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 "Shows the help of available methods for this class"
},
florianlink
- removed warnings...
r8 {NULL, NULL, 0 , NULL} /* Sentinel */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 };
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 static PyObject *PythonQtClassWrapper_getattro(PyObject *obj, PyObject *name)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
const char *attributeName;
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtClassWrapper *wrapper = (PythonQtClassWrapper *)obj;
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if ((attributeName = PyString_AsString(name)) == NULL) {
return NULL;
}
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 if (obj == (PyObject*)&PythonQtInstanceWrapper_Type) {
return NULL;
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 if (qstrcmp(attributeName, "__dict__")==0) {
PyObject* dict = ((PyTypeObject *)wrapper)->tp_dict;
if (!wrapper->classInfo()) {
Py_INCREF(dict);
return dict;
}
dict = PyDict_Copy(dict);
florianlink
- removed argument to fullSignature...
r23 QStringList l = wrapper->classInfo()->memberList(false);
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 foreach (QString name, l) {
PyObject* o = PyObject_GetAttrString(obj, name.toLatin1().data());
florianlink
- removed argument to fullSignature...
r23 if (o) {
PyDict_SetItemString(dict, name.toLatin1().data(), o);
Py_DECREF(o);
} else {
// it must have been a property or child, which we do not know as a class object...
}
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
if (wrapper->classInfo()->constructors()) {
florianlink
- removed argument to fullSignature...
r23 PyObject* func = PyCFunction_New(&PythonQtClassWrapper_methods[0], obj);
PyDict_SetItemString(dict, "__init__", func);
Py_DECREF(func);
}
for (int i = 1;i<3;i++) {
PyObject* func = PyCFunction_New(&PythonQtClassWrapper_methods[i], obj);
PyDict_SetItemString(dict, PythonQtClassWrapper_methods[i].ml_name, func);
Py_DECREF(func);
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
return dict;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22
if (wrapper->classInfo()) {
PythonQtMemberInfo member = wrapper->classInfo()->member(attributeName);
if (member._type == PythonQtMemberInfo::EnumValue) {
return PyInt_FromLong(member._enumValue);
} else
florianlink
- removed argument to fullSignature...
r23 if (member._type == PythonQtMemberInfo::Slot) {
// we return all slots, even the instance slots, since they are callable as unbound slots with self argument
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 return PythonQtSlotFunction_New(member._slot, obj, NULL);
}
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
merged in features from the MeVisLab repository...
r4
ezust
reorganized SVN tree into branches, tags and trunk...
r0 // look for the interal methods (className(), help())
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PyObject* internalMethod = Py_FindMethod( PythonQtClassWrapper_methods, obj, (char*)attributeName);
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (internalMethod) {
return internalMethod;
}
PyErr_Clear();
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 // look in super
PyObject* superAttr = PyType_Type.tp_getattro(obj, name);
if (superAttr) {
return superAttr;
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 QString error = QString(wrapper->classInfo()->className()) + " has no attribute named '" + QString(attributeName) + "'";
ezust
reorganized SVN tree into branches, tags and trunk...
r0 PyErr_SetString(PyExc_AttributeError, error.toLatin1().data());
return NULL;
}
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 static int PythonQtClassWrapper_setattro(PyObject *obj,PyObject *name,PyObject * /*value*/)
{
QString error;
char *attributeName;
if ((attributeName = PyString_AsString(name)) == NULL) {
return -1;
}
PythonQtClassWrapper *wrapper = (PythonQtClassWrapper *)obj;
// TODO
return -1;
}
/*
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 static PyObject * PythonQtClassWrapper_repr(PyObject * obj)
ezust
reorganized SVN tree into branches, tags and trunk...
r0 {
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtClassWrapper* wrapper = (PythonQtClassWrapper*)obj;
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 if (wrapper->classInfo()->isCPPWrapper()) {
const QMetaObject* meta = wrapper->classInfo()->metaObject();
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 if (!meta) {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 QObject* decorator = wrapper->classInfo()->decorator();
florianlink
syncing with my current work, updating to 1.2, see changelog...
r10 if (decorator) {
meta = decorator->metaObject();
}
}
if (meta) {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return PyString_FromFormat("%s Class (C++ wrapped by %s)", wrapper->classInfo()->className(), meta->className());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 } else {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return PyString_FromFormat("%s Class (C++ unwrapped)", wrapper->classInfo()->className());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
} else {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 return PyString_FromFormat("%s Class", wrapper->classInfo()->className());
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
}
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 */
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PyTypeObject PythonQtClassWrapper_Type = {
ezust
reorganized SVN tree into branches, tags and trunk...
r0 PyObject_HEAD_INIT(NULL)
0, /*ob_size*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 "PythonQt.PythonQtClassWrapper", /*tp_name*/
sizeof(PythonQtClassWrapper), /*tp_basicsize*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_itemsize*/
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 0, /*tp_dealloc*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_print*/
0, /*tp_getattr*/
0, /*tp_setattr*/
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 0, /*tp_compare*/
0, //PythonQtClassWrapper_repr, /*tp_repr*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_as_number*/
0, /*tp_as_sequence*/
0, /*tp_as_mapping*/
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 0, /*tp_hash */
0, /*tp_call*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_str*/
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 PythonQtClassWrapper_getattro, /*tp_getattro*/
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 PythonQtClassWrapper_setattro, /*tp_setattro*/
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /*tp_as_buffer*/
Py_TPFLAGS_DEFAULT | Py_TPFLAGS_BASETYPE, /*tp_flags*/
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 0, /* tp_doc */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* tp_traverse */
0, /* tp_clear */
0, /* tp_richcompare */
0, /* tp_weaklistoffset */
0, /* tp_iter */
0, /* tp_iternext */
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 0, /* tp_methods */
0, /* tp_members */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 0, /* tp_getset */
0, /* tp_base */
0, /* tp_dict */
0, /* tp_descr_get */
0, /* tp_descr_set */
0, /* tp_dictoffset */
florianlink
code cleanup and rename of PythonQtWrapper to PythonQtInstanceWrapper and PythonQtMetaObjectWrapper to PythonQtClassWrapper, since these names match much better what these classes wrap, regarding that we are wrapping CPP objects as well...
r16 (initproc)PythonQtClassWrapper_init, /* tp_init */
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 PythonQtClassWrapper_alloc, /* tp_alloc */
0, /* tp_new */
0, /* tp_free */
ezust
reorganized SVN tree into branches, tags and trunk...
r0 };
//-------------------------------------------------------