Skip to content

Commit

Permalink
Make QgsXmlUtils handle storing/retrieving QgsProperty values
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Sep 2, 2018
1 parent d0026d1 commit 3572ea8
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 3 deletions.
1 change: 1 addition & 0 deletions python/core/auto_generated/qgsxmlutils.sip.in
Expand Up @@ -59,6 +59,7 @@ Supported types are
- QVariant.Int
- QVariant.Double
- QVariant.String
- :py:class:`QgsProperty` (since QGIS 3.4)
%End

static QVariant readVariant( const QDomElement &element );
Expand Down
1 change: 1 addition & 0 deletions src/core/qgsapplication.cpp
Expand Up @@ -164,6 +164,7 @@ void QgsApplication::init( QString profileFolder )
qRegisterMetaType<QgsUnitTypes::LayoutUnit>( "QgsUnitTypes::LayoutUnit" );
qRegisterMetaType<QgsFeatureId>( "QgsFeatureId" );
qRegisterMetaType<QgsFeatureIds>( "QgsFeatureIds" );
qRegisterMetaType<QgsProperty>( "QgsProperty" );
qRegisterMetaType<Qgis::MessageLevel>( "Qgis::MessageLevel" );
qRegisterMetaType<QgsReferencedRectangle>( "QgsReferencedRectangle" );
qRegisterMetaType<QgsReferencedPointXY>( "QgsReferencedPointXY" );
Expand Down
26 changes: 25 additions & 1 deletion src/core/qgsxmlutils.cpp
Expand Up @@ -18,7 +18,7 @@

#include "qgslogger.h"
#include "qgsrectangle.h"

#include "qgsproperty.h"

QgsUnitTypes::DistanceUnit QgsXmlUtils::readMapUnits( const QDomElement &element )
{
Expand Down Expand Up @@ -153,6 +153,18 @@ QDomElement QgsXmlUtils::writeVariant( const QVariant &value, QDomDocument &doc
element.setAttribute( QStringLiteral( "value" ), value.toString() );
break;

case QVariant::UserType:
{
if ( value.canConvert< QgsProperty >() )
{
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "QgsProperty" ) );
const QDomElement propertyElem = QgsXmlUtils::writeVariant( value.value< QgsProperty >().toVariant(), doc );
element.appendChild( propertyElem );
break;
}
FALLTHROUGH
}

default:
element.setAttribute( QStringLiteral( "type" ), QStringLiteral( "Unknown" ) );
element.setAttribute( QStringLiteral( "value" ), value.toString() );
Expand Down Expand Up @@ -217,6 +229,18 @@ QVariant QgsXmlUtils::readVariant( const QDomElement &element )
}
return list;
}
else if ( type == QLatin1String( "QgsProperty" ) )
{
const QDomNodeList values = element.childNodes();
if ( values.isEmpty() )
return QVariant();

QgsProperty p;
if ( p.loadVariant( QgsXmlUtils::readVariant( values.at( 0 ).toElement() ) ) )
return p;

return QVariant();
}
else
{
return QVariant();
Expand Down
2 changes: 1 addition & 1 deletion src/core/qgsxmlutils.h
Expand Up @@ -66,7 +66,7 @@ class CORE_EXPORT QgsXmlUtils
* - QVariant::Int
* - QVariant::Double
* - QVariant::String
*
* - QgsProperty (since QGIS 3.4)
*/
static QDomElement writeVariant( const QVariant &value, QDomDocument &doc );

Expand Down
30 changes: 29 additions & 1 deletion tests/src/python/test_qgsxmlutils.py
Expand Up @@ -14,7 +14,8 @@

import qgis # NOQA switch sip api

from qgis.core import QgsXmlUtils
from qgis.core import (QgsXmlUtils,
QgsProperty)

from qgis.PyQt.QtXml import QDomDocument

Expand Down Expand Up @@ -102,6 +103,33 @@ def test_complex(self):

self.assertEqual(my_properties, prop2)

def test_property(self):
"""
Test that QgsProperty values are correctly loaded and written
"""
doc = QDomDocument("properties")

prop = QgsProperty.fromValue(1001)
elem = QgsXmlUtils.writeVariant(prop, doc)

prop2 = QgsXmlUtils.readVariant(elem)

self.assertEqual(prop, prop2)

prop = QgsProperty.fromExpression('1+2=5')
elem = QgsXmlUtils.writeVariant(prop, doc)

prop2 = QgsXmlUtils.readVariant(elem)

self.assertEqual(prop, prop2)

prop = QgsProperty.fromField('oid')
elem = QgsXmlUtils.writeVariant(prop, doc)

prop2 = QgsXmlUtils.readVariant(elem)

self.assertEqual(prop, prop2)


if __name__ == '__main__':
unittest.main()

0 comments on commit 3572ea8

Please sign in to comment.