Updated type system and QString and QPixmap conversions to be extensible.

And removed the QkeySequence test from the black list (the list of tests
expected to fail).

Reviewed by Hugo Parente <hugo.lima@openbossa.org>
Reviewed by Lauro Moura <lauro.neto@openbossa.org>
This commit is contained in:
Marcelo Lira 2010-03-02 13:30:38 -03:00
commit 77bb1220b4
4 changed files with 20 additions and 2 deletions

View file

@ -1,6 +1,7 @@
namespace Shiboken { namespace Shiboken {
inline bool Converter< QString >::isConvertible(PyObject* pyobj) inline bool Converter< QString >::isConvertible(PyObject* pyobj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>());
return PyString_Check(pyobj) return PyString_Check(pyobj)
|| PyUnicode_Check(pyobj) || PyUnicode_Check(pyobj)
|| SbkQByteArray_Check(pyobj) || SbkQByteArray_Check(pyobj)
@ -10,11 +11,13 @@ inline bool Converter< QString >::isConvertible(PyObject* pyobj)
&& PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER) && PyType_HasFeature(pyobj->ob_type, Py_TPFLAGS_HAVE_GETCHARBUFFER)
&& pyobj->ob_type->tp_as_buffer->bf_getcharbuffer) && pyobj->ob_type->tp_as_buffer->bf_getcharbuffer)
#endif #endif
|| SbkQChar_Check(pyobj); || SbkQChar_Check(pyobj)
|| (shiboType->ext_isconvertible && shiboType->ext_isconvertible(pyobj));
} }
inline QString Converter< QString >::toCpp(PyObject* pyobj) inline QString Converter< QString >::toCpp(PyObject* pyobj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QString>());
if (SbkQChar_Check(pyobj)) { if (SbkQChar_Check(pyobj)) {
return QString(Converter< QChar >::toCpp(pyobj)); return QString(Converter< QChar >::toCpp(pyobj));
} else if (SbkQByteArray_Check(pyobj)) { } else if (SbkQByteArray_Check(pyobj)) {
@ -50,6 +53,11 @@ inline QString Converter< QString >::toCpp(PyObject* pyobj)
return QString(data); return QString(data);
} }
#endif #endif
else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyobj)) {
QString* cptr = reinterpret_cast<QString*>(shiboType->ext_tocpp(pyobj));
std::auto_ptr<QString> cptr_auto_ptr(cptr);
return *cptr;
}
return *Converter<QString*>::toCpp(pyobj); return *Converter<QString*>::toCpp(pyobj);
} }
} }

View file

@ -1,12 +1,15 @@
namespace Shiboken { namespace Shiboken {
inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj) inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QPixmap>());
bool isVariant = SbkQVariant_Check(pyobj); bool isVariant = SbkQVariant_Check(pyobj);
if (isVariant) { if (isVariant) {
QVariant var(Converter<QVariant>::toCpp(pyobj)); QVariant var(Converter<QVariant>::toCpp(pyobj));
return var.type() == QVariant::Pixmap; return var.type() == QVariant::Pixmap;
} else if (SbkQSize_Check(pyobj) || SbkQString_Check(pyobj)) { } else if (SbkQSize_Check(pyobj) || SbkQString_Check(pyobj)) {
return true; return true;
} else if (shiboType->ext_isconvertible) {
return shiboType->ext_isconvertible(pyobj);
} }
return false; return false;
@ -14,6 +17,7 @@ inline bool Converter< QPixmap >::isConvertible(PyObject* pyobj)
inline QPixmap Converter< QPixmap >::toCpp(PyObject* pyobj) inline QPixmap Converter< QPixmap >::toCpp(PyObject* pyobj)
{ {
SbkBaseWrapperType* shiboType = reinterpret_cast<SbkBaseWrapperType*>(SbkType<QPixmap>());
bool isVariant = SbkQVariant_Check(pyobj); bool isVariant = SbkQVariant_Check(pyobj);
if (isVariant) { if (isVariant) {
QVariant var(Converter<QVariant>::toCpp(pyobj)); QVariant var(Converter<QVariant>::toCpp(pyobj));
@ -22,6 +26,10 @@ inline QPixmap Converter< QPixmap >::toCpp(PyObject* pyobj)
return QPixmap(Shiboken::Converter<QSize& >::toCpp(pyobj)); return QPixmap(Shiboken::Converter<QSize& >::toCpp(pyobj));
} else if (SbkQString_Check(pyobj)) { } else if (SbkQString_Check(pyobj)) {
return QPixmap(Shiboken::Converter<QString& >::toCpp(pyobj)); return QPixmap(Shiboken::Converter<QString& >::toCpp(pyobj));
} else if (shiboType->ext_isconvertible && shiboType->ext_tocpp && shiboType->ext_isconvertible(pyobj)) {
QPixmap* cptr = reinterpret_cast<QPixmap*>(shiboType->ext_tocpp(pyobj));
std::auto_ptr<QPixmap> cptr_auto_ptr(cptr);
return *cptr;
} }
return *Converter<QPixmap*>::toCpp(pyobj); return *Converter<QPixmap*>::toCpp(pyobj);

View file

@ -525,6 +525,8 @@
</value-type> </value-type>
<value-type name="QKeySequence"> <value-type name="QKeySequence">
<modify-function signature="operator=(QKeySequence)" remove="all"/> <modify-function signature="operator=(QKeySequence)" remove="all"/>
<!-- TODO: QVariant operator temporarily removed due to compilation problems. -->
<modify-function signature="operator QVariant()const" remove="all"/>
<modify-function signature="operator int()const" remove="all"/> <modify-function signature="operator int()const" remove="all"/>
<modify-function signature="operator[](uint)const" remove="all"/> <modify-function signature="operator[](uint)const" remove="all"/>
</value-type> </value-type>

View file

@ -1,7 +1,7 @@
file(GLOB TEST_FILES */*_test.py) file(GLOB TEST_FILES */*_test.py)
set(test_blacklist "qtgui_qstring_qkeysequence") set(test_blacklist "")
foreach(test_file ${TEST_FILES}) foreach(test_file ${TEST_FILES})
string(REGEX MATCH "/([^/]+)//?([^/]+)_test.py" test_name ${test_file} ) string(REGEX MATCH "/([^/]+)//?([^/]+)_test.py" test_name ${test_file} )