[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