|
QGIS API Documentation
master-59fd5e0
|
00001 /*************************************************************************** 00002 qgscomposerlegenditem.cpp - description 00003 ------------------------- 00004 begin : May 2010 00005 copyright : (C) 2010 by Marco Hugentobler 00006 email : marco dot hugentobler at sourcepole dot ch 00007 ***************************************************************************/ 00008 00009 /*************************************************************************** 00010 * * 00011 * This program is free software; you can redistribute it and/or modify * 00012 * it under the terms of the GNU General Public License as published by * 00013 * the Free Software Foundation; either version 2 of the License, or * 00014 * (at your option) any later version. * 00015 * * 00016 ***************************************************************************/ 00017 00018 #include "qgscomposerlegendstyle.h" 00019 #include "qgscomposerlegenditem.h" 00020 #include "qgscomposerlegend.h" 00021 #include "qgsmaplayerregistry.h" 00022 #include "qgsrasterlayer.h" 00023 #include "qgsrendererv2.h" 00024 #include "qgssymbolv2.h" 00025 #include "qgssymbollayerv2utils.h" 00026 #include "qgsvectorlayer.h" 00027 #include "qgsapplication.h" 00028 #include <QDomDocument> 00029 #include <QDomElement> 00030 00031 QgsComposerLegendItem::QgsComposerLegendItem( QgsComposerLegendStyle::Style s ): QStandardItem() 00032 , mStyle( s ) 00033 { 00034 } 00035 00036 QgsComposerLegendItem::QgsComposerLegendItem( const QString& text, QgsComposerLegendStyle::Style s ): QStandardItem( text ) 00037 , mStyle( s ) 00038 { 00039 } 00040 00041 QgsComposerLegendItem::QgsComposerLegendItem( const QIcon& icon, const QString& text, QgsComposerLegendStyle::Style s ): QStandardItem( icon, text ) 00042 , mStyle( s ) 00043 { 00044 } 00045 00046 QgsComposerLegendItem::~QgsComposerLegendItem() 00047 { 00048 } 00049 00050 void QgsComposerLegendItem::writeXMLChildren( QDomElement& elem, QDomDocument& doc ) const 00051 { 00052 int numRows = rowCount(); 00053 QgsComposerLegendItem* currentItem = 0; 00054 for ( int i = 0; i < numRows; ++i ) 00055 { 00056 currentItem = dynamic_cast<QgsComposerLegendItem*>( child( i, 0 ) ); 00057 if ( currentItem ) 00058 { 00059 currentItem->writeXML( elem, doc ); 00060 } 00061 } 00062 } 00063 00064 00066 00067 #include "qgssymbolv2.h" 00068 00069 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item(): QgsComposerLegendItem( QgsComposerLegendStyle::Symbol ), mSymbolV2( 0 ) 00070 { 00071 } 00072 00073 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QString& text ): QgsComposerLegendItem( text, QgsComposerLegendStyle::Symbol ), mSymbolV2( 0 ) 00074 { 00075 } 00076 00077 QgsComposerSymbolV2Item::QgsComposerSymbolV2Item( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text, QgsComposerLegendStyle::Symbol ), mSymbolV2( 0 ) 00078 { 00079 } 00080 00081 QgsComposerSymbolV2Item::~QgsComposerSymbolV2Item() 00082 { 00083 delete mSymbolV2; 00084 } 00085 00086 QStandardItem* QgsComposerSymbolV2Item::clone() const 00087 { 00088 QgsComposerSymbolV2Item* cloneItem = new QgsComposerSymbolV2Item(); 00089 *cloneItem = *this; 00090 if ( mSymbolV2 ) 00091 { 00092 cloneItem->setSymbolV2( mSymbolV2->clone() ); 00093 } 00094 return cloneItem; 00095 } 00096 00097 void QgsComposerSymbolV2Item::writeXML( QDomElement& elem, QDomDocument& doc ) const 00098 { 00099 QDomElement vectorClassElem = doc.createElement( "VectorClassificationItemNg" ); 00100 if ( mSymbolV2 ) 00101 { 00102 QgsSymbolV2Map saveSymbolMap; 00103 saveSymbolMap.insert( "classificationSymbol", mSymbolV2 ); 00104 QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( saveSymbolMap, "symbols", doc ); 00105 vectorClassElem.appendChild( symbolsElem ); 00106 } 00107 vectorClassElem.setAttribute( "text", text() ); 00108 vectorClassElem.setAttribute( "userText", userText() ); 00109 elem.appendChild( vectorClassElem ); 00110 } 00111 00112 void QgsComposerSymbolV2Item::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00113 { 00114 if ( itemElem.isNull() ) 00115 { 00116 return; 00117 } 00118 00119 setText( itemElem.attribute( "text", "" ) ); 00120 setUserText( itemElem.attribute( "userText", "" ) ); 00121 QDomElement symbolsElem = itemElem.firstChildElement( "symbols" ); 00122 if ( !symbolsElem.isNull() ) 00123 { 00124 QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolsElem ); 00125 //we assume there is only one symbol in the map... 00126 QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin(); 00127 if ( mapIt != loadSymbolMap.end() ) 00128 { 00129 QgsSymbolV2* symbolNg = mapIt.value(); 00130 if ( symbolNg ) 00131 { 00132 setSymbolV2( symbolNg ); 00133 if ( xServerAvailable ) 00134 { 00135 setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) ); 00136 } 00137 } 00138 } 00139 } 00140 } 00141 00142 void QgsComposerSymbolV2Item::setSymbolV2( QgsSymbolV2* s ) 00143 { 00144 delete mSymbolV2; 00145 mSymbolV2 = s; 00146 } 00147 00149 00150 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem(): QgsComposerLegendItem( QgsComposerLegendStyle::Symbol ) 00151 { 00152 } 00153 00154 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QString& text ): QgsComposerLegendItem( text, QgsComposerLegendStyle::Symbol ) 00155 { 00156 } 00157 00158 QgsComposerRasterSymbolItem::QgsComposerRasterSymbolItem( const QIcon& icon, const QString& text ): QgsComposerLegendItem( icon, text, QgsComposerLegendStyle::Symbol ) 00159 { 00160 } 00161 00162 QgsComposerRasterSymbolItem::~QgsComposerRasterSymbolItem() 00163 { 00164 } 00165 00166 QStandardItem* QgsComposerRasterSymbolItem::clone() const 00167 { 00168 QgsComposerRasterSymbolItem* cloneItem = new QgsComposerRasterSymbolItem(); 00169 *cloneItem = *this; 00170 cloneItem->setLayerID( mLayerID ); 00171 return cloneItem; 00172 } 00173 00174 void QgsComposerRasterSymbolItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00175 { 00176 QDomElement rasterClassElem = doc.createElement( "RasterClassificationItem" ); 00177 rasterClassElem.setAttribute( "layerId", mLayerID ); 00178 rasterClassElem.setAttribute( "text", text() ); 00179 rasterClassElem.setAttribute( "userText", userText() ); 00180 rasterClassElem.setAttribute( "color", mColor.name() ); 00181 elem.appendChild( rasterClassElem ); 00182 } 00183 00184 void QgsComposerRasterSymbolItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00185 { 00186 if ( itemElem.isNull() ) 00187 { 00188 return; 00189 } 00190 setText( itemElem.attribute( "text", "" ) ); 00191 setUserText( itemElem.attribute( "userText", "" ) ); 00192 setLayerID( itemElem.attribute( "layerId", "" ) ); 00193 setColor( QColor( itemElem.attribute( "color" ) ) ); 00194 00195 if ( xServerAvailable ) 00196 { 00197 QPixmap itemPixmap( 20, 20 ); 00198 itemPixmap.fill( mColor ); 00199 setIcon( QIcon( itemPixmap ) ); 00200 } 00201 } 00202 00204 00205 QgsComposerLayerItem::QgsComposerLayerItem(): QgsComposerLegendItem( QgsComposerLegendStyle::Subgroup ) 00206 , mShowFeatureCount( false ) 00207 { 00208 } 00209 00210 QgsComposerLayerItem::QgsComposerLayerItem( const QString& text ): QgsComposerLegendItem( text, QgsComposerLegendStyle::Subgroup ) 00211 , mShowFeatureCount( false ) 00212 { 00213 } 00214 00215 QgsComposerLayerItem::~QgsComposerLayerItem() 00216 { 00217 } 00218 00219 QStandardItem* QgsComposerLayerItem::clone() const 00220 { 00221 QgsComposerLayerItem* cloneItem = new QgsComposerLayerItem(); 00222 *cloneItem = *this; 00223 cloneItem->setLayerID( mLayerID ); 00224 return cloneItem; 00225 } 00226 00227 void QgsComposerLayerItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00228 { 00229 QDomElement layerItemElem = doc.createElement( "LayerItem" ); 00230 layerItemElem.setAttribute( "layerId", mLayerID ); 00231 layerItemElem.setAttribute( "text", text() ); 00232 layerItemElem.setAttribute( "userText", userText() ); 00233 layerItemElem.setAttribute( "showFeatureCount", showFeatureCount() ); 00234 layerItemElem.setAttribute( "style", QgsComposerLegendStyle::styleName( mStyle ) ); 00235 writeXMLChildren( layerItemElem, doc ); 00236 elem.appendChild( layerItemElem ); 00237 } 00238 00239 void QgsComposerLayerItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00240 { 00241 if ( itemElem.isNull() ) 00242 { 00243 return; 00244 } 00245 setText( itemElem.attribute( "text", "" ) ); 00246 setUserText( itemElem.attribute( "userText", "" ) ); 00247 setLayerID( itemElem.attribute( "layerId", "" ) ); 00248 setShowFeatureCount( itemElem.attribute( "showFeatureCount", "" ) == "1" ? true : false ); 00249 setStyle( QgsComposerLegendStyle::styleFromName( itemElem.attribute( "style", "subgroup" ) ) ); 00250 00251 //now call readXML for all the child items 00252 QDomNodeList childList = itemElem.childNodes(); 00253 QDomNode currentNode; 00254 QDomElement currentElem; 00255 QgsComposerLegendItem* currentChildItem = 0; 00256 00257 int nChildItems = childList.count(); 00258 for ( int i = 0; i < nChildItems; ++i ) 00259 { 00260 currentNode = childList.at( i ); 00261 if ( !currentNode.isElement() ) 00262 { 00263 continue; 00264 } 00265 00266 currentElem = currentNode.toElement(); 00267 QString elemTag = currentElem.tagName(); 00268 if ( elemTag == "VectorClassificationItem" ) 00269 { 00270 continue; // legacy - unsupported 00271 } 00272 else if ( elemTag == "VectorClassificationItemNg" ) 00273 { 00274 currentChildItem = new QgsComposerSymbolV2Item(); 00275 } 00276 else if ( elemTag == "RasterClassificationItem" ) 00277 { 00278 currentChildItem = new QgsComposerRasterSymbolItem(); 00279 } 00280 else 00281 { 00282 continue; //unsupported child type 00283 } 00284 currentChildItem->readXML( currentElem, xServerAvailable ); 00285 appendRow( currentChildItem ); 00286 } 00287 } 00288 00289 void QgsComposerLayerItem::setDefaultStyle() 00290 { 00291 // set default style according to number of symbols 00292 QgsVectorLayer* vLayer = qobject_cast<QgsVectorLayer*>( QgsMapLayerRegistry::instance()->mapLayer( layerID() ) ); 00293 if ( vLayer ) 00294 { 00295 QgsFeatureRendererV2* renderer = vLayer->rendererV2(); 00296 if ( renderer ) 00297 { 00298 QPair<QString, QgsSymbolV2*> symbolItem = renderer->legendSymbolItems().value( 0 ); 00299 if ( renderer->legendSymbolItems().size() > 1 || !symbolItem.first.isEmpty() ) 00300 { 00301 setStyle( QgsComposerLegendStyle::Subgroup ); 00302 } 00303 else 00304 { 00305 // Hide title by default for single symbol 00306 setStyle( QgsComposerLegendStyle::Hidden ); 00307 } 00308 } 00309 } 00310 } 00311 00313 00314 QgsComposerGroupItem::QgsComposerGroupItem(): QgsComposerLegendItem( QgsComposerLegendStyle::Group ) 00315 { 00316 } 00317 00318 QgsComposerGroupItem::QgsComposerGroupItem( const QString& text ): QgsComposerLegendItem( text, QgsComposerLegendStyle::Group ) 00319 { 00320 } 00321 00322 QgsComposerGroupItem::~QgsComposerGroupItem() 00323 { 00324 } 00325 00326 QStandardItem* QgsComposerGroupItem::clone() const 00327 { 00328 QgsComposerGroupItem* cloneItem = new QgsComposerGroupItem(); 00329 *cloneItem = *this; 00330 return cloneItem; 00331 } 00332 00333 void QgsComposerGroupItem::writeXML( QDomElement& elem, QDomDocument& doc ) const 00334 { 00335 QDomElement layerGroupElem = doc.createElement( "GroupItem" ); 00336 // text is always user text, but for forward compatibility for now write both 00337 layerGroupElem.setAttribute( "text", text() ); 00338 layerGroupElem.setAttribute( "userText", userText() ); 00339 layerGroupElem.setAttribute( "style", QgsComposerLegendStyle::styleName( mStyle ) ); 00340 writeXMLChildren( layerGroupElem, doc ); 00341 elem.appendChild( layerGroupElem ); 00342 } 00343 00344 void QgsComposerGroupItem::readXML( const QDomElement& itemElem, bool xServerAvailable ) 00345 { 00346 if ( itemElem.isNull() ) 00347 { 00348 return; 00349 } 00350 // text is always user text but for backward compatibility we read also text 00351 QString userText = itemElem.attribute( "userText", "" ); 00352 if ( userText.isEmpty() ) 00353 { 00354 userText = itemElem.attribute( "text", "" ); 00355 } 00356 setText( userText ); 00357 setUserText( userText ); 00358 00359 setStyle( QgsComposerLegendStyle::styleFromName( itemElem.attribute( "style", "group" ) ) ); 00360 00361 //now call readXML for all the child items 00362 QDomNodeList childList = itemElem.childNodes(); 00363 QDomNode currentNode; 00364 QDomElement currentElem; 00365 QgsComposerLegendItem* currentChildItem = 0; 00366 00367 int nChildItems = childList.count(); 00368 for ( int i = 0; i < nChildItems; ++i ) 00369 { 00370 currentNode = childList.at( i ); 00371 if ( !currentNode.isElement() ) 00372 { 00373 continue; 00374 } 00375 00376 currentElem = currentNode.toElement(); 00377 QString elemTag = currentElem.tagName(); 00378 00379 if ( elemTag == "GroupItem" ) 00380 { 00381 currentChildItem = new QgsComposerGroupItem(); 00382 } 00383 else if ( elemTag == "LayerItem" ) 00384 { 00385 currentChildItem = new QgsComposerLayerItem(); 00386 } 00387 else 00388 { 00389 continue; //unsupported child item type 00390 } 00391 currentChildItem->readXML( currentElem, xServerAvailable ); 00392 00393 QList<QStandardItem *> itemsList; 00394 itemsList << currentChildItem << new QgsComposerStyleItem( currentChildItem ); 00395 appendRow( itemsList ); 00396 } 00397 } 00398 00399 QgsComposerStyleItem::QgsComposerStyleItem(): QStandardItem() 00400 { 00401 } 00402 00403 QgsComposerStyleItem::QgsComposerStyleItem( QgsComposerLegendItem *item ): QStandardItem() 00404 { 00405 setData( QgsComposerLegendStyle::styleLabel( item->style() ) , Qt::DisplayRole ); 00406 } 00407 00408 QgsComposerStyleItem::~QgsComposerStyleItem() 00409 { 00410 }