[QGIS Commit] r13118 - trunk/qgis/src/core/composer

svn_qgis at osgeo.org svn_qgis at osgeo.org
Sat Mar 20 18:41:02 EDT 2010


Author: mhugent
Date: 2010-03-20 18:41:01 -0400 (Sat, 20 Mar 2010)
New Revision: 13118

Modified:
   trunk/qgis/src/core/composer/qgscomposerlegend.cpp
   trunk/qgis/src/core/composer/qgscomposerlegend.h
   trunk/qgis/src/core/composer/qgslegendmodel.cpp
   trunk/qgis/src/core/composer/qgslegendmodel.h
Log:
Added symbology-ng capability to composer legend

Modified: trunk/qgis/src/core/composer/qgscomposerlegend.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.cpp	2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.cpp	2010-03-20 22:41:01 UTC (rev 13118)
@@ -21,6 +21,7 @@
 #include "qgsmaprenderer.h"
 #include "qgsrenderer.h" //for brush scaling
 #include "qgssymbol.h"
+#include "qgssymbolv2.h"
 #include <QDomDocument>
 #include <QDomElement>
 #include <QPainter>
@@ -218,6 +219,15 @@
       symbol = ( QgsSymbol* )( symbolData );
     }
 
+    //take QgsSymbolV2* from user data if there
+    QVariant symbolNgVariant = currentItem->data( Qt::UserRole + 2 );
+    QgsSymbolV2* symbolNg = 0;
+    if ( symbolNgVariant.canConvert<void*>() )
+    {
+      void* symbolNgData = symbolNgVariant.value<void*>();
+      symbolNg = ( QgsSymbolV2* )symbolNgData;
+    }
+
     if ( symbol )  //item with symbol?
     {
       //draw symbol
@@ -225,6 +235,12 @@
       realItemHeight = std::max( realSymbolHeight, itemHeight );
       currentXCoord += mIconLabelSpace;
     }
+    else if ( symbolNg ) //item with symbol NG?
+    {
+      drawSymbolV2( p, symbolNg, currentYCoord + ( itemHeight - mSymbolHeight ) / 2, currentXCoord, realSymbolHeight, layerOpacity );
+      realItemHeight = std::max( realSymbolHeight, itemHeight );
+      currentXCoord += mIconLabelSpace;
+    }
     else //item with icon?
     {
       QIcon symbolIcon = currentItem->icon();
@@ -276,6 +292,32 @@
   }
 }
 
+void QgsComposerLegend::drawSymbolV2( QPainter* p, QgsSymbolV2* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity ) const
+{
+  if ( !p || !s )
+  {
+    return;
+  }
+
+  double rasterScaleFactor = 1.0;
+  if ( p )
+  {
+    QPaintDevice* paintDevice = p->device();
+    if ( !paintDevice )
+    {
+      return;
+    }
+    rasterScaleFactor = ( paintDevice->logicalDpiX() + paintDevice->logicalDpiY() ) / 2.0 / 25.4;
+  }
+  p->save();
+  p->translate( currentXPosition, currentYCoord );
+  p->scale( 1.0 / rasterScaleFactor, 1.0 / rasterScaleFactor );
+  s->drawPreviewIcon( p, QSize( mSymbolWidth * rasterScaleFactor, mSymbolHeight * rasterScaleFactor ) );
+  p->restore();
+  currentXPosition += mSymbolWidth;
+  symbolHeight = mSymbolHeight;
+}
+
 void QgsComposerLegend::drawPointSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int opacity ) const
 {
   if ( !s )

Modified: trunk/qgis/src/core/composer/qgscomposerlegend.h
===================================================================
--- trunk/qgis/src/core/composer/qgscomposerlegend.h	2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgscomposerlegend.h	2010-03-20 22:41:01 UTC (rev 13118)
@@ -22,6 +22,7 @@
 #include "qgslegendmodel.h"
 
 class QgsSymbol;
+class QgsSymbolV2;
 
 /** \ingroup MapComposer
  * A legend that can be placed onto a map composition
@@ -133,6 +134,7 @@
     /**Draws a symbol at the current y position and returns the new x position. Returns real symbol height, because for points,
      it is possible that it differs from mSymbolHeight*/
     void drawSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity = 255 ) const;
+    void drawSymbolV2( QPainter* p, QgsSymbolV2* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int layerOpacity = 255 ) const;
     void drawPointSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, double& symbolHeight, int opacity = 255 ) const;
     void drawLineSymbol( QPainter*, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity = 255 ) const;
     void drawPolygonSymbol( QPainter* p, QgsSymbol* s, double currentYCoord, double& currentXPosition, int opacity = 255 ) const;

Modified: trunk/qgis/src/core/composer/qgslegendmodel.cpp
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.cpp	2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgslegendmodel.cpp	2010-03-20 22:41:01 UTC (rev 13118)
@@ -21,6 +21,8 @@
 #include "qgsmaplayerregistry.h"
 #include "qgsrasterlayer.h"
 #include "qgsrenderer.h"
+#include "qgsrendererv2.h"
+#include "qgssymbollayerv2utils.h"
 #include "qgssymbol.h"
 #include "qgsvectordataprovider.h"
 #include "qgsvectorlayer.h"
@@ -40,6 +42,7 @@
 QgsLegendModel::~QgsLegendModel()
 {
   removeAllSymbols();
+  removeAllSymbolsV2();
 }
 
 void QgsLegendModel::setLayerSet( const QStringList& layerIds )
@@ -48,6 +51,8 @@
 
   //for now clear the model and add the new entries
   clear();
+  removeAllSymbols();
+  removeAllSymbolsV2();
 
   QStringList::const_iterator idIter = mLayerIds.constBegin();
   QgsMapLayer* currentLayer = 0;
@@ -67,8 +72,21 @@
     switch ( currentLayer->type() )
     {
       case QgsMapLayer::VectorLayer:
-        addVectorLayerItems( layerItem, currentLayer );
+      {
+        QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( currentLayer );
+        if ( vl )
+        {
+          if ( vl->isUsingRendererV2() )
+          {
+            addVectorLayerItemsV2( layerItem, vl );
+          }
+          else
+          {
+            addVectorLayerItems( layerItem, vl );
+          }
+        }
         break;
+      }
       case QgsMapLayer::RasterLayer:
         addRasterLayerItem( layerItem, currentLayer );
         break;
@@ -79,21 +97,47 @@
 
 }
 
-int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer* vlayer )
+int QgsLegendModel::addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer )
 {
   if ( !layerItem || !vlayer )
   {
     return 1;
   }
 
-  QgsVectorLayer* vectorLayer = qobject_cast<QgsVectorLayer *>( vlayer );
-  if ( !vectorLayer )
+  QgsFeatureRendererV2* renderer = vlayer->rendererV2();
+  if ( !renderer )
   {
     return 2;
   }
-  int opacity = vectorLayer->getTransparency();
 
-  const QgsRenderer* vectorRenderer = vectorLayer->renderer();
+  QgsLegendSymbolList lst = renderer->legendSymbolItems();
+  QgsLegendSymbolList::const_iterator symbolIt = lst.constBegin();
+  for ( ; symbolIt != lst.constEnd(); ++symbolIt )
+  {
+    QStandardItem* currentSymbolItem = new QStandardItem( symbolIt->first );
+    if ( symbolIt->second )
+    {
+      currentSymbolItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolIt->second, QSize( 30, 30 ) ) );
+      //reserve Qt::UserRole + 2 for symbology-ng
+      QgsSymbolV2* newSymbol = symbolIt->second->clone();
+      insertSymbolV2( newSymbol );
+      currentSymbolItem->setData( QVariant::fromValue(( void* )( newSymbol ) ), Qt::UserRole + 2 );
+    }
+    currentSymbolItem->setFlags( Qt::ItemIsEnabled | Qt::ItemIsSelectable );
+    layerItem->setChild( layerItem->rowCount(), 0, currentSymbolItem );
+  }
+}
+
+int QgsLegendModel::addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer )
+{
+  if ( !layerItem || !vlayer )
+  {
+    return 1;
+  }
+
+  int opacity = vlayer->getTransparency();
+
+  const QgsRenderer* vectorRenderer = vlayer->renderer();
   if ( !vectorRenderer )
   {
     return 3;
@@ -103,7 +147,7 @@
   QSettings settings;
   if ( settings.value( "/qgis/showLegendClassifiers", false ).toBool() )
   {
-    QgsFieldMap layerFields = vectorLayer->pendingFields();
+    QgsFieldMap layerFields = vlayer->pendingFields();
     QgsAttributeList attributes = vectorRenderer->classificationAttributes();
     QgsAttributeList::const_iterator att_it = attributes.constBegin();
     for ( ; att_it != attributes.constEnd(); ++att_it )
@@ -111,7 +155,7 @@
       QgsFieldMap::const_iterator fieldIt = layerFields.find( *att_it );
       if ( fieldIt != layerFields.constEnd() )
       {
-        QString attributeName = vectorLayer->attributeDisplayName( fieldIt.key() );
+        QString attributeName = vlayer->attributeDisplayName( fieldIt.key() );
         QStandardItem* attributeItem = new QStandardItem( attributeName );
         layerItem->setChild( layerItem->rowCount(), 0, attributeItem );
       }
@@ -172,11 +216,26 @@
   mSymbols.insert( s );
 }
 
+void QgsLegendModel::insertSymbolV2( QgsSymbolV2* s )
+{
+  QSet<QgsSymbolV2*>::iterator it = mSymbolsV2.find( s );
+  if ( it != mSymbolsV2.end() )
+  {
+    delete( *it ); //very unlikely
+  }
+  mSymbolsV2.insert( s );
+}
+
 void QgsLegendModel::removeSymbol( QgsSymbol* s )
 {
   mSymbols.remove( s );
 }
 
+void QgsLegendModel::removeSymbolV2( QgsSymbolV2* s )
+{
+  mSymbolsV2.remove( s );
+}
+
 void QgsLegendModel::removeAllSymbols()
 {
   QSet<QgsSymbol*>::iterator it = mSymbols.begin();
@@ -187,6 +246,16 @@
   mSymbols.clear();
 }
 
+void QgsLegendModel::removeAllSymbolsV2()
+{
+  QSet<QgsSymbolV2*>::iterator it = mSymbolsV2.begin();
+  for ( ; it != mSymbolsV2.end(); ++it )
+  {
+    delete *it;
+  }
+  mSymbolsV2.clear();
+}
+
 void QgsLegendModel::updateItem( QStandardItem* item )
 {
   if ( !item )
@@ -211,10 +280,22 @@
     symbol = ( QgsSymbol* )( symbolData );
   }
 
+  QVariant symbolNgVariant = item->data( Qt::UserRole + 2 );
+  QgsSymbolV2* symbolNg = 0;
+  if ( symbolNgVariant.canConvert<void*>() )
+  {
+    void* symbolNgData = symbolVariant.value<void*>();
+    symbolNg = ( QgsSymbolV2* )symbolNgData;
+  }
+
   if ( symbol )  //vector classification item
   {
     updateVectorClassificationItem( item, symbol, item->text() );
   }
+  else if ( symbolNg )
+  {
+    updateVectorV2ClassificationItem( item, symbolNg, item->text() );
+  }
   else if ( !item->icon().isNull() ) //raster classification item
   {
     updateRasterClassificationItem( item );
@@ -243,8 +324,21 @@
     switch ( mapLayer->type() )
     {
       case QgsMapLayer::VectorLayer:
-        addVectorLayerItems( layerItem, mapLayer );
-        break;
+      {
+        QgsVectorLayer* vLayer = dynamic_cast<QgsVectorLayer*>( mapLayer );
+        if ( vLayer )
+        {
+          if ( vLayer->isUsingRendererV2() )
+          {
+            addVectorLayerItemsV2( layerItem, vLayer );
+          }
+          else
+          {
+            addVectorLayerItems( layerItem, vLayer );
+          }
+        }
+      }
+      break;
       case QgsMapLayer::RasterLayer:
         addRasterLayerItem( layerItem, mapLayer );
         break;
@@ -334,7 +428,12 @@
   }
 }
 
+void QgsLegendModel::updateVectorV2ClassificationItem( QStandardItem* classificationItem, QgsSymbolV2* symbol, QString itemText )
+{
+  //todo...
+}
 
+
 void QgsLegendModel::updateRasterClassificationItem( QStandardItem* classificationItem )
 {
   if ( !classificationItem )
@@ -406,8 +505,21 @@
   switch ( theMapLayer->type() )
   {
     case QgsMapLayer::VectorLayer:
-      addVectorLayerItems( layerItem, theMapLayer );
+    {
+      QgsVectorLayer* vl = dynamic_cast<QgsVectorLayer*>( theMapLayer );
+      if ( vl )
+      {
+        if ( vl->isUsingRendererV2() )
+        {
+          addVectorLayerItemsV2( layerItem, vl );
+        }
+        else
+        {
+          addVectorLayerItems( layerItem, vl );
+        }
+      }
       break;
+    }
     case QgsMapLayer::RasterLayer:
       addRasterLayerItem( layerItem, theMapLayer );
       break;
@@ -522,17 +634,38 @@
 
       //store text and QgsSymbol for vector classification items
       QVariant symbolVariant = currentClassificationItem->data();
+      QVariant symbolNgVariant = currentClassificationItem->data( Qt::UserRole + 2 );
       QgsSymbol* symbol = 0;
+      QgsSymbolV2* symbolNg = 0;
+
       if ( symbolVariant.canConvert<void*>() )
       {
         void* symbolData = symbolVariant.value<void*>();
-        symbol = ( QgsSymbol* )( symbolData );
+        symbol = ( QgsSymbol* )symbolData;
       }
-      if ( symbol )
+      else if ( symbolNgVariant.canConvert<void*>() )
       {
-        QDomElement vectorClassElem = doc.createElement( "VectorClassificationItem" );
+        void* symbolNgData = symbolNgVariant.value<void*>();
+        symbolNg = ( QgsSymbolV2* )symbolNgData;
+      }
+
+      if ( symbol || symbolNg )
+      {
+        QDomElement vectorClassElem;
+        if ( symbol )
+        {
+          vectorClassElem = doc.createElement( "VectorClassificationItem" );
+          symbol->writeXML( vectorClassElem, doc, 0 );
+        }
+        else if ( symbolNg )
+        {
+          vectorClassElem = doc.createElement( "VectorClassificationItemNg" );
+          QgsSymbolV2Map saveSymbolMap;
+          saveSymbolMap.insert( "classificationSymbol", symbolNg );
+          QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols( saveSymbolMap, "symbols", doc );
+          vectorClassElem.appendChild( symbolsElem );
+        }
         vectorClassElem.setAttribute( "text", currentClassificationItem->text() );
-        symbol->writeXML( vectorClassElem, doc, 0 );
         newLayerItem.appendChild( vectorClassElem );
         continue;
       }
@@ -639,6 +772,23 @@
         }
         layerItem->setChild( layerItem->rowCount(), 0, childItem );
       }
+      else if ( currentChildElement.tagName() == "VectorClassificationItemNg" )
+      {
+        QDomElement symbolNgElem = currentChildElement.firstChildElement( "symbols" );
+        if ( !symbolNgElem.isNull() )
+        {
+          QgsSymbolV2Map loadSymbolMap = QgsSymbolLayerV2Utils::loadSymbols( symbolNgElem );
+          //we assume there is only one symbol in the map...
+          QgsSymbolV2Map::iterator mapIt = loadSymbolMap.begin();
+          if ( mapIt != loadSymbolMap.end() )
+          {
+            QgsSymbolV2* symbolNg = mapIt.value();
+            childItem->setData( QVariant::fromValue(( void* )symbolNg ), Qt::UserRole + 2 );
+            childItem->setIcon( QgsSymbolLayerV2Utils::symbolPreviewIcon( symbolNg, QSize( 30, 30 ) ) );
+          }
+          layerItem->setChild( layerItem->rowCount(), 0, childItem );
+        }
+      }
       else if ( currentChildElement.tagName() == "TextItem" )
       {
         layerItem->setChild( layerItem->rowCount(), 0, childItem );

Modified: trunk/qgis/src/core/composer/qgslegendmodel.h
===================================================================
--- trunk/qgis/src/core/composer/qgslegendmodel.h	2010-03-20 22:39:47 UTC (rev 13117)
+++ trunk/qgis/src/core/composer/qgslegendmodel.h	2010-03-20 22:41:01 UTC (rev 13118)
@@ -26,6 +26,8 @@
 class QDomElement;
 class QgsMapLayer;
 class QgsSymbol;
+class QgsSymbolV2;
+class QgsVectorLayer;
 
 /** \ingroup MapComposer
  * A model that provides layers as root items. The classification items are
@@ -47,6 +49,7 @@
     void updateLayer( QStandardItem* layerItem );
     /**Tries to update a single classification item*/
     void updateVectorClassificationItem( QStandardItem* classificationItem, QgsSymbol* symbol, QString itemText );
+    void updateVectorV2ClassificationItem( QStandardItem* classificationItem, QgsSymbolV2* symbol, QString itemText );
     void updateRasterClassificationItem( QStandardItem* classificationItem );
 
     bool writeXML( QDomElement& composerLegendElem, QDomDocument& doc ) const;
@@ -62,24 +65,32 @@
   private:
     /**Adds classification items of vector layers
      @return 0 in case of success*/
-    int addVectorLayerItems( QStandardItem* layerItem, QgsMapLayer* vlayer );
+    int addVectorLayerItems( QStandardItem* layerItem, QgsVectorLayer* vlayer );
 
+    /**Adds classification items of vector layers using new symbology*/
+    int addVectorLayerItemsV2( QStandardItem* layerItem, QgsVectorLayer* vlayer );
+
     /**Adds item of raster layer
      @return 0 in case of success*/
     int addRasterLayerItem( QStandardItem* layerItem, QgsMapLayer* rlayer );
 
     /**Insert a symbol into QgsLegendModel symbol storage*/
     void insertSymbol( QgsSymbol* s );
+    void insertSymbolV2( QgsSymbolV2* s );
     /**Removes and deletes a symbol*/
     void removeSymbol( QgsSymbol* s );
+    void removeSymbolV2( QgsSymbolV2* s );
     /**Removes and deletes all stored symbols*/
     void removeAllSymbols();
+    void removeAllSymbolsV2();
 
     /**Creates a model item for a vector symbol. The calling function takes ownership*/
     QStandardItem* itemFromSymbol( QgsSymbol* s, int opacity );
 
     /**Keep track of copied symbols to delete them if not used anymore*/
     QSet<QgsSymbol*> mSymbols;
+    /**Keep track of copied symbols v2*/
+    QSet<QgsSymbolV2*> mSymbolsV2;
 
   protected:
     QStringList mLayerIds;



More information about the QGIS-commit mailing list