[QGIS Commit] r11934 - in branches/symbology-ng-branch: python/core src/app/legend src/core/symbology-ng

svn_qgis at osgeo.org svn_qgis at osgeo.org
Fri Nov 6 08:04:20 EST 2009


Author: wonder
Date: 2009-11-06 08:04:20 -0500 (Fri, 06 Nov 2009)
New Revision: 11934

Modified:
   branches/symbology-ng-branch/python/core/symbology-ng-core.sip
   branches/symbology-ng-branch/src/app/legend/qgslegendlayer.cpp
   branches/symbology-ng-branch/src/app/legend/qgslegendlayer.h
   branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
   branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h
   branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h
   branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.h
   branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.h
Log:
generic solution for legend symbology items


Modified: branches/symbology-ng-branch/python/core/symbology-ng-core.sip
===================================================================
--- branches/symbology-ng-branch/python/core/symbology-ng-core.sip	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/python/core/symbology-ng-core.sip	2009-11-06 13:04:20 UTC (rev 11934)
@@ -1,6 +1,8 @@
 
 typedef QList<QgsSymbolV2*> QgsSymbolV2List;
 
+typedef QList< QPair<QString, QPixmap> > QgsLegendSymbologyList;
+
 ///////////////
 
 /*
@@ -60,6 +62,15 @@
   bool usingSymbolLevels() const;
   void setUsingSymbolLevels(bool usingSymbolLevels);
 
+  //! create a renderer from XML element
+  static QgsFeatureRendererV2* load(QDomElement& symbologyElem);
+
+  //! store renderer info to XML element
+  virtual QDomElement save(QDomDocument& doc);
+
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
 protected:
   QgsFeatureRendererV2(QString type);
 
@@ -93,6 +104,16 @@
   virtual QString dump();
 
   virtual QgsFeatureRendererV2* clone() /Factory/;
+
+  //! create a renderer from XML element
+  static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
+
+  //! store renderer info to XML element
+  virtual QDomElement save(QDomDocument& doc);
+
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
 };
 
 //////////
@@ -159,9 +180,24 @@
   bool deleteCategory(int catIndex);
   void deleteAllCategories();
   
+  //! create a renderer from XML element
+  static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
+
+  //! store renderer info to XML element
+  virtual QDomElement save(QDomDocument& doc);
+
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
   QString classAttribute() const;
   void setClassAttribute(QString attr);
 
+  QgsSymbolV2* sourceSymbol();
+  void setSourceSymbol(QgsSymbolV2* sym /Transfer/);
+
+  QgsVectorColorRampV2* sourceColorRamp();
+  void setSourceColorRamp(QgsVectorColorRampV2* ramp /Transfer/);
+
 protected:
   
   QgsSymbolV2* symbolForValue(QVariant value);
@@ -244,6 +280,21 @@
                   QgsSymbolV2* symbol,
                   QgsVectorColorRampV2* ramp);
 
+  //! create a renderer from XML element
+  static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
+
+  //! store renderer info to XML element
+  virtual QDomElement save(QDomDocument& doc);
+
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
+  QgsSymbolV2* sourceSymbol();
+  void setSourceSymbol(QgsSymbolV2* sym /Transfer/);
+
+  QgsVectorColorRampV2* sourceColorRamp();
+  void setSourceColorRamp(QgsVectorColorRampV2* ramp /Transfer/);
+
 protected:
   QgsSymbolV2* symbolForValue(double value);
 };

Modified: branches/symbology-ng-branch/src/app/legend/qgslegendlayer.cpp
===================================================================
--- branches/symbology-ng-branch/src/app/legend/qgslegendlayer.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/app/legend/qgslegendlayer.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -369,7 +369,7 @@
     }
 
     QPixmap pix = QPixmap::fromImage( img ); // convert to pixmap
-    itemList.push_back( std::make_pair( values, pix ) );
+    itemList.append( qMakePair( values, pix ) );
   }
 
 
@@ -388,7 +388,7 @@
         {
           classfieldname = fields[*it].name();
         }
-        itemList.push_front( std::make_pair( classfieldname, QPixmap() ) );
+        itemList.append( qMakePair( classfieldname, QPixmap() ) );
       }
     }
   }
@@ -396,73 +396,16 @@
   changeSymbologySettings( layer, itemList );
 }
 
-static QPixmap _symbolPreviewPixmap(QgsSymbolV2* sym, QSize iconSize)
-{
-  QPainter p;
-  QPixmap pix(iconSize);
-  pix.fill(Qt::white);
-  p.begin(&pix);
-  p.setRenderHint(QPainter::Antialiasing);
-  sym->drawPreviewIcon(&p, iconSize);
-  p.end();
-  return pix;
-}
 
 void QgsLegendLayer::vectorLayerSymbologyV2( QgsVectorLayer* layer )
 {
-  SymbologyList itemList;
-
   QSize iconSize(16,16);
 
   QSettings settings;
   bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
 
-  QgsFeatureRendererV2* renderer = layer->rendererV2();
-  QString rendererType = renderer->type();
-  if (rendererType == "singleSymbol")
-  {
-   QgsSingleSymbolRendererV2* r = static_cast<QgsSingleSymbolRendererV2*>(renderer);
-    QPixmap pix = _symbolPreviewPixmap(r->symbol(), iconSize);
+  SymbologyList itemList = layer->rendererV2()->legendSymbologyItems(iconSize);
 
-    itemList.push_back( std::make_pair( "", pix ) );
-  }
-  else if (rendererType == "categorizedSymbol")
-  {
-    QgsCategorizedSymbolRendererV2* r = static_cast<QgsCategorizedSymbolRendererV2*>(renderer);
-    if (showClassifiers)
-    {
-      itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
-    }
-
-    int count = r->categories().count();
-    for (int i = 0; i < count; i++)
-    {
-      const QgsRendererCategoryV2& cat = r->categories()[i];
-      QPixmap pix = _symbolPreviewPixmap( cat.symbol(), iconSize );
-      itemList.push_back( std::make_pair( cat.label(), pix ) );
-    }
-  }
-  else if (rendererType == "graduatedSymbol")
-  {
-    QgsGraduatedSymbolRendererV2* r = static_cast<QgsGraduatedSymbolRendererV2*>(renderer);
-    if (showClassifiers)
-    {
-      itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
-    }
-
-    int count = r->ranges().count();
-    for (int i = 0; i < count; i++)
-    {
-      const QgsRendererRangeV2& range = r->ranges()[i];
-      QPixmap pix = _symbolPreviewPixmap( range.symbol(), iconSize );
-      itemList.push_back( std::make_pair( range.label(), pix ) );
-    }
-  }
-  else
-  {
-    // nothing for unknown renderers
-  }
-
   changeSymbologySettings( layer, itemList );
 }
 
@@ -470,7 +413,7 @@
 {
   SymbologyList itemList;
   QPixmap legendpixmap = layer->legendAsPixmap( true ).scaled( 20, 20, Qt::KeepAspectRatio );
-  itemList.push_back( std::make_pair( "", legendpixmap ) );
+  itemList.append( qMakePair( QString(), legendpixmap ) );
 
   changeSymbologySettings( layer, itemList );
 

Modified: branches/symbology-ng-branch/src/app/legend/qgslegendlayer.h
===================================================================
--- branches/symbology-ng-branch/src/app/legend/qgslegendlayer.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/app/legend/qgslegendlayer.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -33,7 +33,7 @@
 
 class QTreeWidget;
 
-typedef std::list< std::pair<QString, QPixmap> > SymbologyList;
+typedef QList< QPair<QString, QPixmap> > SymbologyList;
 
 /**
 Container for layer, including layer file(s), symbology class breaks and properties

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -10,6 +10,7 @@
 
 #include <QDomDocument>
 #include <QDomElement>
+#include <QSettings> // for legend
 
 QgsRendererCategoryV2::QgsRendererCategoryV2(QVariant value, QgsSymbolV2* symbol, QString label)
   : mValue(value), mSymbol(symbol), mLabel(label)
@@ -335,6 +336,28 @@
   return rendererElem;
 }
 
+QgsLegendSymbologyList QgsCategorizedSymbolRendererV2::legendSymbologyItems(QSize iconSize)
+{
+  QSettings settings;
+  bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
+
+  QgsLegendSymbologyList lst;
+  if (showClassifiers)
+  {
+    lst << qMakePair( classAttribute(), QPixmap() );
+  }
+
+  int count = categories().count();
+  for (int i = 0; i < count; i++)
+  {
+    const QgsRendererCategoryV2& cat = categories()[i];
+    QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( cat.symbol(), iconSize );
+    lst << qMakePair( cat.label(), pix );
+  }
+  return lst;
+}
+
+
 QgsSymbolV2* QgsCategorizedSymbolRendererV2::sourceSymbol()
 {
   return mSourceSymbol;

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgscategorizedsymbolrendererv2.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -79,6 +79,9 @@
   //! store renderer info to XML element
   virtual QDomElement save(QDomDocument& doc);
 
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
   QgsSymbolV2* sourceSymbol();
   void setSourceSymbol(QgsSymbolV2* sym);
 

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -10,6 +10,7 @@
 
 #include <QDomDocument>
 #include <QDomElement>
+#include <QSettings> // for legend
 
 QgsRendererRangeV2::QgsRendererRangeV2(double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label)
   : mLowerValue(lowerValue), mUpperValue(upperValue), mSymbol(symbol), mLabel(label)
@@ -432,6 +433,27 @@
   return rendererElem;
 }
 
+QgsLegendSymbologyList QgsGraduatedSymbolRendererV2::legendSymbologyItems(QSize iconSize)
+{
+  QSettings settings;
+  bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
+
+  QgsLegendSymbologyList lst;
+  if (showClassifiers)
+  {
+    lst << qMakePair( classAttribute(), QPixmap() );
+  }
+
+  int count = ranges().count();
+  for (int i = 0; i < count; i++)
+  {
+    const QgsRendererRangeV2& range = ranges()[i];
+    QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( range.symbol(), iconSize );
+    lst << qMakePair( range.label(), pix );
+  }
+  return lst;
+}
+
 QgsSymbolV2* QgsGraduatedSymbolRendererV2::sourceSymbol()
 {
   return mSourceSymbol;

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -87,6 +87,9 @@
   //! store renderer info to XML element
   virtual QDomElement save(QDomDocument& doc);
 
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
   QgsSymbolV2* sourceSymbol();
   void setSourceSymbol(QgsSymbolV2* sym);
 

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -281,6 +281,13 @@
   return doc.createElement(RENDERER_TAG_NAME);
 }
 
+QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems(QSize iconSize)
+{
+  // empty list by default
+  return QgsLegendSymbologyList();
+}
+
+
 int QgsFeatureRendererV2::fieldNameIndex( const QgsFieldMap& fields, const QString& fieldName )
 {
   for ( QgsFieldMap::const_iterator it = fields.constBegin(); it != fields.constEnd(); ++it )

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -8,6 +8,8 @@
 #include <QList>
 #include <QString>
 #include <QVariant>
+#include <QPair>
+#include <QPixmap>
 
 class QDomDocument;
 class QDomElement;
@@ -19,6 +21,8 @@
 typedef QList<QgsSymbolV2*> QgsSymbolV2List;
 typedef QMap<QString, QgsSymbolV2* > QgsSymbolV2Map;
 
+typedef QList< QPair<QString, QPixmap> > QgsLegendSymbologyList;
+
 #define RENDERER_TAG_NAME   "renderer-v2"
 
 ////////
@@ -84,6 +88,9 @@
 
   //! store renderer info to XML element
   virtual QDomElement save(QDomDocument& doc);
+
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
   
   /** Returns the index of a field name or -1 if the field does not exist
     * copied from QgsVectorDataProvider... d'oh... probably should be elsewhere

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -100,3 +100,12 @@
 
   return rendererElem;
 }
+
+QgsLegendSymbologyList QgsSingleSymbolRendererV2::legendSymbologyItems(QSize iconSize)
+{
+  QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap(mSymbol, iconSize);
+
+  QgsLegendSymbologyList lst;
+  lst << qMakePair( QString(), pix );
+  return lst;
+}

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssinglesymbolrendererv2.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -34,6 +34,9 @@
   //! store renderer info to XML element
   virtual QDomElement save(QDomDocument& doc);
 
+  //! return a list of symbology items for the legend
+  virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
+
 protected:
   QgsSymbolV2* mSymbol;
 };

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.cpp	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.cpp	2009-11-06 13:04:20 UTC (rev 11934)
@@ -146,6 +146,11 @@
 
 QIcon QgsSymbolLayerV2Utils::symbolPreviewIcon(QgsSymbolV2* symbol, QSize size)
 {
+  return QIcon(symbolPreviewPixmap(symbol, size));
+}
+
+QPixmap QgsSymbolLayerV2Utils::symbolPreviewPixmap(QgsSymbolV2* symbol, QSize size)
+{
   QPixmap pixmap(size);
   QPainter painter;
   painter.begin(&pixmap);
@@ -153,9 +158,10 @@
   painter.eraseRect(QRect(QPoint(0,0),size));
   symbol->drawPreviewIcon(&painter, size);
   painter.end();
-  return QIcon(pixmap);
+  return pixmap;
 }
 
+
 QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon(QgsSymbolLayerV2* layer, QSize size)
 {
   QPixmap pixmap(size);

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.h	2009-11-06 11:50:01 UTC (rev 11933)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssymbollayerv2utils.h	2009-11-06 13:04:20 UTC (rev 11934)
@@ -47,6 +47,7 @@
   static QIcon symbolLayerPreviewIcon(QgsSymbolLayerV2* layer, QSize size);
   static QIcon colorRampPreviewIcon(QgsVectorColorRampV2* ramp, QSize size);
 
+  static QPixmap symbolPreviewPixmap(QgsSymbolV2* symbol, QSize size);
   static QPixmap colorRampPreviewPixmap(QgsVectorColorRampV2* ramp, QSize size);
 
   static QgsSymbolV2* loadSymbol(QDomElement& element);



More information about the QGIS-commit mailing list