New GlobalStorage map. With Python API support.

This commit is contained in:
Teo Mrnjavac 2014-07-21 17:08:06 +02:00
parent 4c88603872
commit 0753e6ccde
8 changed files with 295 additions and 7 deletions

View file

@ -37,13 +37,13 @@ variantToPyObject( const QVariant& variant )
{
switch ( variant.type() )
{
case QVariant::Map:
return variantMapToPyDict( variant.toMap() );
case QVariant::List:
case QVariant::StringList:
return variantListToPyList( variant.toList() );
case QVariant::Map:
return variantMapToPyDict( variant.toMap() );
case QVariant::Int:
return bp::object( variant.toInt() );
@ -51,7 +51,6 @@ variantToPyObject( const QVariant& variant )
return bp::object( variant.toDouble() );
case QVariant::String:
case QVariant::Char:
return bp::object( variant.toString().toStdString() );
default:
@ -60,6 +59,30 @@ variantToPyObject( const QVariant& variant )
}
QVariant
variantFromPyObject( const boost::python::object& pyObject )
{
std::string pyType = bp::extract< std::string >( pyObject.attr( "__class__" ).attr( "__name__" ) );
if ( pyType == "dict" )
return variantMapFromPyDict( bp::extract< bp::dict >( pyObject ) );
else if ( pyType == "list" )
return variantListFromPyList( bp::extract< bp::list >( pyObject ) );
else if ( pyType == "int" )
return QVariant( bp::extract< int >( pyObject ) );
else if ( pyType == "float" )
return QVariant( bp::extract< double >( pyObject ) );
else if ( pyType == "str" )
return QVariant( QString::fromStdString( bp::extract< std::string >( pyObject ) ) );
else
return QVariant();
}
boost::python::list
variantListToPyList( const QVariantList& variantList )
{
@ -72,6 +95,18 @@ variantListToPyList( const QVariantList& variantList )
}
QVariantList
variantListFromPyList( const boost::python::list& pyList )
{
QVariantList list;
for ( int i = 0; i < bp::len( pyList ); ++i )
{
list.append( variantFromPyObject( pyList[ i ] ) );
}
return list;
}
boost::python::dict
variantMapToPyDict( const QVariantMap& variantMap )
{
@ -84,6 +119,30 @@ variantMapToPyDict( const QVariantMap& variantMap )
}
QVariantMap
variantMapFromPyDict( const boost::python::dict& pyDict )
{
QVariantMap map;
bp::list keys = pyDict.keys();
for ( int i = 0; i < bp::len( keys ); ++i )
{
bp::extract< std::string > extracted_key( keys[ i ] );
if ( !extracted_key.check() )
{
cDebug() << "Key invalid, map might be incomplete.";
continue;
}
std::string key = extracted_key;
bp::object obj = pyDict[ key ];
map.insert( QString::fromStdString( key ), variantFromPyObject( obj ) );
}
return map;
}
Helper* Helper::s_instance = nullptr;
Helper::Helper( QObject* parent )