diff options
author | Marcelo Lira <marcelo.lira@openbossa.org> | 2011-08-31 14:49:57 -0300 |
---|---|---|
committer | Hugo Parente Lima <hugo.pl@gmail.com> | 2012-03-08 16:56:19 -0300 |
commit | 3ee5bec24438deb08a45a62559e35528f0f4105c (patch) | |
tree | 6fea43329e758fa1c6ddc83de83332a47be297e1 /PySide | |
parent | ae0f62ed80506e744e7c7b9df69cbc0430ed920b (diff) |
New containers for container types.
Diffstat (limited to 'PySide')
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 230 |
1 files changed, 206 insertions, 24 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index b7d9ae661..7ba6ea4a8 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -173,7 +173,6 @@ <primitive-type name="QString"> <include file-name="QString" location="global"/> <conversion-rule file="qstring_conversions.h"> - <type-check check="PyUnicode_Check(%in) || PyString_Check(%in) || %in == Py_None"/> <native-to-target> const int N = %in.length(); wchar_t* str = new wchar_t[N]; @@ -202,6 +201,7 @@ </target-to-native> </conversion-rule> </primitive-type> + <primitive-type name="QStringRef"> <include file-name="datetime.h" location="global"/> <conversion-rule file="qstringref_conversions.h"> @@ -248,12 +248,18 @@ <native-to-target> if (!%in.isValid()) Py_RETURN_NONE; - if (qstrcmp(%in.typeName(), "QVariantList") == 0) - return %CONVERTTOPYTHON[QList<QVariant>](%in.value<QVariantList>()); - if (qstrcmp(%in.typeName(), "QStringList") == 0) - return %CONVERTTOPYTHON[QList<QString>](%in.value<QStringList>()); - if (qstrcmp(%in.typeName(), "QVariantMap") == 0) - return %CONVERTTOPYTHON[QMap<QString, QVariant>](%in.value<QVariantMap>()); + if (qstrcmp(%in.typeName(), "QVariantList") == 0) { + QList<QVariant> var = %in.value<QVariantList>(); + return %CONVERTTOPYTHON[QList<QVariant>](var); + } + if (qstrcmp(%in.typeName(), "QStringList") == 0) { + QStringList var = %in.value<QStringList>(); + return %CONVERTTOPYTHON[QList<QString>](var); + } + if (qstrcmp(%in.typeName(), "QVariantMap") == 0) { + QMap<QString, QVariant> var = %in.value<QVariantMap>(); + return %CONVERTTOPYTHON[QMap<QString, QVariant>](var); + } Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(%in.typeName()); if (tr) return tr->toPython(const_cast<void*>(%in.data())); @@ -413,8 +419,8 @@ { bool allString = QVariant_isStringList(list); if (allString) { - QStringList lst = %CONVERTTOCPP[QList<QString>](list); - return QVariant(lst); + QList<QString > lst = %CONVERTTOCPP[QList<QString>](list); + return QVariant(QStringList(lst)); } else { QVariant valueList = QVariant_convertToValueList(list); if (valueList.isValid()) @@ -510,50 +516,206 @@ } </inject-code> + <template name="cpplist_to_pylist_convertion"> + PyObject* %out = PyList_New((int) %in.size()); + %INTYPE::const_iterator it = %in.begin(); + for (int idx = 0; it != %in.end(); ++it, ++idx) { + %INTYPE_0 cppItem(*it); + PyList_SET_ITEM(%out, idx, %CONVERTTOPYTHON[%INTYPE_0](cppItem)); + } + return %out; + </template> + <template name="pyseq_to_cpplist_convertion"> + for (int i = 0; i < PySequence_Size(%in); i++) { + Shiboken::AutoDecRef pyItem(PySequence_GetItem(%in, i)); + %OUTTYPE_0 cppItem = %CONVERTTOCPP[%OUTTYPE_0](pyItem); + %out << cppItem; + } + </template> + <primitive-type name="QStringList"> <include file-name="QStringList" location="global"/> - <conversion-rule file="qstringlist_conversions.h" /> + <conversion-rule file="qstringlist_conversions.h"> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"> + <replace from="%INTYPE_0" to="QString" /> + </insert-template> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"> + <replace from="%OUTTYPE_0" to="QString" /> + </insert-template> + </add-conversion> + </target-to-native> + </conversion-rule> </primitive-type> <container-type name="QSet" type="set"> - <conversion-rule file="qset_conversions.h"/> <include file-name="QSet" location="global"/> + <conversion-rule file="qset_conversions.h"> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> <container-type name="QList" type="list"> - <conversion-rule file="qlist_conversions.h"/> <include file-name="QList" location="global"/> + <conversion-rule file="qlist_conversions.h"> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> <container-type name="QVector" type="vector"> - <conversion-rule file="qvector_conversions.h"/> <include file-name="QVector" location="global"/> + <conversion-rule file="qvector_conversions.h"> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> + </container-type> - <container-type name="QStack" type="vector"> + <container-type name="QStack" type="stack"> <include file-name="QStack" location="global"/> - <conversion-rule file="qstack_conversion.h"/> + <conversion-rule file="qstack_conversion.h"> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> - <container-type name="QQueue" type="queue"/> + <container-type name="QQueue" type="queue"> + <include file-name="QQueue" location="global"/> + <conversion-rule> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> + </container-type> + + <container-type name="QLinkedList" type="linked-list"> + <include file-name="QLinkedList" location="global"/> + <conversion-rule> + <native-to-target> + <insert-template name="cpplist_to_pylist_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + <insert-template name="pyseq_to_cpplist_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> + </container-type> + + <template name="cppmap_to_pymap_convertion"> + PyObject* %out = PyDict_New(); + %INTYPE::const_iterator it = %in.begin(); + for (; it != %in.end(); ++it) { + %INTYPE_0 key = it.key(); + %INTYPE_1 value = it.value(); + PyDict_SetItem(%out, + %CONVERTTOPYTHON[%INTYPE_0](key), + %CONVERTTOPYTHON[%INTYPE_1](value)); + } + return %out; + </template> + <template name="pydict_to_cppmap_convertion"> + PyObject* key; + PyObject* value; + Py_ssize_t pos = 0; + while (PyDict_Next(%in, &pos, &key, &value)) { + %OUTTYPE_0 cppKey = %CONVERTTOCPP[%OUTTYPE_0](key); + %OUTTYPE_1 cppValue = %CONVERTTOCPP[%OUTTYPE_1](value); + %out.insert(cppKey, cppValue); + } + </template> <container-type name="QHash" type="hash"> - <conversion-rule file="qhash_conversions.h"/> <include file-name="QHash" location="global"/> <include file-name="pysideconversions.h" location="global"/> + <conversion-rule file="qhash_conversions.h"> + <native-to-target> + <insert-template name="cppmap_to_pymap_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PyDict"> + <insert-template name="pydict_to_cppmap_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> - <container-type name="QLinkedList" type="linked-list"/> <container-type name="QMap" type="map"> - <conversion-rule file="qmap_conversions.h"/> <include file-name="QMap" location="global"/> + <conversion-rule file="qmap_conversions.h"> + <native-to-target> + <insert-template name="cppmap_to_pymap_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PyDict"> + <insert-template name="pydict_to_cppmap_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> <container-type name="QMultiMap" type="multi-map"> - <conversion-rule file="qmultimap_conversions.h"/> <include file-name="QMultiMap" location="global"/> + <conversion-rule file="qmultimap_conversions.h"> + <native-to-target> + <insert-template name="cppmap_to_pymap_convertion"/> + </native-to-target> + <target-to-native> + <add-conversion type="PyDict"> + <insert-template name="pydict_to_cppmap_convertion"/> + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> + <container-type name="QPair" type="pair"> - <conversion-rule file="qpair_conversions.h"/> <include file-name="QPair" location="global"/> + <conversion-rule file="qpair_conversions.h"> + <native-to-target> + PyObject* %out = PyTuple_New(2); + PyTuple_SET_ITEM(%out, 0, %CONVERTTOPYTHON[%INTYPE_0](%in.first)); + PyTuple_SET_ITEM(%out, 1, %CONVERTTOPYTHON[%INTYPE_1](%in.second)); + return %out; + </native-to-target> + <target-to-native> + <add-conversion type="PySequence"> + %out.first = %CONVERTTOCPP[%OUTTYPE_0](PySequence_Fast_GET_ITEM(%in, 0)); + %out.second = %CONVERTTOCPP[%OUTTYPE_1](PySequence_Fast_GET_ITEM(%in, 1)); + </add-conversion> + </target-to-native> + </conversion-rule> </container-type> <rejection class="*" function-name="d_func"/> @@ -2436,6 +2598,9 @@ </inject-code> </modify-function> <modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)"> + <modify-argument index="return"> + <replace-type modified-type="PyObject"/> + </modify-argument> <inject-code> %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); </inject-code> @@ -2640,6 +2805,10 @@ <parent index="this" action="add"/> </modify-argument> </modify-function> + <!-- fromUnicode(QString) does the job --> + <modify-function signature="fromUnicode(const QChar*,int)" remove="all" /> + <modify-function signature="fromUnicode(const QChar*,int,QTextCodec::ConverterState*)const" remove="all" /> + <modify-function signature="convertFromUnicode(const QChar*,int,QTextCodec::ConverterState*)const" remove="all" /> </object-type> <object-type name="QTextDecoder"> <!-- ### toUnicode(QByteArray) to the job --> @@ -2648,7 +2817,7 @@ <!-- ### --> </object-type> <object-type name="QTextEncoder"> - <!-- fromUnicode(String) do the job --> + <!-- fromUnicode(QString) does the job --> <modify-function signature="fromUnicode(const QChar*,int)" remove="all" /> </object-type> <object-type name="QTimeLine"> @@ -2799,6 +2968,9 @@ </inject-code> </modify-function> <modify-function signature="map(qint64,qint64,QFile::MemoryMapFlags)"> + <modify-argument index="return"> + <replace-type modified-type="PyObject"/> + </modify-argument> <inject-code> %PYARG_0 = Shiboken::Buffer::newObject(%CPPSELF.%FUNCTION_NAME(%1, %2, %3), %2, Shiboken::Buffer::ReadWrite); </inject-code> @@ -3290,9 +3462,10 @@ <enum-type name="RealNumberNotation"/> <enum-type name="Status"/> <!-- Removed because it expect QString to be mutable --> - <modify-function signature="QTextStream(QString*,QFlags<QIODevice::OpenModeFlag>)" /> - <!-- Remvoed because we use the non-const version --> + <modify-function signature="QTextStream(QString*,QFlags<QIODevice::OpenModeFlag>)" remove="all"/> + <!-- Removed because we use the non-const version --> <modify-function signature="QTextStream(const QByteArray&, QFlags<QIODevice::OpenModeFlag>)" remove="all"/> + <!-- Removed because it expect QString to be mutable --> <modify-function signature="setString(QString*,QFlags<QIODevice::OpenModeFlag>)" remove="all"/> @@ -3324,6 +3497,15 @@ <!-- Removed because it expect QString to be mutable --> <modify-function signature="operator>>(QString&)" remove="all"/> + <modify-function signature="string()const"> + <modify-argument index="return"> + <!--<replace-type modified-type="QString" />--> + <conversion-rule class="target"> + QString& res = *%0; + %PYARG_0 = %CONVERTTOPYTHON[QString](res); + </conversion-rule> + </modify-argument> + </modify-function> <modify-function signature="flush()" allow-thread="yes"/> <modify-function signature="read(qint64)" allow-thread="yes"/> |