From bac154b896b39c1e817742ce2213da3e0d346977 Mon Sep 17 00:00:00 2001 From: Renato Filho Date: Mon, 12 Jul 2010 18:45:19 -0300 Subject: Create support to QVariantList and QVariantMap. Fixes bug: #263 Reviewer: Marcelo Lira Luciano Wolf --- PySide/QtCore/qvariant_type_conversions.h | 32 ++++++++++++++++++++++++++++++- 1 file changed, 31 insertions(+), 1 deletion(-) (limited to 'PySide/QtCore/qvariant_type_conversions.h') diff --git a/PySide/QtCore/qvariant_type_conversions.h b/PySide/QtCore/qvariant_type_conversions.h index 107fb4203..d1cf9f0ca 100644 --- a/PySide/QtCore/qvariant_type_conversions.h +++ b/PySide/QtCore/qvariant_type_conversions.h @@ -15,7 +15,7 @@ struct Converter static QVariant::Type toCpp(PyObject* pyObj) { - const char* typeName; + const char* typeName = 0; if (pyObj == Py_None) return QVariant::Invalid; @@ -31,6 +31,15 @@ struct Converter typeName = PyString_AS_STRING(pyObj); else if (PyUnicode_Check(pyObj)) typeName = PyString_AsString(pyObj); + else if (PyDict_Check(pyObj) && checkAllStringKeys(pyObj)) + typeName = "QVariantMap"; + else if (PySequence_Check(pyObj)) + if (isStringList(pyObj)) + typeName = "QStringList"; + else + typeName = "QVariantList"; + else + Q_ASSERT(false); return QVariant::nameToType(typeName); } @@ -49,5 +58,26 @@ struct Converter Py_INCREF(pyObj); return pyObj; } + + static bool isStringList(PyObject* list) + { + bool allString = true; + 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* item = PySequence_Fast_GET_ITEM(fast.object(), i); + if (!Converter::checkType(item)) { + allString = false; + break; + } + } + return allString; + } + + static bool checkAllStringKeys(PyObject* dict) + { + AutoDecRef keys(PyDict_Keys(dict)); + return isStringList(keys); + } }; } -- cgit v1.2.3