##// END OF EJS Templates
updated to upstream state in MeVisLab repository...
updated to upstream state in MeVisLab repository git-svn-id: svn://svn.code.sf.net/p/pythonqt/code/trunk@196 ea8d5007-eb21-0410-b261-ccb3ea6e24a9

File last commit:

r157:78da86ccde11
r157:78da86ccde11
Show More
PythonQtClassWrapper.cpp
494 lines | 17.7 KiB | text/x-c | CppLexer
/ src / PythonQtClassWrapper.cpp
ezust
reorganized SVN tree into branches, tags and trunk...
r0 /*
*
florianlink
updated old license information and current date...
r133 * Copyright (C) 2010 MeVis Medical Solutions AG All Rights Reserved.
ezust
reorganized SVN tree into branches, tags and trunk...
r0 *
* 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
*
florianlink
updated old license information and current date...
r133 * Contact information: MeVis Medical Solutions AG, Universitaetsallee 29,
ezust
reorganized SVN tree into branches, tags and trunk...
r0 * 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
added support for operators and rich compare...
r119 static PyObject* PythonQtInstanceWrapper_invert(PythonQtInstanceWrapper* wrapper)
{
PyObject* result = NULL;
static QByteArray memberName = "__invert__";
PythonQtMemberInfo opSlot = wrapper->classInfo()->member(memberName);
if (opSlot._type == PythonQtMemberInfo::Slot) {
result = PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, opSlot._slot, NULL, NULL, wrapper->_wrappedPtr);
}
return result;
}
static int PythonQtInstanceWrapper_nonzero(PythonQtInstanceWrapper* wrapper)
{
int result = (wrapper->_wrappedPtr == NULL && wrapper->_obj == NULL)?0:1;
if (result) {
static QByteArray memberName = "__nonzero__";
PythonQtMemberInfo opSlot = wrapper->classInfo()->member(memberName);
if (opSlot._type == PythonQtMemberInfo::Slot) {
PyObject* resultObj = PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, opSlot._slot, NULL, NULL, wrapper->_wrappedPtr);
if (resultObj == Py_False) {
result = 0;
}
Py_XDECREF(resultObj);
}
}
return result;
}
florianlink
fixed binary operations where first argument is not a wrapper...
r136 static PyObject* PythonQtInstanceWrapper_binaryfunc(PyObject* self, PyObject* other, const QByteArray& opName, const QByteArray& fallbackOpName = QByteArray())
florianlink
added support for operators and rich compare...
r119 {
florianlink
fixed binary operations where first argument is not a wrapper...
r136 // since we disabled type checking, we can receive any object as self, but we currently only support
// different objects on the right. Otherwise we would need to generate __radd__ etc. methods.
if (!PyObject_TypeCheck(self, &PythonQtInstanceWrapper_Type)) {
QString error = "Unsupported operation " + opName + "(" + self->ob_type->tp_name + ", " + other->ob_type->tp_name + ")";
PyErr_SetString(PyExc_ArithmeticError, error.toLatin1().data());
return NULL;
}
PythonQtInstanceWrapper* wrapper = (PythonQtInstanceWrapper*)self;
florianlink
added support for operators and rich compare...
r119 PyObject* result = NULL;
PythonQtMemberInfo opSlot = wrapper->classInfo()->member(opName);
if (opSlot._type == PythonQtMemberInfo::Slot) {
// TODO get rid of tuple
PyObject* args = PyTuple_New(1);
Py_INCREF(other);
PyTuple_SET_ITEM(args, 0, other);
result = PythonQtSlotFunction_CallImpl(wrapper->classInfo(), wrapper->_obj, opSlot._slot, args, NULL, wrapper->_wrappedPtr);
Py_DECREF(args);
if (!result && !fallbackOpName.isEmpty()) {
// try fallback if we did not get a result
florianlink
fixed binary operations where first argument is not a wrapper...
r136 result = PythonQtInstanceWrapper_binaryfunc(self, other, fallbackOpName);
florianlink
added support for operators and rich compare...
r119 }
}
return result;
}
#define BINARY_OP(NAME) \
florianlink
fixed binary operations where first argument is not a wrapper...
r136 static PyObject* PythonQtInstanceWrapper_ ## NAME(PyObject* self, PyObject* other) \
florianlink
added support for operators and rich compare...
r119 { \
static const QByteArray opName("__" #NAME "__"); \
florianlink
fixed binary operations where first argument is not a wrapper...
r136 return PythonQtInstanceWrapper_binaryfunc(self, other, opName); \
florianlink
added support for operators and rich compare...
r119 }
#define BINARY_OP_INPLACE(NAME) \
florianlink
fixed binary operations where first argument is not a wrapper...
r136 static PyObject* PythonQtInstanceWrapper_i ## NAME(PyObject* self, PyObject* other) \
florianlink
added support for operators and rich compare...
r119 { \
static const QByteArray opName("__i" #NAME "__"); \
static const QByteArray fallbackName("__" #NAME "__"); \
florianlink
fixed binary operations where first argument is not a wrapper...
r136 return PythonQtInstanceWrapper_binaryfunc(self, other, opName, fallbackName); \
florianlink
added support for operators and rich compare...
r119 }
BINARY_OP(add)
BINARY_OP(sub)
BINARY_OP(mul)
BINARY_OP(div)
BINARY_OP(and)
BINARY_OP(or)
BINARY_OP(xor)
BINARY_OP(mod)
BINARY_OP(lshift)
BINARY_OP(rshift)
BINARY_OP_INPLACE(add)
BINARY_OP_INPLACE(sub)
BINARY_OP_INPLACE(mul)
BINARY_OP_INPLACE(div)
BINARY_OP_INPLACE(and)
BINARY_OP_INPLACE(or)
BINARY_OP_INPLACE(xor)
BINARY_OP_INPLACE(mod)
BINARY_OP_INPLACE(lshift)
BINARY_OP_INPLACE(rshift)
static void initializeSlots(PythonQtClassWrapper* wrap)
{
int typeSlots = wrap->classInfo()->typeSlots();
if (typeSlots) {
if (typeSlots & PythonQt::Type_Add) {
wrap->_base.as_number.nb_add = (binaryfunc)PythonQtInstanceWrapper_add;
}
if (typeSlots & PythonQt::Type_Subtract) {
wrap->_base.as_number.nb_subtract = (binaryfunc)PythonQtInstanceWrapper_sub;
}
if (typeSlots & PythonQt::Type_Multiply) {
wrap->_base.as_number.nb_multiply = (binaryfunc)PythonQtInstanceWrapper_mul;
}
if (typeSlots & PythonQt::Type_Divide) {
wrap->_base.as_number.nb_divide = (binaryfunc)PythonQtInstanceWrapper_div;
wrap->_base.as_number.nb_true_divide = (binaryfunc)PythonQtInstanceWrapper_div;
}
if (typeSlots & PythonQt::Type_And) {
wrap->_base.as_number.nb_and = (binaryfunc)PythonQtInstanceWrapper_and;
}
if (typeSlots & PythonQt::Type_Or) {
wrap->_base.as_number.nb_or = (binaryfunc)PythonQtInstanceWrapper_or;
}
if (typeSlots & PythonQt::Type_Xor) {
wrap->_base.as_number.nb_xor = (binaryfunc)PythonQtInstanceWrapper_xor;
}
if (typeSlots & PythonQt::Type_Mod) {
wrap->_base.as_number.nb_remainder = (binaryfunc)PythonQtInstanceWrapper_mod;
}
if (typeSlots & PythonQt::Type_LShift) {
wrap->_base.as_number.nb_lshift = (binaryfunc)PythonQtInstanceWrapper_lshift;
}
if (typeSlots & PythonQt::Type_RShift) {
wrap->_base.as_number.nb_rshift = (binaryfunc)PythonQtInstanceWrapper_rshift;
}
if (typeSlots & PythonQt::Type_InplaceAdd) {
wrap->_base.as_number.nb_add = (binaryfunc)PythonQtInstanceWrapper_iadd;
}
if (typeSlots & PythonQt::Type_InplaceSubtract) {
wrap->_base.as_number.nb_subtract = (binaryfunc)PythonQtInstanceWrapper_isub;
}
if (typeSlots & PythonQt::Type_InplaceMultiply) {
wrap->_base.as_number.nb_multiply = (binaryfunc)PythonQtInstanceWrapper_imul;
}
if (typeSlots & PythonQt::Type_InplaceDivide) {
wrap->_base.as_number.nb_inplace_divide = (binaryfunc)PythonQtInstanceWrapper_idiv;
wrap->_base.as_number.nb_inplace_true_divide = (binaryfunc)PythonQtInstanceWrapper_idiv;
}
if (typeSlots & PythonQt::Type_InplaceAnd) {
wrap->_base.as_number.nb_inplace_and = (binaryfunc)PythonQtInstanceWrapper_iand;
}
if (typeSlots & PythonQt::Type_InplaceOr) {
wrap->_base.as_number.nb_inplace_or = (binaryfunc)PythonQtInstanceWrapper_ior;
}
if (typeSlots & PythonQt::Type_InplaceXor) {
wrap->_base.as_number.nb_inplace_xor = (binaryfunc)PythonQtInstanceWrapper_ixor;
}
if (typeSlots & PythonQt::Type_InplaceMod) {
wrap->_base.as_number.nb_inplace_remainder = (binaryfunc)PythonQtInstanceWrapper_imod;
}
if (typeSlots & PythonQt::Type_InplaceLShift) {
wrap->_base.as_number.nb_inplace_lshift = (binaryfunc)PythonQtInstanceWrapper_ilshift;
}
if (typeSlots & PythonQt::Type_InplaceRShift) {
wrap->_base.as_number.nb_inplace_rshift = (binaryfunc)PythonQtInstanceWrapper_irshift;
}
if (typeSlots & PythonQt::Type_Invert) {
wrap->_base.as_number.nb_invert = (unaryfunc)PythonQtInstanceWrapper_invert;
}
if (typeSlots & PythonQt::Type_NonZero) {
wrap->_base.as_number.nb_nonzero = (inquiry)PythonQtInstanceWrapper_nonzero;
}
}
}
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();
florianlink
fixed deriving C++ classes...
r122 if (wrap->_classInfo) {
initializeSlots(wrap);
}
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
updated to upstream state in MeVisLab repository...
r157 PyObject *PythonQtClassWrapper_delete(PythonQtClassWrapper *type, PyObject *args)
{
Q_UNUSED(type);
Py_ssize_t argc = PyTuple_Size(args);
if (argc>0) {
PyObject* self = PyTuple_GET_ITEM(args, 0);
if (PyObject_TypeCheck(self, &PythonQtInstanceWrapper_Type)) {
return PythonQtInstanceWrapper_delete((PythonQtInstanceWrapper*)self);
}
}
return NULL;
}
PyObject *PythonQtClassWrapper_inherits(PythonQtClassWrapper *type, PyObject *args)
{
Q_UNUSED(type);
PythonQtInstanceWrapper* wrapper = NULL;
char *name = NULL;
if (!PyArg_ParseTuple(args, "O!s:PythonQtClassWrapper.inherits",&PythonQtInstanceWrapper_Type, &wrapper, &name)) {
return NULL;
}
return PythonQtConv::GetPyBool(wrapper->classInfo()->inherits(name));
}
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
updated to upstream state in MeVisLab repository...
r157
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,
florianlink
updated to upstream state in MeVisLab repository...
r157 "Init function"
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 },
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
updated to upstream state in MeVisLab repository...
r157 {"inherits", (PyCFunction)PythonQtClassWrapper_inherits, METH_VARARGS,
"Returns if the class inherits or is of given type name"
},
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
updated to upstream state in MeVisLab repository...
r157 {"delete", (PyCFunction)PythonQtClassWrapper_delete, METH_VARARGS,
"Deletes the given C++ object"
},
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
updated to upstream state in MeVisLab repository...
r157
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
updated to upstream state in MeVisLab repository...
r157
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);
}
florianlink
updated to upstream state in MeVisLab repository...
r157 for (int i = 1; PythonQtClassWrapper_methods[i].ml_name != NULL; i++) {
florianlink
- removed argument to fullSignature...
r23 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) {
florianlink
added enum wrapper classes derived from python int, so that enums are distinguishable from normal python integers. This will allow better overload handling e.g. of QColor constructors in the future...
r51 PyObject* enumValue = member._enumValue;
Py_INCREF(enumValue);
return enumValue;
} else if (member._type == PythonQtMemberInfo::EnumWrapper) {
PyObject* enumWrapper = member._enumWrapper;
Py_INCREF(enumWrapper);
return enumWrapper;
} else if (member._type == PythonQtMemberInfo::Slot) {
florianlink
- removed argument to fullSignature...
r23 // 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
added support for setattr to allow derived classes to add own attributes...
r30 static int PythonQtClassWrapper_setattro(PyObject *obj,PyObject *name,PyObject *value)
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 {
florianlink
added support for setattr to allow derived classes to add own attributes...
r30 return PyType_Type.tp_setattro(obj,name,value);
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 }
/*
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()) {
florianlink
updated to upstream state in MeVisLab repository...
r157 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 };
//-------------------------------------------------------