QGIS API Documentation  master-59fd5e0
src/core/composer/qgscomposerlegenditem.cpp
Go to the documentation of this file.
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 }
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Defines