Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsxmlutils.h 3 : : --------------------- 4 : : begin : December 2013 5 : : copyright : (C) 2013 by Martin Dobias 6 : : email : wonder dot sk at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : #ifndef QGSXMLUTILS_H 16 : : #define QGSXMLUTILS_H 17 : : 18 : : class QDomDocument; 19 : : 20 : : class QgsRectangle; 21 : : 22 : : #include <QDomElement> 23 : : #include <QMetaEnum> 24 : : 25 : : #include "qgis_core.h" 26 : : #include "qgis_sip.h" 27 : : #include "qgsunittypes.h" 28 : : 29 : : 30 : : 31 : : /** 32 : : * \ingroup core 33 : : * \brief Assorted helper methods for reading and writing chunks of XML 34 : : */ 35 : : class CORE_EXPORT QgsXmlUtils 36 : : { 37 : : public: 38 : : 39 : : /* reading */ 40 : : 41 : : /** 42 : : * Decodes a distance unit from a DOM element. 43 : : * \param element DOM element to decode 44 : : * \returns distance units 45 : : * \see writeMapUnits() 46 : : */ 47 : : static QgsUnitTypes::DistanceUnit readMapUnits( const QDomElement &element ); 48 : : 49 : : static QgsRectangle readRectangle( const QDomElement &element ); 50 : : 51 : : /* writing */ 52 : : 53 : : /** 54 : : * Encodes a distance unit to a DOM element. 55 : : * \param units units to encode 56 : : * \param doc DOM document 57 : : * \returns element containing encoded units 58 : : * \see readMapUnits() 59 : : */ 60 : : static QDomElement writeMapUnits( QgsUnitTypes::DistanceUnit units, QDomDocument &doc ); 61 : : 62 : : /** 63 : : * Encodes a rectangle to a DOM element. 64 : : * \param rect rectangle to encode 65 : : * \param doc DOM document 66 : : * \param elementName name of the DOM element 67 : : * \returns element containing encoded rectangle 68 : : */ 69 : 0 : static QDomElement writeRectangle( const QgsRectangle &rect, QDomDocument &doc, const QString &elementName = QStringLiteral( "extent" ) ); 70 : : 71 : : /** 72 : : * Write a QVariant to a QDomElement. 73 : : * 74 : : * Supported types are 75 : : * 76 : : * - QVariant::Map 77 : : * - QVariant::Int 78 : : * - QVariant::Double 79 : : * - QVariant::String 80 : : * - QgsProperty (since QGIS 3.4) 81 : : * - QgsCoordinateReferenceSystem (since QGIS 3.4) 82 : : */ 83 : : static QDomElement writeVariant( const QVariant &value, QDomDocument &doc ); 84 : : 85 : : /** 86 : : * Read a QVariant from a QDomElement. 87 : : */ 88 : : static QVariant readVariant( const QDomElement &element ); 89 : : 90 : : /** 91 : : * Read a flag value from an attribute of the element. 92 : : * \param element the element to read the attribute from 93 : : * \param attributeName the attribute name 94 : : * \param defaultValue the default value as a flag 95 : : * \note The flag value is a text as returned by \see QMetaEnum::valueToKeys. 96 : : * The flag must have been declared with Q_ENUM macro. 97 : : * \since QGIS 3.4 98 : : */ 99 : 0 : template<class T> static T readFlagAttribute( const QDomElement &element, const QString &attributeName, T defaultValue ) SIP_SKIP 100 : : { 101 : 0 : T value = defaultValue; 102 : : // Get source categories 103 : 0 : QMetaEnum metaEnum = QMetaEnum::fromType<T>(); 104 : 0 : QString sourceCategoriesStr( element.attribute( attributeName, metaEnum.valueToKeys( static_cast<int>( defaultValue ) ) ) ); 105 : 0 : if ( metaEnum.isValid() ) 106 : : { 107 : 0 : bool ok = false; 108 : 0 : int newValue = metaEnum.keysToValue( sourceCategoriesStr.toUtf8().constData(), &ok ); 109 : 0 : if ( ok ) 110 : 0 : value = static_cast<T>( newValue ); 111 : 0 : } 112 : 0 : return value; 113 : 0 : } 114 : : }; 115 : : 116 : : 117 : : #endif // QGSXMLUTILS_H