##// END OF EJS Templates
Fix PythonQt*Config*.cmake
Fix PythonQt*Config*.cmake

File last commit:

r207:99eb8a233276
r212:00d0962ac01d
Show More
PythonQtClassWrapper.cpp
504 lines | 18.0 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"
florianlink
Updated from current MeVisLab development...
r173 #include "PythonQtSignal.h"
ezust
reorganized SVN tree into branches, tags and trunk...
r0 #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) {
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
florianlink
added support for operators and rich compare...
r119 wrap->_base.as_number.nb_divide = (binaryfunc)PythonQtInstanceWrapper_div;
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
added support for operators and rich compare...
r119 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) {
Orochimarufan
Start Python 3.x Port...
r206 #ifndef PY3K
florianlink
added support for operators and rich compare...
r119 wrap->_base.as_number.nb_inplace_divide = (binaryfunc)PythonQtInstanceWrapper_idiv;
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
added support for operators and rich compare...
r119 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) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
wrap->_base.as_number.nb_bool = (inquiry)PythonQtInstanceWrapper_nonzero;
#else
florianlink
added support for operators and rich compare...
r119 wrap->_base.as_number.nb_nonzero = (inquiry)PythonQtInstanceWrapper_nonzero;
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
added support for operators and rich compare...
r119 }
}
}
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;
Orochimarufan
Redo CMake build system, get Qt5 support...
r205 // recursively search for PythonQtClassWrapper superclass,
// this is needed for multiple levels of inheritance in python,
// e.g.
// class MyWidgetBase(QWidget):
// ...
// class MyWidget(MyWidgetBase):
// ...
Orochimarufan
Start Python 3.x Port...
r206 while( superType && Py_TYPE(superType) != &PythonQtClassWrapper_Type )
Orochimarufan
Redo CMake build system, get Qt5 support...
r205 superType = superType->tp_base;
Orochimarufan
Start Python 3.x Port...
r206 if (!superType || (Py_TYPE(superType) != &PythonQtClassWrapper_Type)) {
florianlink
- wrapped instances are now wrapped by class specific subtypes to facilitate future deriving from python...
r18 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 {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
return PyUnicode_FromString((QString("Class_") + type->classInfo()->className()).toLatin1().data());
#else
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());
Orochimarufan
Start Python 3.x Port...
r206 #endif
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
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[] = {
{"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
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
if ((attributeName = PyUnicode_AsUTF8(name)) == NULL) {
#else
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if ((attributeName = PyString_AsString(name)) == NULL) {
Orochimarufan
Start Python 3.x Port...
r206 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 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) {
florianlink
Updated from current MeVisLab development...
r173 PyObject* objectDict = ((PyTypeObject *)wrapper)->tp_dict;
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 if (!wrapper->classInfo()) {
florianlink
Updated from current MeVisLab development...
r173 Py_INCREF(objectDict);
return objectDict;
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
florianlink
Updated from current MeVisLab development...
r173 PyObject* dict = PyDict_New();
QStringList l = wrapper->classInfo()->memberList();
Orochimarufan
Redo CMake build system, get Qt5 support...
r205 Q_FOREACH (QString name, l) {
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 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
Updated from current MeVisLab development...
r173 PyErr_Clear();
florianlink
- removed argument to fullSignature...
r23 }
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
if (wrapper->classInfo()->constructors()) {
Orochimarufan
Start Python 3.x Port...
r206 #ifdef PY3K
PyObject* initName = PyUnicode_FromString("__init__");
#else
florianlink
Updated from current MeVisLab development...
r173 PyObject* initName = PyString_FromString("__init__");
Orochimarufan
Start Python 3.x Port...
r206 #endif
florianlink
Updated from current MeVisLab development...
r173 PyObject* func = PyType_Type.tp_getattro(obj, initName);
Py_DECREF(initName);
florianlink
- removed argument to fullSignature...
r23 PyDict_SetItemString(dict, "__init__", func);
Py_DECREF(func);
}
florianlink
Updated from current MeVisLab development...
r173 for (int i = 0; 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 }
florianlink
Updated from current MeVisLab development...
r173
PyDict_Update(dict, objectDict);
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
florianlink
Updated from current MeVisLab development...
r173 // look in Python to support derived Python classes
PyObject* superAttr = PyType_Type.tp_getattro(obj, name);
if (superAttr) {
return superAttr;
}
PyErr_Clear();
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);
florianlink
Updated from current MeVisLab development...
r173 } else if (member._type == PythonQtMemberInfo::Signal) {
// we return all signals, even the instance signals, since they are callable as unbound signals with self argument
return PythonQtSignalFunction_New(member._slot, obj, NULL);
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 }
ezust
reorganized SVN tree into branches, tags and trunk...
r0 }
florianlink
merged in features from the MeVisLab repository...
r4
florianlink
Updated from current MeVisLab development...
r173 // look for the internal methods (className(), help())
Orochimarufan
Fix __getattr__ problems.
r207 #ifdef PY3K
PyObject* internalMethod = PyObject_GenericGetAttr(obj, name);
#else
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);
Orochimarufan
Fix __getattr__ problems.
r207 #endif
ezust
reorganized SVN tree into branches, tags and trunk...
r0 if (internalMethod) {
return internalMethod;
}
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 = {
Orochimarufan
Start Python 3.x Port...
r206 PyVarObject_HEAD_INIT(NULL, 0)
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 */
Orochimarufan
Fix __getattr__ problems.
r207 PythonQtClassWrapper_methods, /* tp_methods */
florianlink
changed implementation to allow deriving python classes from PythonQt classes...
r22 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 };
//-------------------------------------------------------