From 2a87b74bfea936691db2eb97a8ab2788277869b6 Mon Sep 17 00:00:00 2001 From: Marcelo Lira Date: Tue, 1 Nov 2011 18:42:47 -0300 Subject: Replaced TypeResolver by SbkConverter and SpecificConverter. Also updated QtGui's WId conversion to Python 3. --- PySide/QtCore/typesystem_core.xml | 98 ++++++++++++------------- PySide/QtDeclarative/pysideqmlregistertype.cpp | 4 +- PySide/QtDeclarative/typesystem_declarative.xml | 3 +- PySide/QtGui/typesystem_gui_win.xml | 20 ++++- PySide/QtSql/typesystem_sql.xml | 3 - 5 files changed, 71 insertions(+), 57 deletions(-) (limited to 'PySide') 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 @@ - + @@ -248,22 +248,28 @@ 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; @@ -273,11 +279,11 @@ %out = %OUTTYPE(); - + QString in = %CONVERTTOCPP[QString](%in); %out = %OUTTYPE(in); - + QByteArray in = %CONVERTTOCPP[QByteArray](%in); %out = %OUTTYPE(in); @@ -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; 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); %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); } @@ -444,12 +442,10 @@ 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; @@ -492,7 +488,10 @@ - + + + Shiboken::Conversions::registerConverterName(SbkPySide_QtCoreTypeConverters[SBK_QTCORE_QMAP_QSTRING_QVARIANT_IDX], "QVariantMap"); + static bool QVariantType_isStringList(PyObject* list) @@ -920,9 +919,10 @@ - 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); 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 @@ - Shiboken::TypeResolver::createValueTypeResolver< QList<QObject*> >("QList<QObject*>"); - PySide::initQmlSupport(module); + PySide::initQmlSupport(module); 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 @@ + #ifdef IS_PY3K + return PyCapsule_New(%in, 0, 0); + #else return PyCObject_FromVoidPtr(%in, 0); + #endif - + + #ifdef IS_PY3K + %out = (%OUTTYPE)PyCapsule_GetPointer(%in, 0); + #else %out = (%OUTTYPE)PyCObject_AsVoidPtr(%in); + #endif + + static bool checkPyCapsuleOrPyCObject(PyObject* pyObj) + { + #ifdef IS_PY3K + return PyCapsule_CheckExact(pyObj); + #else + return PyCObject_Check(pyObj); + #endif + } + 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 @@ - - Shiboken::TypeResolver::createReferenceTypeResolver< ::QSqlRecord >("QSqlRecord&"); - -- cgit v1.2.3