[QGIS Commit] r11058 - in branches/symbology-ng-branch/src: core core/symbology-ng gui gui/symbology-ng ui

svn_qgis at osgeo.org svn_qgis at osgeo.org
Mon Jul 13 14:49:25 EDT 2009


Author: wonder
Date: 2009-07-13 14:49:24 -0400 (Mon, 13 Jul 2009)
New Revision: 11058

Added:
   branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.h
   branches/symbology-ng-branch/src/ui/qgssymbollevelsv2dialogbase.ui
Modified:
   branches/symbology-ng-branch/src/core/qgsvectorlayer.cpp
   branches/symbology-ng-branch/src/core/qgsvectorlayer.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/qgssymbolv2.cpp
   branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.h
   branches/symbology-ng-branch/src/gui/CMakeLists.txt
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp
   branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h
   branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui
Log:
Added support for rendering symbols in customized order - "symbol levels". In renderer dialog one can override the default settings.


Modified: branches/symbology-ng-branch/src/core/qgsvectorlayer.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/qgsvectorlayer.cpp	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/qgsvectorlayer.cpp	2009-07-13 18:49:24 UTC (rev 11058)
@@ -680,6 +680,68 @@
   return ptr;
 }
 
+void QgsVectorLayer::drawRendererV2( QgsRenderContext& rendererContext, bool labeling )
+{
+  mRendererV2->startRender(rendererContext);
+
+  QgsFeature fet;
+  while ( nextFeature( fet ) )
+  {
+    mRendererV2->renderFeature(fet, rendererContext);
+
+    if ( labeling )
+      mLabelingRegisterFeatureHook(fet, mLabelingLayerContext);
+  }
+
+  mRendererV2->stopRender(rendererContext);
+}
+
+void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling )
+{
+  QHash< QgsSymbolV2*, QList<QgsFeature> > features; // key = symbol, value = array of features
+
+  // startRender must be called before symbolForFeature() calls to make sure renderer is ready
+  mRendererV2->startRender(rendererContext);
+
+  // 1. fetch features
+  QgsFeature fet;
+  while ( nextFeature(fet) )
+  {
+    QgsSymbolV2* sym = mRendererV2->symbolForFeature(fet);
+    if ( !features.contains(sym) )
+    {
+      features.insert( sym, QList<QgsFeature>() );
+    }
+    features[sym].append( fet );
+
+    if ( labeling )
+      mLabelingRegisterFeatureHook(fet, mLabelingLayerContext);
+  }
+
+  // 2. draw features in correct order
+  QgsSymbolV2LevelOrder& levels = mRendererV2->symbolLevels();
+  for (int l = 0; l < levels.count(); l++)
+  {
+    QgsSymbolV2Level& level = levels[l];
+    for (int i = 0; i < level.count(); i++)
+    {
+      QgsSymbolV2LevelItem& item = level[i];
+      if (!features.contains(item.symbol()))
+      {
+        QgsDebugMsg("level item's symbol not found!");
+        continue;
+      }
+      int layer = item.layer();
+      QList<QgsFeature>& lst = features[item.symbol()];
+      QList<QgsFeature>::iterator fit;
+      for ( fit = lst.begin(); fit != lst.end(); ++fit )
+        mRendererV2->renderFeature(*fit, rendererContext, layer);
+    }
+  }
+
+  mRendererV2->stopRender(rendererContext);
+}
+
 bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
 {
   if (mUsingRendererV2)
@@ -688,19 +750,18 @@
       return FALSE;
 
     QgsDebugMsg("rendering v2:\n" + mRendererV2->dump());
-    
-    mRendererV2->startRender(rendererContext);
-    
+
     // TODO: really needed?
     updateFeatureCount();
     int totalFeatures = pendingFeatureCount();
     int featureCount = 0;
     
-    QgsFeature fet;
     QgsAttributeList attributes = mRendererV2->usedAttributes();
+    if (attributes.count() > 0)
+      QgsDebugMsg("attrs: " + QString::number(attributes[0]));
 
     bool labeling = FALSE;
-    if (mLabelingPrepareLayerHook)
+    if ( mLabelingPrepareLayerHook && mLabelingRegisterFeatureHook )
     {
       int attrIndex;
       if (mLabelingPrepareLayerHook(mLabelingContext, mLabelingLayerContext, attrIndex))
@@ -713,17 +774,11 @@
 
     select( attributes, rendererContext.extent() );
 
-    while ( nextFeature( fet ) )
-    {
-      mRendererV2->renderFeature(fet, rendererContext);
+    if (mRendererV2->symbolLevels().isEmpty())
+      drawRendererV2(rendererContext, labeling);
+    else
+      drawRendererV2Levels(rendererContext, labeling);
 
-      if (labeling && mLabelingRegisterFeatureHook)
-      {
-        mLabelingRegisterFeatureHook(fet, mLabelingLayerContext);
-      }
-    }
-    
-    mRendererV2->stopRender(rendererContext);
     return TRUE;
   }
   

Modified: branches/symbology-ng-branch/src/core/qgsvectorlayer.h
===================================================================
--- branches/symbology-ng-branch/src/core/qgsvectorlayer.h	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/qgsvectorlayer.h	2009-07-13 18:49:24 UTC (rev 11058)
@@ -175,6 +175,9 @@
     /** set whether to use renderer V2 for drawing. Added in QGIS 1.2 */
     void setUsingRendererV2(bool usingRendererV2);
 
+    void drawRendererV2( QgsRenderContext& rendererContext, bool labeling );
+    void drawRendererV2Levels( QgsRenderContext& rendererContext, bool labeling );
+
     /** Returns point, line or polygon */
     QGis::GeometryType geometryType() const;
 

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.cpp	2009-07-13 18:49:24 UTC (rev 11058)
@@ -116,7 +116,7 @@
 }
 
 
-void QgsFeatureRendererV2::renderFeature(QgsFeature& feature, QgsRenderContext& context)
+void QgsFeatureRendererV2::renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer)
 {
   QgsSymbolV2* symbol = symbolForFeature(feature);
   if (symbol == NULL)
@@ -136,7 +136,7 @@
         }
         QPointF pt;
         _getPoint(pt, context.mapToPixel(), geom->asWkb());
-        ((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context);
+        ((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context, layer);
       }
       break;
       
@@ -149,7 +149,7 @@
         }
         QPolygonF pts;
         _getLineString(pts, context.mapToPixel(), geom->asWkb());
-        ((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context);
+        ((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context, layer);
       }
       break;
 	   
@@ -163,7 +163,7 @@
         QPolygonF pts;
         QList<QPolygonF> holes;
         _getPolygon(pts, holes, context.mapToPixel(), geom->asWkb());
-        ((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context);
+        ((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context, layer);
       }
       break;
       
@@ -183,7 +183,7 @@
         for (unsigned int i = 0; i < num; ++i)
         {
           ptr = _getPoint(pt, context.mapToPixel(), ptr);
-          ((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context);
+          ((QgsMarkerSymbolV2*)symbol)->renderPoint(pt, context, layer);
         }
       }
       break;
@@ -204,7 +204,7 @@
         for (unsigned int i = 0; i < num; ++i)
         {
           ptr = _getLineString(pts, context.mapToPixel(), ptr);
-          ((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context);
+          ((QgsLineSymbolV2*)symbol)->renderPolyline(pts, context, layer);
         }
       }
       break;
@@ -226,7 +226,7 @@
         for (unsigned int i = 0; i < num; ++i)
         {
           ptr = _getPolygon(pts, holes, context.mapToPixel(), ptr);
-          ((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context);
+          ((QgsFillSymbolV2*)symbol)->renderPolygon(pts, (holes.count() ? &holes : NULL), context, layer);
         }
       }
       break;
@@ -357,7 +357,10 @@
   QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find(value.toString());
   if (it == mSymbolHash.end())
   {
-    QgsDebugMsg("attribute value not found: " + value.toString());
+    if (mSymbolHash.count() == 0)
+      QgsDebugMsg("there are no hashed symbols!!!");
+    else
+      QgsDebugMsg("attribute value not found: " + value.toString());
     return NULL;
   }
   else

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgsrendererv2.h	2009-07-13 18:49:24 UTC (rev 11058)
@@ -11,6 +11,31 @@
 class QgsRenderContext;
 class QgsFeature;
 
+
+////////
+// symbol levels
+
+class QgsSymbolV2LevelItem
+{
+public:
+  QgsSymbolV2LevelItem( QgsSymbolV2* symbol, int layer ) : mSymbol(symbol), mLayer(layer) {}
+  QgsSymbolV2* symbol() { return mSymbol; }
+  int layer() { return mLayer; }
+protected:
+  QgsSymbolV2* mSymbol;
+  int mLayer;
+};
+
+// every level has list of items: symbol + symbol layer num
+typedef QList< QgsSymbolV2LevelItem > QgsSymbolV2Level;
+
+// this is a list of levels
+typedef QList< QgsSymbolV2Level > QgsSymbolV2LevelOrder;
+
+
+//////////////
+// renderers
+
 class QgsFeatureRendererV2
 {
 public:
@@ -37,17 +62,22 @@
 	
 	virtual ~QgsFeatureRendererV2() {}
 	
-	void renderFeature(QgsFeature& feature, QgsRenderContext& context);
+  void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1);
 
   //! for debugging
   virtual QString dump();
 	
 	//TODO: symbols() for symbol levels
+
+  QgsSymbolV2LevelOrder& symbolLevels() { return mLevelOrder; }
+  void setSymbolLevels(const QgsSymbolV2LevelOrder& levelOrder) { mLevelOrder = levelOrder; }
   
 protected:
   QgsFeatureRendererV2(RendererType type);
   
   RendererType mType;
+
+  QgsSymbolV2LevelOrder mLevelOrder;
 };
 
 class QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.cpp
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.cpp	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.cpp	2009-07-13 18:49:24 UTC (rev 11058)
@@ -276,8 +276,15 @@
   return maxSize;
 }
 	
-void QgsMarkerSymbolV2::renderPoint(const QPointF& point, QgsRenderContext& context)
+void QgsMarkerSymbolV2::renderPoint(const QPointF& point, QgsRenderContext& context, int layer)
 {
+  if (layer != -1)
+  {
+    if ( layer >= 0 && layer < mLayers.count() )
+      ((QgsMarkerSymbolLayerV2*) mLayers[layer])->renderPoint(point, context);
+    return;
+  }
+
   for (QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it)
   {
     QgsMarkerSymbolLayerV2* layer = (QgsMarkerSymbolLayerV2*) *it;
@@ -324,8 +331,15 @@
   return maxWidth;
 }
 	
-void QgsLineSymbolV2::renderPolyline(const QPolygonF& points, QgsRenderContext& context)
+void QgsLineSymbolV2::renderPolyline(const QPolygonF& points, QgsRenderContext& context, int layer)
 {
+  if (layer != -1)
+  {
+    if ( layer >= 0 && layer < mLayers.count() )
+      ((QgsLineSymbolLayerV2*) mLayers[layer])->renderPolyline(points, context);
+    return;
+  }
+
   for (QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it)
   {
     QgsLineSymbolLayerV2* layer = (QgsLineSymbolLayerV2*) *it;
@@ -349,8 +363,15 @@
     mLayers.append(new QgsSimpleFillSymbolLayerV2());
 }
 
-void QgsFillSymbolV2::renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context)
+void QgsFillSymbolV2::renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer)
 {
+  if (layer != -1)
+  {
+    if ( layer >= 0 && layer < mLayers.count() )
+      ((QgsFillSymbolLayerV2*) mLayers[layer])->renderPolygon(points, rings, context);
+    return;
+  }
+
   for (QgsSymbolLayerV2List::iterator it = mLayers.begin(); it != mLayers.end(); ++it)
   {
     QgsFillSymbolLayerV2* layer = (QgsFillSymbolLayerV2*) *it;

Modified: branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.h
===================================================================
--- branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.h	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/core/symbology-ng/qgssymbolv2.h	2009-07-13 18:49:24 UTC (rev 11058)
@@ -94,7 +94,7 @@
 	void setSize(double size);
 	double size();
 	
-	void renderPoint(const QPointF& point, QgsRenderContext& context);
+  void renderPoint(const QPointF& point, QgsRenderContext& context, int layer = -1);
 
   virtual QgsSymbolV2* clone() const;
 };
@@ -109,7 +109,7 @@
 	void setWidth(int width);
 	int width();
 	
-	void renderPolyline(const QPolygonF& points, QgsRenderContext& context);
+  void renderPolyline(const QPolygonF& points, QgsRenderContext& context, int layer = -1);
 	
   virtual QgsSymbolV2* clone() const;
 };
@@ -121,7 +121,7 @@
 public:
   QgsFillSymbolV2(QgsSymbolLayerV2List layers = QgsSymbolLayerV2List());
 	
-	void renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context);
+  void renderPolygon(const QPolygonF& points, QList<QPolygonF>* rings, QgsRenderContext& context, int layer = -1);
 
   virtual QgsSymbolV2* clone() const;
 };

Modified: branches/symbology-ng-branch/src/gui/CMakeLists.txt
===================================================================
--- branches/symbology-ng-branch/src/gui/CMakeLists.txt	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/gui/CMakeLists.txt	2009-07-13 18:49:24 UTC (rev 11058)
@@ -7,6 +7,7 @@
 symbology-ng/qgssymbolv2propertiesdialog.cpp
 symbology-ng/qgsrendererv2propertiesdialog.cpp
 symbology-ng/qgsstylev2managerdialog.cpp
+symbology-ng/qgssymbollevelsv2dialog.cpp
 symbology-ng/qgssymbolv2selectordialog.cpp
 symbology-ng/qgsvectorgradientcolorrampv2dialog.cpp
 symbology-ng/qgsvectorrandomcolorrampv2dialog.cpp
@@ -45,6 +46,7 @@
 symbology-ng/qgssymbolv2propertiesdialog.h
 symbology-ng/qgsrendererv2propertiesdialog.h
 symbology-ng/qgsstylev2managerdialog.h
+symbology-ng/qgssymbollevelsv2dialog.h
 symbology-ng/qgssymbolv2selectordialog.h
 symbology-ng/qgsvectorgradientcolorrampv2dialog.h
 symbology-ng/qgsvectorrandomcolorrampv2dialog.h

Modified: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp	2009-07-13 18:49:24 UTC (rev 11058)
@@ -8,6 +8,7 @@
 #include "qgsstylev2.h"
 
 #include "qgssymbolv2selectordialog.h"
+#include "qgssymbollevelsv2dialog.h"
 
 #include "qgslogger.h"
 #include "qgsvectorlayer.h"
@@ -30,6 +31,8 @@
   
   setupUi(this);
 
+  connect(btnSymbolLevels, SIGNAL(clicked()), this, SLOT(symbolLevels()));
+
   connect(radSingleSymbol, SIGNAL(clicked()), this, SLOT(updateRenderer()));
   connect(radCategorized, SIGNAL(clicked()), this, SLOT(updateRenderer()));
   connect(radGraduated, SIGNAL(clicked()), this, SLOT(updateRenderer()));
@@ -491,3 +494,54 @@
   // make sure that the "range" column has visible context
   viewGraduated->resizeColumnToContents(0);
 }
+
+void QgsRendererV2PropertiesDialog::symbolLevels()
+{
+  QgsSymbolV2List symbols;
+
+  switch (mLayer->rendererV2()->type())
+  {
+    case QgsFeatureRendererV2::RendererSingleSymbol:
+    {
+      QgsSingleSymbolRendererV2* r = rendererSingle();
+      symbols.append(r->symbol());
+    }
+      break;
+
+    case QgsFeatureRendererV2::RendererCategorizedSymbol:
+    {
+      QgsCategorizedSymbolRendererV2* r = rendererCategorized();
+      int i, count = r->categories().count();
+
+      for (i = 0; i < count; i++)
+      {
+        const QgsRendererCategoryV2& cat = r->categories()[i];
+        symbols.append(cat.symbol());
+      }
+    }
+      break;
+
+    case QgsFeatureRendererV2::RendererGraduatedSymbol:
+    {
+      QgsGraduatedSymbolRendererV2* r = rendererGraduated();
+      int i, count = r->ranges().count();
+
+      for (i = 0; i < count; i++)
+      {
+        const QgsRendererRangeV2& range = r->ranges()[i];
+        symbols.append(range.symbol());
+      }
+    }
+      break;
+
+    default:
+      break;
+  }
+
+  // TODO: get symbol level order from layer!
+  QgsSymbolLevelsV2Dialog dlg(symbols, mLayer->rendererV2()->symbolLevels(), this);
+  if (dlg.exec())
+  {
+    mLayer->rendererV2()->setSymbolLevels( dlg.levels() );
+  }
+}

Modified: branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgsrendererv2propertiesdialog.h	2009-07-13 18:49:24 UTC (rev 11058)
@@ -33,6 +33,8 @@
   void changeGraduatedSymbol();
   void classifyGraduated();
 
+  void symbolLevels();
+
 protected:
   
   //! update UI to reflect changes in renderer

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp	2009-07-13 18:49:24 UTC (rev 11058)
@@ -0,0 +1,146 @@
+
+#include "qgssymbollevelsv2dialog.h"
+
+#include "qgssymbollayerv2utils.h"
+#include "qgssymbolv2.h"
+
+#include <QTableWidgetItem>
+
+QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, QgsSymbolV2LevelOrder levels, QWidget* parent)
+ : QDialog(parent), mSymbols(symbols), mLevels(levels)
+{
+  setupUi(this);
+
+  chkEnable->setChecked( !levels.isEmpty() );
+
+  connect(chkEnable, SIGNAL(clicked()), this, SLOT(updateUi()));
+
+  int maxLayers = 0;
+  tableLevels->setRowCount(symbols.count());
+  for (int i = 0; i < symbols.count(); i++)
+  {
+    QgsSymbolV2* sym = symbols[i];
+
+    // set icons for the rows
+    QIcon icon = QgsSymbolLayerV2Utils::symbolPreviewIcon(sym, QSize(16,16));
+    tableLevels->setVerticalHeaderItem(i, new QTableWidgetItem(icon, QString()) );
+
+    // find out max. number of layers per symbol
+    int layers = sym->symbolLayerCount();
+    if (layers > maxLayers)
+      maxLayers = layers;
+  }
+
+  tableLevels->setColumnCount(maxLayers);
+  for (int i = 0; i < maxLayers; i++)
+  {
+    QString name = QString("Layer %1").arg(i);
+    tableLevels->setHorizontalHeaderItem(i, new QTableWidgetItem(name));
+  }
+
+  mMaxLayers = maxLayers;
+
+  updateUi();
+
+  connect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
+  populateTable();
+}
+
+void QgsSymbolLevelsV2Dialog::populateTable()
+{
+  if (mLevels.isEmpty())
+    return;
+
+  disconnect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
+
+  for (int row = 0; row < mSymbols.count(); row++)
+  {
+    QgsSymbolV2* sym = mSymbols[row];
+    for (int layer = 0; layer < mMaxLayers; layer++)
+    {
+      QTableWidgetItem* item;
+      if (layer >= sym->symbolLayerCount())
+      {
+        item = new QTableWidgetItem();
+        item->setFlags(Qt::ItemFlags());
+      }
+      else
+      {
+        item = new QTableWidgetItem( QString::number(levelForSymbolLayer(sym, layer)) );
+      }
+      tableLevels->setItem(row, layer, item);
+    }
+  }
+
+  connect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
+
+}
+
+void QgsSymbolLevelsV2Dialog::updateUi()
+{
+  if (chkEnable->isChecked())
+  {
+    if (mLevels.isEmpty())
+      setDefaultLevels();
+    populateTable();
+  }
+  else
+    mLevels.clear();
+
+  tableLevels->setEnabled(chkEnable->isChecked());
+}
+
+void QgsSymbolLevelsV2Dialog::setDefaultLevels()
+{
+  mLevels.clear();
+  for (int col = 0; col < tableLevels->columnCount(); col++)
+  {
+    QgsSymbolV2Level level;
+    for (int i = 0; i < mSymbols.count(); i++)
+    {
+      QgsSymbolV2* sym = mSymbols[i];
+      if (col < sym->symbolLayerCount())
+        level.append(QgsSymbolV2LevelItem(sym, col));
+    }
+    mLevels.append(level);
+  }
+}
+
+int QgsSymbolLevelsV2Dialog::levelForSymbolLayer(QgsSymbolV2* sym, int layer)
+{
+  for (int l = 0; l < mLevels.count(); l++)
+  {
+    QgsSymbolV2Level& level = mLevels[l];
+    for (int i = 0; i < level.count(); i++)
+    {
+      QgsSymbolV2LevelItem& item = level[i];
+      if (item.symbol() == sym && item.layer() == layer)
+        return l;
+    }
+  }
+  return -1;
+}
+
+void QgsSymbolLevelsV2Dialog::updateLevels(QTableWidgetItem* item)
+{
+  int num = item->text().toInt();
+  if (num > 100)
+  {
+    item->setText("0");
+    return;
+  }
+
+  mLevels.clear();
+  for (int col = 0; col < tableLevels->columnCount(); col++)
+  {
+    for (int row = 0; row < mSymbols.count(); row++)
+    {
+      QgsSymbolV2* sym = mSymbols[row];
+      int level = tableLevels->item(row,col)->text().toInt();
+      QgsSymbolV2LevelItem item(sym,col);
+      while (level >= mLevels.count()) // append new empty levels
+        mLevels.append( QgsSymbolV2Level() );
+      mLevels[level].append(item);
+    }
+  }
+}

Added: branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.h
===================================================================
--- branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.h	                        (rev 0)
+++ branches/symbology-ng-branch/src/gui/symbology-ng/qgssymbollevelsv2dialog.h	2009-07-13 18:49:24 UTC (rev 11058)
@@ -0,0 +1,38 @@
+#ifndef QGSSYMBOLLEVELSV2DIALOG_H
+#define QGSSYMBOLLEVELSV2DIALOG_H
+
+#include <QDialog>
+#include <QList>
+
+#include "qgsrendererv2.h"
+
+#include "ui_qgssymbollevelsv2dialogbase.h"
+
+typedef QList<QgsSymbolV2*> QgsSymbolV2List;
+
+
+class QgsSymbolLevelsV2Dialog : public QDialog, private Ui::QgsSymbolLevelsV2DialogBase
+{
+  Q_OBJECT
+public:
+    QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, QgsSymbolV2LevelOrder levels, QWidget* parent = NULL);
+
+    QgsSymbolV2LevelOrder& levels() { return mLevels; }
+
+public slots:
+    void updateUi();
+    void updateLevels(QTableWidgetItem* item);
+
+protected:
+    void populateTable();
+    void setDefaultLevels();
+    int levelForSymbolLayer(QgsSymbolV2* sym, int layer);
+
+protected:
+    //! maximal number of layers from all symbols
+    int mMaxLayers;
+    QgsSymbolV2List mSymbols;
+    QgsSymbolV2LevelOrder mLevels;
+};
+
+#endif // QGSSYMBOLLEVELSV2DIALOG_H

Modified: branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui
===================================================================
--- branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui	2009-07-13 15:34:58 UTC (rev 11057)
+++ branches/symbology-ng-branch/src/ui/qgsrendererv2propsdialogbase.ui	2009-07-13 18:49:24 UTC (rev 11058)
@@ -66,7 +66,7 @@
      <item>
       <widget class="QPushButton" name="btnSymbolLevels">
        <property name="enabled">
-        <bool>false</bool>
+        <bool>true</bool>
        </property>
        <property name="text">
         <string>Symbol levels...</string>

Added: branches/symbology-ng-branch/src/ui/qgssymbollevelsv2dialogbase.ui
===================================================================
--- branches/symbology-ng-branch/src/ui/qgssymbollevelsv2dialogbase.ui	                        (rev 0)
+++ branches/symbology-ng-branch/src/ui/qgssymbollevelsv2dialogbase.ui	2009-07-13 18:49:24 UTC (rev 11058)
@@ -0,0 +1,74 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<ui version="4.0">
+ <class>QgsSymbolLevelsV2DialogBase</class>
+ <widget class="QDialog" name="QgsSymbolLevelsV2DialogBase">
+  <property name="geometry">
+   <rect>
+    <x>0</x>
+    <y>0</y>
+    <width>406</width>
+    <height>337</height>
+   </rect>
+  </property>
+  <property name="windowTitle">
+   <string>Symbol Levels</string>
+  </property>
+  <layout class="QVBoxLayout">
+   <item>
+    <widget class="QCheckBox" name="chkEnable">
+     <property name="text">
+      <string>Enable symbol levels</string>
+     </property>
+    </widget>
+   </item>
+   <item>
+    <widget class="QTableWidget" name="tableLevels"/>
+   </item>
+   <item>
+    <widget class="QDialogButtonBox" name="buttonBox">
+     <property name="orientation">
+      <enum>Qt::Horizontal</enum>
+     </property>
+     <property name="standardButtons">
+      <set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
+     </property>
+    </widget>
+   </item>
+  </layout>
+ </widget>
+ <resources/>
+ <connections>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>accepted()</signal>
+   <receiver>QgsSymbolLevelsV2DialogBase</receiver>
+   <slot>accept()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>248</x>
+     <y>254</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>157</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+  <connection>
+   <sender>buttonBox</sender>
+   <signal>rejected()</signal>
+   <receiver>QgsSymbolLevelsV2DialogBase</receiver>
+   <slot>reject()</slot>
+   <hints>
+    <hint type="sourcelabel">
+     <x>316</x>
+     <y>260</y>
+    </hint>
+    <hint type="destinationlabel">
+     <x>286</x>
+     <y>274</y>
+    </hint>
+   </hints>
+  </connection>
+ </connections>
+</ui>



More information about the QGIS-commit mailing list