diff options
author | Hugo Parente Lima <hugo.lima@openbossa.org> | 2010-06-10 19:57:18 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.lima@openbossa.org> | 2010-06-10 20:18:59 -0300 |
commit | 1b6337d8b4a65988dfbeb0eed67bc6584b25fdee (patch) | |
tree | e6efde3e5d00d4530f321894e62801ab8eac72e8 /PySide/QtCore | |
parent | d8a192b5e14e996992a98766cd39ca2028e6474e (diff) |
Removed QVariant from PySide.
Reviewer: Luciano Wolf <luciano.wolf@openbossa.org>
Marcelo Lira <marcelo.lira@openbossa.org>
Diffstat (limited to 'PySide/QtCore')
-rw-r--r-- | PySide/QtCore/CMakeLists.txt | 1 | ||||
-rw-r--r-- | PySide/QtCore/qvariant_conversions.h | 147 | ||||
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 187 |
3 files changed, 80 insertions, 255 deletions
diff --git a/PySide/QtCore/CMakeLists.txt b/PySide/QtCore/CMakeLists.txt index bbe8ba7b5..12a2f4a50 100644 --- a/PySide/QtCore/CMakeLists.txt +++ b/PySide/QtCore/CMakeLists.txt @@ -120,7 +120,6 @@ ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtimerevent_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qtranslator_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qurl_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/quuid_wrapper.cpp -${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qvariant_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwaitcondition_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qwritelocker_wrapper.cpp ${CMAKE_CURRENT_BINARY_DIR}/PySide/QtCore/qxmlstreamattribute_wrapper.cpp diff --git a/PySide/QtCore/qvariant_conversions.h b/PySide/QtCore/qvariant_conversions.h index aa6d521fb..076ed7f92 100644 --- a/PySide/QtCore/qvariant_conversions.h +++ b/PySide/QtCore/qvariant_conversions.h @@ -1,86 +1,83 @@ -// We use this thin wrapper instead of the plain PyObject pointer to avoid conflicts with specializations of T* -// in QVariant. -struct PyQt_PyObject -{ - PyObject* m_me; - PyQt_PyObject(PyObject* me) : m_me(me) {} - PyQt_PyObject() : m_me(Py_None) {} - operator PyObject*() { return m_me; } -}; - -Q_DECLARE_METATYPE(PyQt_PyObject) - namespace Shiboken { -inline bool Converter<QVariant>::checkType(PyObject* pyObj) +template<> +struct Converter<QVariant> { - return ValueTypeConverter<QVariant>::checkType(pyObj); -} + static bool checkType(PyObject* pyObj) + { + return false; // lets avoid the chaos + } -// all types are convertible to QVariant -inline bool Converter<QVariant>::isConvertible(PyObject* pyObj) -{ - return true; -} + // all types are convertible to QVariant + static bool isConvertible(PyObject* pyObj) + { + return true; + } -inline QVariant Converter<QVariant>::toCpp(PyObject* pyObj) -{ - if (SbkQVariant_Check(pyObj)) - return *Converter<QVariant*>::toCpp(pyObj); + static QVariant toCpp(PyObject* pyObj) + { + using namespace Shiboken; - // Primitive types - if (PyBool_Check(pyObj)) { - // QVariant(bool) - return QVariant(Shiboken::Converter<bool>::toCpp(pyObj)); - } else if (PyString_CheckExact(pyObj)) { - // QVariant(const char*) - return QVariant(Shiboken::Converter<const char *>::toCpp(pyObj)); - } else if (PyFloat_CheckExact(pyObj)) { - // QVariant(double) - return QVariant(Shiboken::Converter<double>::toCpp(pyObj)); - } else if (PyInt_CheckExact(pyObj)) { - // QVariant(int) - return QVariant(Shiboken::Converter<int>::toCpp(pyObj)); - } else if (PyLong_CheckExact(pyObj)) { - // QVariant(qlonglong) - return QVariant(Shiboken::Converter<qlonglong>::toCpp(pyObj)); - } else if (Shiboken::isShibokenEnum(pyObj)) { - // QVariant(enum) - return QVariant(Shiboken::Converter<int>::toCpp(pyObj)); - } else if (!Shiboken::isShibokenType(pyObj) || Shiboken::isUserType(pyObj)) { - // QVariant(User class) - Py_INCREF(pyObj); - return QVariant::fromValue<PyQt_PyObject>(pyObj); - } else { - // a class supported by QVariant? - const char* typeName = pyObj->ob_type->tp_name; - // check if the name starts with PySide. - if (!strncmp("PySide.", typeName, 7)) { - // get the type name - const char* lastDot = typeName; - for (int i = 8; typeName[i]; ++i) { - if (typeName[i] == '.') - lastDot = &typeName[i]; - } - lastDot++; - uint typeCode = QMetaType::type(lastDot); - if (!typeCode) {// Try with star at end, for QObject*, QWidget* and QAbstractKinectScroller* - QString typeName(lastDot); - typeName += '*'; - typeCode = QMetaType::type(typeName.toAscii()); + // Primitive types + if (Converter<bool>::checkType(pyObj)) { + // QVariant(bool) + return QVariant(Converter<bool>::toCpp(pyObj)); + } else if (pyObj == Py_None) { + // QVariant() + return QVariant(); + } else if (Converter<QString>::checkType(pyObj)) { + // QVariant(const char*) + return QVariant(Converter<QString>::toCpp(pyObj)); + } else if (PyFloat_CheckExact(pyObj)) { + // QVariant(double) + return QVariant(Converter<double>::toCpp(pyObj)); + } else if (PyInt_CheckExact(pyObj)) { + // QVariant(int) + return QVariant(Converter<int>::toCpp(pyObj)); + } else if (PyLong_CheckExact(pyObj)) { + // QVariant(qlonglong) + return QVariant(Converter<qlonglong>::toCpp(pyObj)); + } else if (Shiboken::isShibokenEnum(pyObj)) { + // QVariant(enum) + return QVariant(Converter<int>::toCpp(pyObj)); + } else if (!isShibokenType(pyObj) || isUserType(pyObj)) { + // QVariant(User class) + return QVariant::fromValue<PySide::PyObjectWrapper>(pyObj); + } else { + // a class supported by QVariant? + const char* typeName = pyObj->ob_type->tp_name; + // check if the name starts with PySide. + if (!strncmp("PySide.", typeName, 7)) { + // get the type name + const char* lastDot = typeName; + for (int i = 8; typeName[i]; ++i) { + if (typeName[i] == '.') + lastDot = &typeName[i]; + } + lastDot++; + uint typeCode = QMetaType::type(lastDot); + if (!typeCode) {// Try with star at end, for QObject*, QWidget* and QAbstractKinectScroller* + QString typeName(lastDot); + typeName += '*'; + typeCode = QMetaType::type(typeName.toAscii()); + } + if (typeCode) + return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyObj)->cptr[0]); } - if (typeCode) - return QVariant(typeCode, reinterpret_cast<SbkBaseWrapper*>(pyObj)->cptr[0]); + // Is a shiboken type not known by Qt + return QVariant::fromValue<PySide::PyObjectWrapper>(pyObj); } - // Is a shiboken type not known by Qt - Py_INCREF(pyObj); - return QVariant::fromValue<PyQt_PyObject>(pyObj); } -} - -inline PyObject* Converter<QVariant>::toPython(const QVariant& cppObj) -{ - return ValueTypeConverter<QVariant>::toPython(cppObj); -} + static PyObject* toPython(void* cppObj) { return toPython(*reinterpret_cast<QVariant*>(cppObj)); } + static PyObject* toPython(const QVariant& cppObj) + { + if (cppObj.isValid()) { + Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(cppObj.typeName()); + if (tr) + return tr->toPython(const_cast<void*>(cppObj.data())); + } + Py_RETURN_NONE; + } +}; } diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 625886198..85694e4ec 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -74,7 +74,6 @@ <enum-type name="QXmlStreamReader::Error"/> <enum-type name="QXmlStreamReader::TokenType"/> <enum-type name="QLineF::IntersectType" /> - <enum-type name="QVariant::Type" /> <!-- From Qt4.6 --> <enum-type name="QXmlStreamReader::ReadElementTextBehaviour"/> <enum-type name="QDataStream::FloatingPointPrecision"/> @@ -129,7 +128,10 @@ <primitive-type name="signed long"/> <primitive-type name="long"/> <primitive-type name="unsigned long"/> - <primitive-type name="WId"/> + <primitive-type name="WId"> + <!-- FIXME This is a workaround to include some headers needed by some includes (nothing to do with QBool) --> + <include file-name="signalmanager.h" location="global"/> + </primitive-type> <primitive-type name="Qt::HANDLE" target-lang-api-name="PyLong"> <!-- FIXME APIExtractor or shiboken do not support multiple includes by primitive type --> <include file-name="QTextDocument" location="global"/> @@ -154,6 +156,10 @@ <primitive-type name="QChar"> <conversion-rule file="qchar_conversions.h" /> </primitive-type> + <primitive-type name="QVariant"> + <conversion-rule file="qvariant_conversions.h" /> + <include file-name="typeresolver.h" location="global"/> + </primitive-type> <container-type name="QSet" type="set"> <conversion-rule file="qset_conversions.h"/> @@ -248,7 +254,6 @@ <rejection class="*" field-name="staticMetaObject"/> <!-- not support array in property --> <rejection class="QTextCodec::ConverterState" field-name="state_data"/> - <rejection class="QVariant" field-name="handler"/> <rejection class="QUuid" field-name="data1"/> <rejection class="QUuid" field-name="data2"/> <rejection class="QUuid" field-name="data3"/> @@ -541,16 +546,6 @@ <rejection class="reverse_iterator"/> <rejection class="stat"/> <rejection class="tm"/> - <rejection class="QVariant" function-name="canConvert"/> - <rejection class="QVariant" function-name="fromValue"/> - <rejection class="QVariant" function-name="value"/> - <rejection class="QVariant" function-name="setValue"/> - <rejection class="QVariant" function-name="data"/> - <rejection class="QVariant" function-name="constData"/> - <rejection class="QStringRef" function-name="constData"/> - <rejection class="QStringRef" function-name="data"/> - <rejection class="QStringRef" function-name="unicode"/> - <rejection class="QStringRef" function-name="string"/> <rejection class="QAbstractEventDispatcher" function-name="filterEvent"/> <rejection class="QAbstractEventDispatcher" function-name="setEventFilter"/> <rejection class="QAbstractFileEngine" function-name="beginEntryList"/> @@ -1241,172 +1236,6 @@ </modify-argument> </modify-function> </object-type> - <value-type name="QVariant"> - <conversion-rule file="qvariant_conversions.h" /> - <modify-function signature="create(int,const void*)" remove="all" /> - - <!-- QVariant constructor is a beast with its own rules --> - <modify-function signature="QVariant(float)" remove="all"/> - <modify-function signature="QVariant(int)" remove="all"/> - <modify-function signature="QVariant(double)" remove="all"/> - <modify-function signature="QVariant(bool)" remove="all"/> - <modify-function signature="QVariant(qlonglong)" remove="all"/> - <modify-function signature="QVariant(int, const void*)" remove="all"/> - <modify-function signature="QVariant(int,const void*,uint)" remove="all"/> - <!-- handled by inject code --> - <modify-function signature="QVariant(uint)" remove="all"/> - <modify-function signature="QVariant(qulonglong)" remove="all"/> - <modify-function signature="QVariant(const QByteArray&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(QDataStream&)" remove="all"/> - <modify-function signature="QVariant(const QBitArray&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QString&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QStringList&)" remove="all"/> - <modify-function signature="QVariant(const QChar&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QDate&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QTime&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QDateTime&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QSize&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QSizeF&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QPoint&)"> - <access modifier="private" /> - </modify-function>> - <modify-function signature="QVariant(const QPointF&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QRect&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QRectF&)" > - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QUrl&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QLocale&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(const QRegExp&)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(QHash<QString,QVariant>)" remove="all" /> - <modify-function signature="QVariant(QMap<QString,QVariant>)" remove="all" /> - <modify-function signature="QVariant(QList<QVariant>)" remove="all" /> - <modify-function signature="QVariant(QVariant)" remove="all" /> - <modify-function signature="QVariant(QLine)"> - <access modifier="private" /> - </modify-function> - <modify-function signature="QVariant(QLineF)"> - <access modifier="private" /> - </modify-function> - - <add-function signature="QVariant(PyObject*)"> - <inject-code class="target" position="beginning"> - %0 = new %TYPE(%CONVERTTOCPP[QVariant](%PYARG_1)); - </inject-code> - </add-function> - <add-function signature="toPyObject()" return-type="PyObject*"> - <inject-code class="target" position="beginning"> - uint typeId = %CPPSELF.userType(); - if (typeId == qMetaTypeId<PyQt_PyObject>()) { - %PYARG_0 = %CPPSELF.value<PyQt_PyObject>(); - } else if (typeId == QVariant::String) { - %PYARG_0 = %CONVERTTOPYTHON[QString](%CPPSELF.toString()); - } else { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } - </inject-code> - </add-function> - <modify-function signature="typeName()const"> - <inject-code class="target" position="beginning"> - if (%CPPSELF.isNull()) { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } else if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { - // emulate PyQt4 behaviour - PyObject* obj = %CPPSELF.value<PyQt_PyObject>(); - if (PySequence_Check(obj)) - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE]("QVariantList"); - } - if (!%PYARG_0) - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME()); - </inject-code> - </modify-function> - <modify-function signature="toList()const"> - <inject-code class="target" position="beginning"> - if (%CPPSELF.userType() == qMetaTypeId<PyQt_PyObject>()) { - PyObject* val = %CPPSELF.value<PyQt_PyObject>(); - if (PySequence_Check(val)) { - %PYARG_0 = val; - Py_INCREF(val); - } else { - %PYARG_0 = Py_None; - Py_INCREF(Py_None); - } - } else { - %PYARG_0 = %CONVERTTOPYTHON[%RETURN_TYPE](%CPPSELF.%FUNCTION_NAME()); - } - </inject-code> - </modify-function> - <modify-function signature="toDouble(bool*)const"> - <modify-argument index="1"> - <remove-argument/> - </modify-argument> - <inject-code class="target" position="beginning"> - <insert-template name="fix_bool*"/> - </inject-code> - </modify-function> - <modify-function signature="toInt(bool*)const"> - <modify-argument index="1"> - <remove-argument/> - </modify-argument> - <inject-code class="target" position="beginning"> - <insert-template name="fix_bool*"/> - </inject-code> - </modify-function> - <modify-function signature="toLongLong(bool*)const"> - <modify-argument index="1"> - <remove-argument/> - </modify-argument> - <inject-code class="target" position="beginning"> - <insert-template name="fix_bool*"/> - </inject-code> - </modify-function> - <modify-function signature="toUInt(bool*)const"> - <modify-argument index="1"> - <remove-argument/> - </modify-argument> - <inject-code class="target" position="beginning"> - <insert-template name="fix_bool*"/> - </inject-code> - </modify-function> - <modify-function signature="toULongLong(bool*)const"> - <modify-argument index="1"> - <remove-argument/> - </modify-argument> - <inject-code class="target" position="beginning"> - <insert-template name="fix_bool*"/> - </inject-code> - </modify-function> - </value-type> <object-type name="QAbstractListModel" polymorphic-id-expression="qobject_cast<QAbstractListModel*>(%1)"> <extra-includes> <include file-name="QStringList" location="global"/> |