00001
00002 #include "qgssinglesymbolrendererv2.h"
00003
00004 #include "qgssymbolv2.h"
00005 #include "qgssymbollayerv2utils.h"
00006
00007 #include "qgslogger.h"
00008 #include "qgsfeature.h"
00009 #include "qgsvectorlayer.h"
00010
00011 #include <QDomDocument>
00012 #include <QDomElement>
00013
00014 QgsSingleSymbolRendererV2::QgsSingleSymbolRendererV2( QgsSymbolV2* symbol )
00015 : QgsFeatureRendererV2( "singleSymbol" )
00016 , mTempSymbol( NULL )
00017 {
00018 Q_ASSERT( symbol );
00019 mSymbol = symbol;
00020 }
00021
00022 QgsSingleSymbolRendererV2::~QgsSingleSymbolRendererV2()
00023 {
00024 delete mSymbol;
00025 }
00026
00027 QgsSymbolV2* QgsSingleSymbolRendererV2::symbolForFeature( QgsFeature& feature )
00028 {
00029 if ( mRotationFieldIdx == -1 && mSizeScaleFieldIdx == -1 )
00030 return mSymbol;
00031
00032 double rotation = 0;
00033 double sizeScale = 1;
00034 if ( mRotationFieldIdx != -1 )
00035 {
00036 rotation = feature.attributeMap()[mRotationFieldIdx].toDouble();
00037 }
00038 if ( mSizeScaleFieldIdx != -1 )
00039 {
00040 sizeScale = feature.attributeMap()[mSizeScaleFieldIdx].toDouble();
00041 }
00042
00043 if ( mTempSymbol->type() == QgsSymbolV2::Marker )
00044 {
00045 QgsMarkerSymbolV2* markerSymbol = static_cast<QgsMarkerSymbolV2*>( mTempSymbol );
00046 if ( mRotationFieldIdx != -1 )
00047 markerSymbol->setAngle( rotation );
00048 if ( mSizeScaleFieldIdx != -1 )
00049 markerSymbol->setSize( sizeScale * mOrigSize );
00050 }
00051 else if ( mTempSymbol->type() == QgsSymbolV2::Line )
00052 {
00053 QgsLineSymbolV2* lineSymbol = static_cast<QgsLineSymbolV2*>( mTempSymbol );
00054 if ( mSizeScaleFieldIdx != -1 )
00055 lineSymbol->setWidth( sizeScale * mOrigSize );
00056 }
00057
00058 return mTempSymbol;
00059 }
00060
00061 void QgsSingleSymbolRendererV2::startRender( QgsRenderContext& context, const QgsVectorLayer *vlayer )
00062 {
00063 mRotationFieldIdx = mRotationField.isEmpty() ? -1 : vlayer->fieldNameIndex( mRotationField );
00064 mSizeScaleFieldIdx = mSizeScaleField.isEmpty() ? -1 : vlayer->fieldNameIndex( mSizeScaleField );
00065
00066 mSymbol->startRender( context );
00067
00068 if ( mRotationFieldIdx != -1 || mSizeScaleFieldIdx != -1 )
00069 {
00070
00071 mTempSymbol = mSymbol->clone();
00072
00073 int hints = 0;
00074 if ( mRotationFieldIdx != -1 ) hints |= QgsSymbolV2::DataDefinedRotation;
00075 if ( mSizeScaleFieldIdx != -1 ) hints |= QgsSymbolV2::DataDefinedSizeScale;
00076 mTempSymbol->setRenderHints( hints );
00077
00078 mTempSymbol->startRender( context );
00079
00080 if ( mSymbol->type() == QgsSymbolV2::Marker )
00081 {
00082 mOrigSize = static_cast<QgsMarkerSymbolV2*>( mSymbol )->size();
00083 }
00084 else if ( mSymbol->type() == QgsSymbolV2::Line )
00085 {
00086 mOrigSize = static_cast<QgsLineSymbolV2*>( mSymbol )->width();
00087 }
00088 else
00089 {
00090 mOrigSize = 0;
00091 }
00092 }
00093 }
00094
00095 void QgsSingleSymbolRendererV2::stopRender( QgsRenderContext& context )
00096 {
00097 mSymbol->stopRender( context );
00098
00099 if ( mRotationFieldIdx != -1 || mSizeScaleFieldIdx != -1 )
00100 {
00101
00102 mTempSymbol->stopRender( context );
00103 delete mTempSymbol;
00104 mTempSymbol = NULL;
00105 }
00106 }
00107
00108 QList<QString> QgsSingleSymbolRendererV2::usedAttributes()
00109 {
00110 QList<QString> lst;
00111 if ( !mRotationField.isEmpty() )
00112 lst.append( mRotationField );
00113 if ( !mSizeScaleField.isEmpty() )
00114 lst.append( mSizeScaleField );
00115 return lst;
00116 }
00117
00118 QgsSymbolV2* QgsSingleSymbolRendererV2::symbol() const
00119 {
00120 return mSymbol;
00121 }
00122
00123 void QgsSingleSymbolRendererV2::setSymbol( QgsSymbolV2* s )
00124 {
00125 Q_ASSERT( s );
00126 delete mSymbol;
00127 mSymbol = s;
00128 }
00129
00130 QString QgsSingleSymbolRendererV2::dump()
00131 {
00132 return QString( "SINGLE: %1" ).arg( mSymbol->dump() );
00133 }
00134
00135 QgsFeatureRendererV2* QgsSingleSymbolRendererV2::clone()
00136 {
00137 QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( mSymbol->clone() );
00138 r->setUsingSymbolLevels( usingSymbolLevels() );
00139 r->setRotationField( rotationField() );
00140 r->setSizeScaleField( sizeScaleField() );
00141 return r;
00142 }
00143
00144 QgsSymbolV2List QgsSingleSymbolRendererV2::symbols()
00145 {
00146 QgsSymbolV2List lst;
00147 lst.append( mSymbol );
00148 return lst;
00149 }
00150
00151 QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create( QDomElement& element )
00152 {
00153 QDomElement symbolsElem = element.firstChildElement( "symbols" );
00154 if ( symbolsElem.isNull() )
00155 return NULL;
00156
00157 QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem );
00158
00159 if ( !symbolMap.contains( "0" ) )
00160 return NULL;
00161
00162 QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( symbolMap.take( "0" ) );
00163
00164
00165 QgsSymbolLayerV2Utils::clearSymbolMap( symbolMap );
00166
00167 QDomElement rotationElem = element.firstChildElement( "rotation" );
00168 if ( !rotationElem.isNull() )
00169 r->setRotationField( rotationElem.attribute( "field" ) );
00170
00171 QDomElement sizeScaleElem = element.firstChildElement( "sizescale" );
00172 if ( !sizeScaleElem.isNull() )
00173 r->setSizeScaleField( sizeScaleElem.attribute( "field" ) );
00174
00175
00176 return r;
00177 }
00178
00179 QDomElement QgsSingleSymbolRendererV2::save( QDomDocument& doc )
00180 {
00181 QDomElement rendererElem = doc.createElement( RENDERER_TAG_NAME );
00182 rendererElem.setAttribute( "type", "singleSymbol" );
00183 rendererElem.setAttribute( "symbollevels", ( mUsingSymbolLevels ? "1" : "0" ) );
00184
00185 QgsSymbolV2Map symbols;
00186 symbols["0"] = mSymbol;
00187 QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( symbols, "symbols", doc );
00188 rendererElem.appendChild( symbolsElem );
00189
00190 QDomElement rotationElem = doc.createElement( "rotation" );
00191 rotationElem.setAttribute( "field", mRotationField );
00192 rendererElem.appendChild( rotationElem );
00193
00194 QDomElement sizeScaleElem = doc.createElement( "sizescale" );
00195 sizeScaleElem.setAttribute( "field", mSizeScaleField );
00196 rendererElem.appendChild( sizeScaleElem );
00197
00198 return rendererElem;
00199 }
00200
00201 QgsLegendSymbologyList QgsSingleSymbolRendererV2::legendSymbologyItems( QSize iconSize )
00202 {
00203 QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( mSymbol, iconSize );
00204
00205 QgsLegendSymbologyList lst;
00206 lst << qMakePair( QString(), pix );
00207 return lst;
00208 }
00209
00210 QgsLegendSymbolList QgsSingleSymbolRendererV2::legendSymbolItems()
00211 {
00212 QgsLegendSymbolList lst;
00213 lst << qMakePair( QString(), mSymbol );
00214 return lst;
00215 }