QGIS API Documentation  master-6227475
src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
Go to the documentation of this file.
00001 /***************************************************************************
00002     qgscategorizedsymbolrendererv2.cpp
00003     ---------------------
00004     begin                : November 2009
00005     copyright            : (C) 2009 by Martin Dobias
00006     email                : wonder dot sk at gmail dot com
00007  ***************************************************************************
00008  *                                                                         *
00009  *   This program is free software; you can redistribute it and/or modify  *
00010  *   it under the terms of the GNU General Public License as published by  *
00011  *   the Free Software Foundation; either version 2 of the License, or     *
00012  *   (at your option) any later version.                                   *
00013  *                                                                         *
00014  ***************************************************************************/
00015 #include <algorithm>
00016 
00017 #include "qgscategorizedsymbolrendererv2.h"
00018 
00019 #include "qgssymbolv2.h"
00020 #include "qgssymbollayerv2utils.h"
00021 #include "qgsvectorcolorrampv2.h"
00022 
00023 #include "qgsfeature.h"
00024 #include "qgsvectorlayer.h"
00025 #include "qgslogger.h"
00026 
00027 #include <QDomDocument>
00028 #include <QDomElement>
00029 #include <QSettings> // for legend
00030 
00031 QgsRendererCategoryV2::QgsRendererCategoryV2()
00032     : mValue(), mSymbol( 0 ), mLabel()
00033 {
00034 }
00035 
00036 QgsRendererCategoryV2::QgsRendererCategoryV2( QVariant value, QgsSymbolV2* symbol, QString label )
00037     : mValue( value ), mSymbol( symbol ), mLabel( label )
00038 {
00039 }
00040 
00041 QgsRendererCategoryV2::QgsRendererCategoryV2( const QgsRendererCategoryV2& cat )
00042     : mValue( cat.mValue ), mSymbol( 0 ), mLabel( cat.mLabel )
00043 {
00044   if ( cat.mSymbol )
00045   {
00046     mSymbol = cat.mSymbol->clone();
00047   }
00048 }
00049 
00050 QgsRendererCategoryV2::~QgsRendererCategoryV2()
00051 {
00052   if ( mSymbol ) delete mSymbol;
00053 }
00054 
00055 QgsRendererCategoryV2& QgsRendererCategoryV2::operator=( const QgsRendererCategoryV2 & cat )
00056 {
00057   mValue = cat.mValue;
00058   mLabel = cat.mLabel;
00059   mSymbol = 0;
00060   if ( cat.mSymbol )
00061   {
00062     mSymbol = cat.mSymbol->clone();
00063   }
00064   return *this;
00065 }
00066 
00067 QVariant QgsRendererCategoryV2::value() const
00068 {
00069   return mValue;
00070 }
00071 
00072 QgsSymbolV2* QgsRendererCategoryV2::symbol() const
00073 {
00074   return mSymbol;
00075 }
00076 
00077 QString QgsRendererCategoryV2::label() const
00078 {
00079   return mLabel;
00080 }
00081 
00082 void QgsRendererCategoryV2::setValue( const QVariant &value )
00083 {
00084   mValue = value;
00085 }
00086 
00087 void QgsRendererCategoryV2::setSymbol( QgsSymbolV2* s )
00088 {
00089   if ( mSymbol == s )
00090     return;
00091   delete mSymbol;
00092   mSymbol = s;
00093 }
00094 
00095 void QgsRendererCategoryV2::setLabel( const QString &label )
00096 {
00097   mLabel = label;
00098 }
00099 
00100 QString QgsRendererCategoryV2::dump()
00101 {
00102   return QString( "%1::%2::%3\n" ).arg( mValue.toString() ).arg( mLabel ).arg( mSymbol->dump() );
00103 }
00104 
00105 void QgsRendererCategoryV2::toSld( QDomDocument &doc, QDomElement &element, QgsStringMap props ) const
00106 {
00107   if ( !mSymbol || props.value( "attribute", "" ).isEmpty() )
00108     return;
00109 
00110   QString attrName = props[ "attribute" ];
00111 
00112   QDomElement ruleElem = doc.createElement( "se:Rule" );
00113   element.appendChild( ruleElem );
00114 
00115   QDomElement nameElem = doc.createElement( "se:Name" );
00116   nameElem.appendChild( doc.createTextNode( mLabel ) );
00117   ruleElem.appendChild( nameElem );
00118 
00119   QDomElement descrElem = doc.createElement( "se:Description" );
00120   QDomElement titleElem = doc.createElement( "se:Title" );
00121   QString descrStr = QString( "%1 is '%2'" ).arg( attrName ).arg( mValue.toString() );
00122   titleElem.appendChild( doc.createTextNode( !mLabel.isEmpty() ? mLabel : descrStr ) );
00123   descrElem.appendChild( titleElem );
00124   ruleElem.appendChild( descrElem );
00125 
00126   // create the ogc:Filter for the range
00127   QDomElement filterElem = doc.createElement( "ogc:Filter" );
00128   QString filterFunc = QString( "%1 = '%2'" )
00129                        .arg( attrName.replace( "\"", "\"\"" ) )
00130                        .arg( mValue.toString().replace( "'", "''" ) );
00131   QgsSymbolLayerV2Utils::createFunctionElement( doc, filterElem, filterFunc );
00132   ruleElem.appendChild( filterElem );
00133 
00134   mSymbol->toSld( doc, ruleElem, props );
00135 }
00136 
00138 
00139 QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2( QString attrName, QgsCategoryList categories )
00140     : QgsFeatureRendererV2( "categorizedSymbol" ),
00141     mAttrName( attrName ),
00142     mCategories( categories ),
00143     mSourceSymbol( NULL ),
00144     mSourceColorRamp( NULL ),
00145     mScaleMethod( DEFAULT_SCALE_METHOD ),
00146     mRotationFieldIdx( -1 ),
00147     mSizeScaleFieldIdx( -1 )
00148 {
00149   for ( int i = 0; i < mCategories.count(); ++i )
00150   {
00151     QgsRendererCategoryV2& cat = mCategories[i];
00152     if ( cat.symbol() == NULL )
00153     {
00154       QgsDebugMsg( "invalid symbol in a category! ignoring..." );
00155       mCategories.removeAt( i-- );
00156     }
00157     //mCategories.insert(cat.value().toString(), cat);
00158   }
00159 }
00160 
00161 QgsCategorizedSymbolRendererV2::~QgsCategorizedSymbolRendererV2()
00162 {
00163   mCategories.clear(); // this should also call destructors of symbols
00164   delete mSourceSymbol;
00165   delete mSourceColorRamp;
00166 }
00167 
00168 void QgsCategorizedSymbolRendererV2::rebuildHash()
00169 {
00170   mSymbolHash.clear();
00171 
00172   for ( int i = 0; i < mCategories.count(); ++i )
00173   {
00174     QgsRendererCategoryV2& cat = mCategories[i];
00175     mSymbolHash.insert( cat.value().toString(), cat.symbol() );
00176   }
00177 }
00178 
00179 QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue( QVariant value )
00180 {
00181   // TODO: special case for int, double
00182   QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find( value.toString() );
00183   if ( it == mSymbolHash.end() )
00184   {
00185     if ( mSymbolHash.count() == 0 )
00186     {
00187       QgsDebugMsg( "there are no hashed symbols!!!" );
00188     }
00189     else
00190     {
00191       QgsDebugMsg( "attribute value not found: " + value.toString() );
00192     }
00193     return NULL;
00194   }
00195 
00196   return *it;
00197 }
00198 
00199 QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& feature )
00200 {
00201   const QgsAttributes& attrs = feature.attributes();
00202   if ( mAttrNum < 0 || mAttrNum >= attrs.count() )
00203   {
00204     QgsDebugMsg( "attribute '" + mAttrName + "' (index " + QString::number( mAttrNum ) + ") required by renderer not found" );
00205     return NULL;
00206   }
00207 
00208   // find the right symbol for the category
00209   QgsSymbolV2* symbol = symbolForValue( attrs[mAttrNum] );
00210   if ( symbol == NULL )
00211   {
00212     // if no symbol found use default one
00213     return symbolForValue( QVariant( "" ) );
00214   }
00215 
00216   if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 )
00217     return symbol; // no data-defined rotation/scaling - just return the symbol
00218 
00219   // find out rotation, size scale
00220   double rotation = 0;
00221   double sizeScale = 1;
00222   if ( mRotationFieldIdx != -1 )
00223     rotation = attrs[mRotationFieldIdx].toDouble();
00224   if ( mSizeScaleFieldIdx != -1 )
00225     sizeScale = attrs[mSizeScaleFieldIdx].toDouble();
00226 
00227   // take a temporary symbol (or create it if doesn't exist)
00228   QgsSymbolV2* tempSymbol = mTempSymbols[attrs[mAttrNum].toString()];
00229 
00230   // modify the temporary symbol and return it
00231   if ( tempSymbol->type() == QgsSymbolV2::Marker )
00232   {
00233     QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( tempSymbol );
00234     if ( mRotationFieldIdx != -1 )
00235       markerSymbol->setAngle( rotation );
00236     if ( mSizeScaleFieldIdx != -1 )
00237       markerSymbol->setSize( sizeScale * static_cast<QgsMarkerSymbolV2*>( symbol )->size() );
00238     markerSymbol->setScaleMethod( mScaleMethod );
00239   }
00240   else if ( tempSymbol->type() == QgsSymbolV2::Line )
00241   {
00242     QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( tempSymbol );
00243     if ( mSizeScaleFieldIdx != -1 )
00244       lineSymbol->setWidth( sizeScale * static_cast<QgsLineSymbolV2*>( symbol )->width() );
00245   }
00246 
00247   return tempSymbol;
00248 }
00249 
00250 int QgsCategorizedSymbolRendererV2::categoryIndexForValue( QVariant val )
00251 {
00252   for ( int i = 0; i < mCategories.count(); i++ )
00253   {
00254     if ( mCategories[i].value() == val )
00255       return i;
00256   }
00257   return -1;
00258 }
00259 
00260 bool QgsCategorizedSymbolRendererV2::updateCategoryValue( int catIndex, const QVariant &value )
00261 {
00262   if ( catIndex < 0 || catIndex >= mCategories.size() )
00263     return false;
00264   mCategories[catIndex].setValue( value );
00265   return true;
00266 }
00267 
00268 bool QgsCategorizedSymbolRendererV2::updateCategorySymbol( int catIndex, QgsSymbolV2* symbol )
00269 {
00270   if ( catIndex < 0 || catIndex >= mCategories.size() )
00271     return false;
00272   mCategories[catIndex].setSymbol( symbol );
00273   return true;
00274 }
00275 
00276 bool QgsCategorizedSymbolRendererV2::updateCategoryLabel( int catIndex, QString label )
00277 {
00278   if ( catIndex < 0 || catIndex >= mCategories.size() )
00279     return false;
00280   mCategories[catIndex].setLabel( label );
00281   return true;
00282 }
00283 
00284 void QgsCategorizedSymbolRendererV2::addCategory( const QgsRendererCategoryV2 &cat )
00285 {
00286   if ( cat.symbol() == NULL )
00287   {
00288     QgsDebugMsg( "invalid symbol in a category! ignoring..." );
00289   }
00290   else
00291   {
00292     mCategories.append( cat );
00293   }
00294 }
00295 
00296 bool QgsCategorizedSymbolRendererV2::deleteCategory( int catIndex )
00297 {
00298   if ( catIndex < 0 || catIndex >= mCategories.size() )
00299     return false;
00300 
00301   mCategories.removeAt( catIndex );
00302   return true;
00303 }
00304 
00305 void QgsCategorizedSymbolRendererV2::deleteAllCategories()
00306 {
00307   mCategories.clear();
00308 }
00309 
00310 void QgsCategorizedSymbolRendererV2::moveCategory( int from, int to )
00311 {
00312   if ( from < 0 || from >= mCategories.size() || to < 0 || to >= mCategories.size() ) return;
00313   mCategories.move( from, to );
00314 }
00315 
00316 bool valueLessThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 )
00317 {
00318   return qgsVariantLessThan( c1.value(), c2.value() );
00319 }
00320 bool valueGreaterThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 )
00321 {
00322   return qgsVariantGreaterThan( c1.value(), c2.value() );
00323 }
00324 
00325 void QgsCategorizedSymbolRendererV2::sortByValue( Qt::SortOrder order )
00326 {
00327   if ( order == Qt::AscendingOrder )
00328   {
00329     qSort( mCategories.begin(), mCategories.end(), valueLessThan );
00330   }
00331   else
00332   {
00333     qSort( mCategories.begin(), mCategories.end(), valueGreaterThan );
00334   }
00335 }
00336 
00337 bool labelLessThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 )
00338 {
00339   return QString::localeAwareCompare( c1.label(), c2.label() ) < 0;
00340 }
00341 
00342 bool labelGreaterThan( const QgsRendererCategoryV2 &c1, const QgsRendererCategoryV2 &c2 )
00343 {
00344   return !labelLessThan( c1, c2 );
00345 }
00346 
00347 void QgsCategorizedSymbolRendererV2::sortByLabel( Qt::SortOrder order )
00348 {
00349   if ( order == Qt::AscendingOrder )
00350   {
00351     qSort( mCategories.begin(), mCategories.end(), labelLessThan );
00352   }
00353   else
00354   {
00355     qSort( mCategories.begin(), mCategories.end(), labelGreaterThan );
00356   }
00357 }
00358 
00359 void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer )
00360 {
00361   // make sure that the hash table is up to date
00362   rebuildHash();
00363 
00364   // find out classification attribute index from name
00365   mAttrNum = vlayer ? vlayer->fieldNameIndex( mAttrName ) : -1;
00366 
00367   mRotationFieldIdx  = ( mRotationField.isEmpty()  ? -1 : vlayer->fieldNameIndex( mRotationField ) );
00368   mSizeScaleFieldIdx = ( mSizeScaleField.isEmpty() ? -1 : vlayer->fieldNameIndex( mSizeScaleField ) );
00369 
00370   QgsCategoryList::iterator it = mCategories.begin();
00371   for ( ; it != mCategories.end(); ++it )
00372   {
00373     it->symbol()->startRender( context, vlayer );
00374 
00375     if ( mRotationFieldIdx != -1 || mSizeScaleFieldIdx != -1 )
00376     {
00377       QgsSymbolV2* tempSymbol = it->symbol()->clone();
00378       tempSymbol->setRenderHints(( mRotationFieldIdx != -1 ? QgsSymbolV2::DataDefinedRotation : 0 ) |
00379                                  ( mSizeScaleFieldIdx != -1 ? QgsSymbolV2::DataDefinedSizeScale : 0 ) );
00380       tempSymbol->startRender( context, vlayer );
00381       mTempSymbols[ it->value().toString()] = tempSymbol;
00382     }
00383   }
00384 
00385 }
00386 
00387 void QgsCategorizedSymbolRendererV2::stopRender( QgsRenderContext& context )
00388 {
00389   QgsCategoryList::iterator it = mCategories.begin();
00390   for ( ; it != mCategories.end(); ++it )
00391     it->symbol()->stopRender( context );
00392 
00393   // cleanup mTempSymbols
00394   QHash<QString, QgsSymbolV2*>::iterator it2 = mTempSymbols.begin();
00395   for ( ; it2 != mTempSymbols.end(); ++it2 )
00396   {
00397     it2.value()->stopRender( context );
00398     delete it2.value();
00399   }
00400   mTempSymbols.clear();
00401 }
00402 
00403 QList<QString> QgsCategorizedSymbolRendererV2::usedAttributes()
00404 {
00405   QSet<QString> attributes;
00406   attributes.insert( mAttrName );
00407   if ( !mRotationField.isEmpty() )
00408   {
00409     attributes.insert( mRotationField );
00410   }
00411   if ( !mSizeScaleField.isEmpty() )
00412   {
00413     attributes.insert( mSizeScaleField );
00414   }
00415 
00416   QgsCategoryList::const_iterator catIt = mCategories.constBegin();
00417   for ( ; catIt != mCategories.constEnd(); ++catIt )
00418   {
00419     QgsSymbolV2* catSymbol = catIt->symbol();
00420     if ( catSymbol )
00421     {
00422       attributes.unite( catSymbol->usedAttributes() );
00423     }
00424   }
00425   return attributes.toList();
00426 }
00427 
00428 QString QgsCategorizedSymbolRendererV2::dump()
00429 {
00430   QString s = QString( "CATEGORIZED: idx %1\n" ).arg( mAttrName );
00431   for ( int i = 0; i < mCategories.count(); i++ )
00432     s += mCategories[i].dump();
00433   return s;
00434 }
00435 
00436 QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
00437 {
00438   QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
00439   if ( mSourceSymbol )
00440     r->setSourceSymbol( mSourceSymbol->clone() );
00441   if ( mSourceColorRamp )
00442     r->setSourceColorRamp( mSourceColorRamp->clone() );
00443   r->setUsingSymbolLevels( usingSymbolLevels() );
00444   r->setRotationField( rotationField() );
00445   r->setSizeScaleField( sizeScaleField() );
00446   r->setScaleMethod( scaleMethod() );
00447   return r;
00448 }
00449 
00450 void QgsCategorizedSymbolRendererV2::toSld( QDomDocument &doc, QDomElement &element ) const
00451 {
00452   QgsStringMap props;
00453   props[ "attribute" ] = mAttrName;
00454   if ( !mRotationField.isEmpty() )
00455     props[ "angle" ] = QString( mRotationField ).append( "\"" ).prepend( "\"" );
00456   if ( !mSizeScaleField.isEmpty() )
00457     props[ "scale" ] = QString( mSizeScaleField ).append( "\"" ).prepend( "\"" );
00458 
00459   // create a Rule for each range
00460   for ( QgsCategoryList::const_iterator it = mCategories.constBegin(); it != mCategories.constEnd(); it++ )
00461   {
00462     QgsStringMap catProps( props );
00463     it->toSld( doc, element, catProps );
00464   }
00465 }
00466 
00467 QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols()
00468 {
00469   QgsSymbolV2List lst;
00470   for ( int i = 0; i < mCategories.count(); i++ )
00471     lst.append( mCategories[i].symbol() );
00472   return lst;
00473 }
00474 
00475 QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create( QDomElement& element )
00476 {
00477   QDomElement symbolsElem = element.firstChildElement( "symbols" );
00478   if ( symbolsElem.isNull() )
00479     return NULL;
00480 
00481   QDomElement catsElem = element.firstChildElement( "categories" );
00482   if ( catsElem.isNull() )
00483     return NULL;
00484 
00485   QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem );
00486   QgsCategoryList cats;
00487 
00488   QDomElement catElem = catsElem.firstChildElement();
00489   while ( !catElem.isNull() )
00490   {
00491     if ( catElem.tagName() == "category" )
00492     {
00493       QVariant value = QVariant( catElem.attribute( "value" ) );
00494       QString symbolName = catElem.attribute( "symbol" );
00495       QString label = catElem.attribute( "label" );
00496       if ( symbolMap.contains( symbolName ) )
00497       {
00498         QgsSymbolV2* symbol = symbolMap.take( symbolName );
00499         cats.append( QgsRendererCategoryV2( value, symbol, label ) );
00500       }
00501     }
00502     catElem = catElem.nextSiblingElement();
00503   }
00504 
00505   QString attrName = element.attribute( "attr" );
00506 
00507   QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( attrName, cats );
00508 
00509   // delete symbols if there are any more
00510   QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap );
00511 
00512   // try to load source symbol (optional)
00513   QDomElement sourceSymbolElem = element.firstChildElement( "source-symbol" );
00514   if ( !sourceSymbolElem.isNull() )
00515   {
00516     QgsSymbolV2Map sourceSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( sourceSymbolElem );
00517     if ( sourceSymbolMap.contains( "0" ) )
00518     {
00519       r->setSourceSymbol( sourceSymbolMap.take( "0" ) );
00520     }
00521     QgsSymbolLayerV2Utils::clearSymbolMap( sourceSymbolMap );
00522   }
00523 
00524   // try to load color ramp (optional)
00525   QDomElement sourceColorRampElem = element.firstChildElement( "colorramp" );
00526   if ( !sourceColorRampElem.isNull() && sourceColorRampElem.attribute( "name" ) == "[source]" )
00527   {
00528     r->setSourceColorRamp( QgsSymbolLayerV2Utils::loadColorRamp( sourceColorRampElem ) );
00529   }
00530 
00531   QDomElement rotationElem = element.firstChildElement( "rotation" );
00532   if ( !rotationElem.isNull() )
00533     r->setRotationField( rotationElem.attribute( "field" ) );
00534 
00535   QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
00536   if ( !sizeScaleElem.isNull() )
00537   {
00538     r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
00539     r->setScaleMethod( QgsSymbolLayerV2Utils::decodeScaleMethod( sizeScaleElem.attribute( "scalemethod" ) ) );
00540   }
00541 
00542   // TODO: symbol levels
00543   return r;
00544 }
00545 
00546 QDomElement QgsCategorizedSymbolRendererV2::save( QDomDocument& doc )
00547 {
00548   QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
00549   rendererElem.setAttribute( "type", "categorizedSymbol" );
00550   rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
00551   rendererElem.setAttribute( "attr", mAttrName );
00552 
00553   // categories
00554   int i = 0;
00555   QgsSymbolV2Map symbols;
00556   QDomElement catsElem = doc.createElement( "categories" );
00557   QgsCategoryList::const_iterator it = mCategories.constBegin();
00558   for ( ; it != mCategories.end(); it++ )
00559   {
00560     const QgsRendererCategoryV2& cat = *it;
00561     QString symbolName = QString::number( i );
00562     symbols.insert( symbolName, cat.symbol() );
00563 
00564     QDomElement catElem = doc.createElement( "category" );
00565     catElem.setAttribute( "value", cat.value().toString() );
00566     catElem.setAttribute( "symbol", symbolName );
00567     catElem.setAttribute( "label", cat.label() );
00568     catsElem.appendChild( catElem );
00569     i++;
00570   }
00571 
00572   rendererElem.appendChild( catsElem );
00573 
00574   // save symbols
00575   QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( symbols, "symbols", doc );
00576   rendererElem.appendChild( symbolsElem );
00577 
00578   // save source symbol
00579   if ( mSourceSymbol )
00580   {
00581     QgsSymbolV2Map sourceSymbols;
00582     sourceSymbols.insert( "0", mSourceSymbol );
00583     QDomElement sourceSymbolElem = QgsSymbolLayerV2Utils::saveSymbols( sourceSymbols, "source-symbol", doc );
00584     rendererElem.appendChild( sourceSymbolElem );
00585   }
00586 
00587   // save source color ramp
00588   if ( mSourceColorRamp )
00589   {
00590     QDomElement colorRampElem = QgsSymbolLayerV2Utils::saveColorRamp( "[source]", mSourceColorRamp, doc );
00591     rendererElem.appendChild( colorRampElem );
00592   }
00593 
00594   QDomElement rotationElem = doc.createElement( "rotation" );
00595   rotationElem.setAttribute( "field", mRotationField );
00596   rendererElem.appendChild( rotationElem );
00597 
00598   QDomElement sizeScaleElem = doc.createElement( "sizescale" );
00599   sizeScaleElem.setAttribute( "field", mSizeScaleField );
00600   sizeScaleElem.setAttribute( "scalemethod", QgsSymbolLayerV2Utils::encodeScaleMethod( mScaleMethod ) );
00601   rendererElem.appendChild( sizeScaleElem );
00602 
00603   return rendererElem;
00604 }
00605 
00606 QgsLegendSymbologyList QgsCategorizedSymbolRendererV2::legendSymbologyItems( QSize iconSize )
00607 {
00608   QSettings settings;
00609   bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
00610 
00611   QgsLegendSymbologyList lst;
00612   if ( showClassifiers )
00613   {
00614     lst << qMakePair( classAttribute(), QPixmap() );
00615   }
00616 
00617   int count = categories().count();
00618   for ( int i = 0; i < count; i++ )
00619   {
00620     const QgsRendererCategoryV2& cat = categories()[i];
00621     QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( cat.symbol(), iconSize );
00622     lst << qMakePair( cat.label(), pix );
00623   }
00624   return lst;
00625 }
00626 
00627 QgsLegendSymbolList QgsCategorizedSymbolRendererV2::legendSymbolItems()
00628 {
00629   QSettings settings;
00630   bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
00631 
00632   QgsLegendSymbolList lst;
00633   if ( showClassifiers )
00634   {
00635     lst << qMakePair( classAttribute(), ( QgsSymbolV2* )0 );
00636   }
00637 
00638   foreach ( const QgsRendererCategoryV2& cat, mCategories )
00639   {
00640     lst << qMakePair( cat.label(), cat.symbol() );
00641   }
00642   return lst;
00643 }
00644 
00645 
00646 QgsSymbolV2* QgsCategorizedSymbolRendererV2::sourceSymbol()
00647 {
00648   return mSourceSymbol;
00649 }
00650 void QgsCategorizedSymbolRendererV2::setSourceSymbol( QgsSymbolV2* sym )
00651 {
00652   delete mSourceSymbol;
00653   mSourceSymbol = sym;
00654 }
00655 
00656 QgsVectorColorRampV2* QgsCategorizedSymbolRendererV2::sourceColorRamp()
00657 {
00658   return mSourceColorRamp;
00659 }
00660 void QgsCategorizedSymbolRendererV2::setSourceColorRamp( QgsVectorColorRampV2* ramp )
00661 {
00662   delete mSourceColorRamp;
00663   mSourceColorRamp = ramp;
00664 }
00665 
00666 void QgsCategorizedSymbolRendererV2::updateSymbols( QgsSymbolV2 * sym )
00667 {
00668   int i = 0;
00669   foreach ( QgsRendererCategoryV2 cat, mCategories )
00670   {
00671     QgsSymbolV2* symbol = sym->clone();
00672     symbol->setColor( cat.symbol()->color() );
00673     updateCategorySymbol( i, symbol );
00674     ++i;
00675   }
00676 }
00677 
00678 void QgsCategorizedSymbolRendererV2::setScaleMethod( QgsSymbolV2::ScaleMethod scaleMethod )
00679 {
00680   mScaleMethod = scaleMethod;
00681   QgsCategoryList::const_iterator catIt = mCategories.constBegin();
00682   for ( ; catIt != mCategories.constEnd(); ++catIt )
00683   {
00684     setScaleMethodToSymbol( catIt->symbol(), scaleMethod );
00685   }
00686 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines