diff options
Diffstat (limited to 'PySide')
-rw-r--r-- | PySide/QtCore/typesystem_core.xml | 98 | ||||
-rw-r--r-- | PySide/QtDeclarative/pysideqmlregistertype.cpp | 4 | ||||
-rw-r--r-- | PySide/QtDeclarative/typesystem_declarative.xml | 3 | ||||
-rw-r--r-- | PySide/QtGui/typesystem_gui_win.xml | 20 | ||||
-rw-r--r-- | PySide/QtSql/typesystem_sql.xml | 3 |
5 files changed, 71 insertions, 57 deletions
diff --git a/PySide/QtCore/typesystem_core.xml b/PySide/QtCore/typesystem_core.xml index 59325b009..c441bf298 100644 --- a/PySide/QtCore/typesystem_core.xml +++ b/PySide/QtCore/typesystem_core.xml @@ -170,7 +170,7 @@ <!-- FIXME This is a workaround to include some headers needed by some includes (nothing to do with QBool) --> <include file-name="QtConcurrentFilter" location="global"/> </primitive-type> - <primitive-type name="QString"> + <primitive-type name="QString" target-lang-api-name="PyUnicode"> <include file-name="QString" location="global"/> <conversion-rule file="qstring_conversions.h"> <native-to-target> @@ -248,22 +248,28 @@ <native-to-target> if (!%in.isValid()) Py_RETURN_NONE; + 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())); - // TODO-CONVERTERS: SET ERROR + + Shiboken::Conversions::SpecificConverter converter(cppInRef.typeName()); + if (converter) { + void* ptr = cppInRef.data(); + return converter.toPython(ptr); + } + PyErr_Format(PyExc_RuntimeError, "Can't find converter for '%s'.", %in.typeName()); return 0; </native-to-target> <target-to-native> @@ -273,11 +279,11 @@ <add-conversion type="Py_None"> %out = %OUTTYPE(); </add-conversion> - <add-conversion type="PyString" check="%CHECKTYPE[QString](%in)"> + <add-conversion type="QString" check="Shiboken::String::check(%in)"> QString in = %CONVERTTOCPP[QString](%in); %out = %OUTTYPE(in); </add-conversion> - <add-conversion type="QByteArray" check="%CHECKTYPE[QByteArray](%in)"> + <add-conversion type="QByteArray"> QByteArray in = %CONVERTTOCPP[QByteArray](%in); %out = %OUTTYPE(in); </add-conversion> @@ -301,19 +307,16 @@ // a class supported by QVariant? int typeCode; const char* typeName = QVariant_resolveMetaType(%in->ob_type, &typeCode); - if (typeCode && typeName) { - Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(typeName); - QVariant var(typeCode, (void*)0); - void* args[] = { var.data() }; - tr->toCpp(%in, args); - %out = var; - } + if (!typeCode || !typeName) + return; + QVariant var(typeCode, (void*)0); + Shiboken::Conversions::SpecificConverter converter(typeName); + converter.toCpp(pyIn, var.data()); + %out = var; </add-conversion> <add-conversion type="PyDict"> QVariant ret = QVariant_convertToVariantMap(%in); - if (ret.isValid()) - %out = ret; - %out = QVariant::fromValue<PySide::PyObjectWrapper>(%in); + %out = ret.isValid() ? ret : QVariant::fromValue<PySide::PyObjectWrapper>(%in); </add-conversion> <add-conversion type="PySequence"> %out = QVariant_convertToVariantList(%in); @@ -372,15 +375,13 @@ listTypeName += '>'; typeId = QMetaType::type(listTypeName); if (typeId > 0) { - Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(listTypeName); - if (!tr) { - qWarning() << "TypeResolver for :" << listTypeName << "not registered."; - } else { + Shiboken::Conversions::SpecificConverter converter(listTypeName); + if (converter) { QVariant var(typeId, (void*)0); - void* args[] = { var.data(), 0 }; - tr->toCpp(list, args); + converter.toCpp(list, &var); return var; } + qWarning() << "Type converter for :" << listTypeName << "not registered."; } } return QVariant(); @@ -417,25 +418,22 @@ } static QVariant QVariant_convertToVariantList(PyObject* list) { - bool allString = QVariant_isStringList(list); - if (allString) { + if (QVariant_isStringList(list)) { QList<QString > lst = %CONVERTTOCPP[QList<QString>](list); return QVariant(QStringList(lst)); - } else { - QVariant valueList = QVariant_convertToValueList(list); - if (valueList.isValid()) - return valueList; - QList<QVariant> lst; - Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); - Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); - for (int i = 0; i < size; ++i) { - PyObject* pyItem = PySequence_Fast_GET_ITEM(fast.object(), i); - QVariant item = %CONVERTTOCPP[QVariant](pyItem); - lst.append(item); - } - return QVariant(lst); } - Q_ASSERT(false); + QVariant valueList = QVariant_convertToValueList(list); + if (valueList.isValid()) + return valueList; + QList<QVariant> lst; + Shiboken::AutoDecRef fast(PySequence_Fast(list, "Failed to convert QVariantList")); + Py_ssize_t size = PySequence_Fast_GET_SIZE(fast.object()); + for (int i = 0; i < size; ++i) { + PyObject* pyItem = PySequence_Fast_GET_ITEM(fast.object(), i); + QVariant item = %CONVERTTOCPP[QVariant](pyItem); + lst.append(item); + } + return QVariant(lst); } </inject-code> @@ -444,12 +442,10 @@ <native-to-target> const char* typeName = QVariant::typeToName(%in); PyObject* %out; - if (!typeName) { - %out = Py_None; - } else { - Shiboken::TypeResolver* tr = Shiboken::TypeResolver::get(typeName); - %out = tr ? (PyObject*)tr->pythonType() : Py_None; - } + PyTypeObject* pyType = 0; + if (typeName) + pyType = Shiboken::Conversions::getPythonTypeObject(typeName); + %out = pyType ? ((PyObject*)pyType) : Py_None; Py_INCREF(%out); return %out; </native-to-target> @@ -492,7 +488,10 @@ </conversion-rule> </primitive-type> - <primitive-type name="QVariantMap" /> + <primitive-type name="QVariantMap" target-lang-api-name="PyDict"/> + <inject-code class="target" position="end"> + Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QTCORE_QMAP_QSTRING_QVARIANT_IDX], "QVariantMap"); + </inject-code> <inject-code class="native" position="beginning"> static bool QVariantType_isStringList(PyObject* list) @@ -920,9 +919,10 @@ <!--signal/slot--> <inject-code class="target" position="end"> - Shiboken::TypeResolver::createValueTypeResolver<QString>("unicode"); - Shiboken::TypeResolver::createValueTypeResolver<QString>("str"); - Shiboken::TypeResolver::createValueTypeResolver<QVariantList>("QVariantList"); + Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QSTRING_IDX], "unicode"); + Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QSTRING_IDX], "str"); + Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QTCORE_QLIST_QVARIANT_IDX], "QVariantList"); + PySide::init(module); Py_AtExit(QtCoreModuleExit); </inject-code> diff --git a/PySide/QtDeclarative/pysideqmlregistertype.cpp b/PySide/QtDeclarative/pysideqmlregistertype.cpp index 6c595167b..30844c671 100644 --- a/PySide/QtDeclarative/pysideqmlregistertype.cpp +++ b/PySide/QtDeclarative/pysideqmlregistertype.cpp @@ -93,8 +93,8 @@ int PySide::qmlRegisterType(PyObject* pyObj, const char* uri, int versionMajor, { using namespace Shiboken; - static PyTypeObject* qobjectType = TypeResolver::get("QObject*")->pythonType(); - static PyTypeObject* qdeclarativeType = TypeResolver::get("QDeclarativeItem*")->pythonType(); + static PyTypeObject* qobjectType = Shiboken::Conversions::getPythonTypeObject("QObject*"); + static PyTypeObject* qdeclarativeType = Shiboken::Conversions::getPythonTypeObject("QDeclarativeItem*"); assert(qobjectType); static int nextType = 0; diff --git a/PySide/QtDeclarative/typesystem_declarative.xml b/PySide/QtDeclarative/typesystem_declarative.xml index 91c2e487b..1bc18bad8 100644 --- a/PySide/QtDeclarative/typesystem_declarative.xml +++ b/PySide/QtDeclarative/typesystem_declarative.xml @@ -60,8 +60,7 @@ </enum-type> <inject-code class="target" position="end"> - Shiboken::TypeResolver::createValueTypeResolver< QList<QObject*> >("QList<QObject*>"); - PySide::initQmlSupport(module); + PySide::initQmlSupport(module); </inject-code> <object-type name="QDeclarativeExtensionInterface"/> diff --git a/PySide/QtGui/typesystem_gui_win.xml b/PySide/QtGui/typesystem_gui_win.xml index a0cfe84f2..28b48e6f8 100644 --- a/PySide/QtGui/typesystem_gui_win.xml +++ b/PySide/QtGui/typesystem_gui_win.xml @@ -23,14 +23,32 @@ <primitive-type name="WId" target-lang-api-name="PyObject"> <conversion-rule file="glue/wid_conversions.h"> <native-to-target> + #ifdef IS_PY3K + return PyCapsule_New(%in, 0, 0); + #else return PyCObject_FromVoidPtr(%in, 0); + #endif </native-to-target> <target-to-native> - <add-conversion type="PyCObject"> + <add-conversion type="checkPyCapsuleOrPyCObject"> + #ifdef IS_PY3K + %out = (%OUTTYPE)PyCapsule_GetPointer(%in, 0); + #else %out = (%OUTTYPE)PyCObject_AsVoidPtr(%in); + #endif </add-conversion> </target-to-native> </conversion-rule> </primitive-type> + <inject-code class="native" position="beginning"> + static bool checkPyCapsuleOrPyCObject(PyObject* pyObj) + { + #ifdef IS_PY3K + return PyCapsule_CheckExact(pyObj); + #else + return PyCObject_Check(pyObj); + #endif + } + </inject-code> <enum-type name="QPixmap::HBitmapFormat" /> </typesystem> diff --git a/PySide/QtSql/typesystem_sql.xml b/PySide/QtSql/typesystem_sql.xml index d6007ef21..2efe4290f 100644 --- a/PySide/QtSql/typesystem_sql.xml +++ b/PySide/QtSql/typesystem_sql.xml @@ -81,9 +81,6 @@ <include file-name="QSqlField" location="global"/> </extra-includes> <modify-function signature="append(QSqlField)" access="non-final"/> - <inject-code position="end"> - Shiboken::TypeResolver::createReferenceTypeResolver< ::QSqlRecord >("QSqlRecord&"); - </inject-code> </value-type> <value-type name="QSqlError"> |