Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsobjectcustomproperties.cpp 3 : : ------------------- 4 : : begin : April 2014 5 : : copyright : (C) 2014 by Martin Dobias 6 : : email : wonder.sk at gmail dot com 7 : : ***************************************************************************/ 8 : : 9 : : /*************************************************************************** 10 : : * * 11 : : * This program is free software; you can redistribute it and/or modify * 12 : : * it under the terms of the GNU General Public License as published by * 13 : : * the Free Software Foundation; either version 2 of the License, or * 14 : : * (at your option) any later version. * 15 : : * * 16 : : ***************************************************************************/ 17 : : 18 : : #include "qgsobjectcustomproperties.h" 19 : : #include "qgis.h" 20 : : 21 : : #include <QDomNode> 22 : : #include <QStringList> 23 : : 24 : : 25 : 0 : QStringList QgsObjectCustomProperties::keys() const 26 : : { 27 : 0 : return mMap.keys(); 28 : : } 29 : : 30 : 0 : void QgsObjectCustomProperties::setValue( const QString &key, const QVariant &value ) 31 : : { 32 : 0 : mMap[key] = value; 33 : 0 : } 34 : : 35 : 400 : QVariant QgsObjectCustomProperties::value( const QString &key, const QVariant &defaultValue ) const 36 : : { 37 : 400 : return mMap.value( key, defaultValue ); 38 : : } 39 : : 40 : 0 : void QgsObjectCustomProperties::remove( const QString &key ) 41 : : { 42 : 0 : mMap.remove( key ); 43 : 0 : } 44 : : 45 : 0 : bool QgsObjectCustomProperties::contains( const QString &key ) const 46 : : { 47 : 0 : return mMap.contains( key ); 48 : : } 49 : : 50 : 0 : void QgsObjectCustomProperties::readXml( const QDomNode &parentNode, const QString &keyStartsWith ) 51 : : { 52 : 0 : QDomNode propsNode = parentNode.namedItem( QStringLiteral( "customproperties" ) ); 53 : 0 : if ( propsNode.isNull() ) // no properties stored... 54 : 0 : return; 55 : : 56 : 0 : if ( !keyStartsWith.isEmpty() ) 57 : : { 58 : : //remove old keys 59 : 0 : QStringList keysToRemove; 60 : 0 : QMap<QString, QVariant>::const_iterator pIt = mMap.constBegin(); 61 : 0 : for ( ; pIt != mMap.constEnd(); ++pIt ) 62 : : { 63 : 0 : if ( pIt.key().startsWith( keyStartsWith ) ) 64 : : { 65 : 0 : keysToRemove.push_back( pIt.key() ); 66 : 0 : } 67 : 0 : } 68 : : 69 : 0 : QStringList::const_iterator sIt = keysToRemove.constBegin(); 70 : 0 : for ( ; sIt != keysToRemove.constEnd(); ++sIt ) 71 : : { 72 : 0 : mMap.remove( *sIt ); 73 : 0 : } 74 : 0 : } 75 : : else 76 : : { 77 : 0 : mMap.clear(); 78 : : } 79 : : 80 : 0 : QDomNodeList nodes = propsNode.childNodes(); 81 : : 82 : 0 : for ( int i = 0; i < nodes.size(); i++ ) 83 : : { 84 : 0 : QDomNode propNode = nodes.at( i ); 85 : 0 : if ( propNode.isNull() || propNode.nodeName() != QLatin1String( "property" ) ) 86 : 0 : continue; 87 : 0 : QDomElement propElement = propNode.toElement(); 88 : : 89 : 0 : QString key = propElement.attribute( QStringLiteral( "key" ) ); 90 : 0 : if ( key.isEmpty() || key.startsWith( keyStartsWith ) ) 91 : : { 92 : 0 : if ( propElement.hasAttribute( QStringLiteral( "value" ) ) ) 93 : : { 94 : 0 : QString value = propElement.attribute( QStringLiteral( "value" ) ); 95 : 0 : mMap[key] = QVariant( value ); 96 : 0 : } 97 : : else 98 : : { 99 : 0 : QStringList list; 100 : : 101 : 0 : for ( QDomElement itemElement = propElement.firstChildElement( QStringLiteral( "value" ) ); 102 : 0 : !itemElement.isNull(); 103 : 0 : itemElement = itemElement.nextSiblingElement( QStringLiteral( "value" ) ) ) 104 : : { 105 : 0 : list << itemElement.text(); 106 : 0 : } 107 : : 108 : 0 : mMap[key] = QVariant( list ); 109 : 0 : } 110 : 0 : } 111 : 0 : } 112 : : 113 : 0 : } 114 : : 115 : 0 : void QgsObjectCustomProperties::writeXml( QDomNode &parentNode, QDomDocument &doc ) const 116 : : { 117 : : //remove already existing <customproperties> tags 118 : 0 : QDomNodeList propertyList = parentNode.toElement().elementsByTagName( QStringLiteral( "customproperties" ) ); 119 : 0 : for ( int i = 0; i < propertyList.size(); ++i ) 120 : : { 121 : 0 : parentNode.removeChild( propertyList.at( i ) ); 122 : 0 : } 123 : : 124 : 0 : QDomElement propsElement = doc.createElement( QStringLiteral( "customproperties" ) ); 125 : : 126 : 0 : auto keys = mMap.keys(); 127 : : 128 : 0 : std::sort( keys.begin(), keys.end() ); 129 : : 130 : 0 : for ( const auto &key : std::as_const( keys ) ) 131 : : { 132 : 0 : QDomElement propElement = doc.createElement( QStringLiteral( "property" ) ); 133 : 0 : propElement.setAttribute( QStringLiteral( "key" ), key ); 134 : 0 : const QVariant value = mMap.value( key ); 135 : 0 : if ( value.canConvert<QString>() ) 136 : : { 137 : 0 : propElement.setAttribute( QStringLiteral( "value" ), value.toString() ); 138 : 0 : } 139 : 0 : else if ( value.canConvert<QStringList>() ) 140 : : { 141 : 0 : const auto constToStringList = value.toStringList(); 142 : 0 : for ( const QString &valueStr : constToStringList ) 143 : : { 144 : 0 : QDomElement itemElement = doc.createElement( QStringLiteral( "value" ) ); 145 : 0 : itemElement.appendChild( doc.createTextNode( valueStr ) ); 146 : 0 : propElement.appendChild( itemElement ); 147 : 0 : } 148 : 0 : } 149 : 0 : propsElement.appendChild( propElement ); 150 : 0 : } 151 : : 152 : 0 : parentNode.appendChild( propsElement ); 153 : 0 : }