Skip to content

Commit da2894a

Browse files
author
wonder
committed
Slightly reworked the internal working of symbol levels. Fixes some problems with symbol levels handling.
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11151 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 1e8cd68 commit da2894a

9 files changed

+61
-86
lines changed

python/core/symbology-ng-core.sip

+7-3
Original file line numberDiff line numberDiff line change
@@ -61,8 +61,8 @@ public:
6161

6262
void renderFeature(QgsFeature& feature, QgsRenderContext& context, int layer = -1);
6363

64-
QgsSymbolV2LevelOrder& symbolLevels();
65-
void setSymbolLevels(const QgsSymbolV2LevelOrder& levelOrder);
64+
bool usingSymbolLevels() const;
65+
void setUsingSymbolLevels(bool usingSymbolLevels);
6666

6767
protected:
6868
QgsFeatureRendererV2(RendererType type);
@@ -296,7 +296,11 @@ public:
296296

297297
void setLocked(bool locked);
298298
bool isLocked() const;
299-
299+
300+
// used only with rending with symbol levels is turned on (0 = first pass, 1 = second, ...)
301+
void setRenderingPass(int renderingPass);
302+
int renderingPass() const;
303+
300304
protected:
301305
QgsSymbolLayerV2(QgsSymbolV2::SymbolType type, bool locked = false);
302306

src/core/qgsvectorlayer.cpp

+21-4
Original file line numberDiff line numberDiff line change
@@ -73,6 +73,8 @@
7373
#include "qgsmaplayerregistry.h"
7474

7575
#include "qgsrendererv2.h"
76+
#include "qgssymbolv2.h"
77+
#include "qgssymbollayerv2.h"
7678

7779
#ifdef Q_WS_X11
7880
#include "qgsclipper.h"
@@ -706,8 +708,23 @@ void QgsVectorLayer::drawRendererV2Levels( QgsRenderContext& rendererContext, bo
706708
mLabelingRegisterFeatureHook(fet, mLabelingLayerContext);
707709
}
708710

711+
// find out the order
712+
QgsSymbolV2LevelOrder levels;
713+
QgsSymbolV2List symbols = mRendererV2->symbols();
714+
for (int i = 0; i < symbols.count(); i++)
715+
{
716+
QgsSymbolV2* sym = symbols[i];
717+
for (int j = 0; j < sym->symbolLayerCount(); j++)
718+
{
719+
int level = sym->symbolLayer(j)->renderingPass();
720+
QgsSymbolV2LevelItem item(sym,j);
721+
while (level >= levels.count()) // append new empty levels
722+
levels.append( QgsSymbolV2Level() );
723+
levels[level].append(item);
724+
}
725+
}
726+
709727
// 2. draw features in correct order
710-
QgsSymbolV2LevelOrder& levels = mRendererV2->symbolLevels();
711728
for (int l = 0; l < levels.count(); l++)
712729
{
713730
QgsSymbolV2Level& level = levels[l];
@@ -762,10 +779,10 @@ bool QgsVectorLayer::draw( QgsRenderContext& rendererContext )
762779

763780
select( attributes, rendererContext.extent() );
764781

765-
if (mRendererV2->symbolLevels().isEmpty())
766-
drawRendererV2(rendererContext, labeling);
767-
else
782+
if (mRendererV2->usingSymbolLevels())
768783
drawRendererV2Levels(rendererContext, labeling);
784+
else
785+
drawRendererV2(rendererContext, labeling);
769786

770787
return TRUE;
771788
}

src/core/symbology-ng/qgsrendererv2.cpp

+4-4
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ static unsigned char* _getPolygon(QPolygonF& pts, QList<QPolygonF>& holes, const
111111

112112

113113
QgsFeatureRendererV2::QgsFeatureRendererV2(RendererType type)
114-
: mType(type)
114+
: mType(type), mUsingSymbolLevels(false)
115115
{
116116
}
117117

@@ -294,7 +294,7 @@ QString QgsSingleSymbolRendererV2::dump()
294294
QgsFeatureRendererV2* QgsSingleSymbolRendererV2::clone()
295295
{
296296
QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( mSymbol->clone() );
297-
r->setSymbolLevels( symbolLevels() );
297+
r->setUsingSymbolLevels( usingSymbolLevels() );
298298
return r;
299299
}
300300

@@ -496,7 +496,7 @@ QString QgsCategorizedSymbolRendererV2::dump()
496496
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
497497
{
498498
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrNum, mCategories );
499-
r->setSymbolLevels( symbolLevels() );
499+
r->setUsingSymbolLevels( usingSymbolLevels() );
500500
return r;
501501
}
502502

@@ -654,7 +654,7 @@ QString QgsGraduatedSymbolRendererV2::dump()
654654
QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::clone()
655655
{
656656
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2( mAttrNum, mRanges );
657-
r->setSymbolLevels( symbolLevels() );
657+
r->setUsingSymbolLevels( usingSymbolLevels() );
658658
return r;
659659
}
660660

src/core/symbology-ng/qgsrendererv2.h

+3-3
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ class QgsFeatureRendererV2
7373
//! for symbol levels
7474
virtual QgsSymbolV2List symbols()=0;
7575

76-
QgsSymbolV2LevelOrder& symbolLevels() { return mLevelOrder; }
77-
void setSymbolLevels(const QgsSymbolV2LevelOrder& levelOrder) { mLevelOrder = levelOrder; }
76+
bool usingSymbolLevels() const { return mUsingSymbolLevels; }
77+
void setUsingSymbolLevels(bool usingSymbolLevels) { mUsingSymbolLevels = usingSymbolLevels; }
7878

7979
protected:
8080
QgsFeatureRendererV2(RendererType type);
8181

8282
RendererType mType;
8383

84-
QgsSymbolV2LevelOrder mLevelOrder;
84+
bool mUsingSymbolLevels;
8585
};
8686

8787
class QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2

src/core/symbology-ng/qgssymbollayerv2.h

+7-1
Original file line numberDiff line numberDiff line change
@@ -49,13 +49,19 @@ class QgsSymbolLayerV2
4949

5050
void setLocked(bool locked) { mLocked = locked; }
5151
bool isLocked() const { return mLocked; }
52+
53+
// used only with rending with symbol levels is turned on (0 = first pass, 1 = second, ...)
54+
void setRenderingPass(int renderingPass) { mRenderingPass = renderingPass; }
55+
int renderingPass() const { return mRenderingPass; }
5256

5357
protected:
54-
QgsSymbolLayerV2(QgsSymbolV2::SymbolType type, bool locked = false) : mType(type), mLocked(locked) {}
58+
QgsSymbolLayerV2(QgsSymbolV2::SymbolType type, bool locked = false)
59+
: mType(type), mLocked(locked), mRenderingPass(0) {}
5560

5661
QgsSymbolV2::SymbolType mType;
5762
bool mLocked;
5863
QColor mColor;
64+
int mRenderingPass;
5965
};
6066

6167
//////////////////////

src/core/symbology-ng/qgssymbolv2.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -216,6 +216,7 @@ QgsSymbolLayerV2List QgsSymbolV2::cloneLayers() const
216216
{
217217
QgsSymbolLayerV2* layer = (*it)->clone();
218218
layer->setLocked( (*it)->isLocked() );
219+
layer->setRenderingPass( (*it)->renderingPass() );
219220
lst.append( layer );
220221
}
221222
return lst;

src/gui/symbology-ng/qgsrendererv2propertiesdialog.cpp

+2-2
Original file line numberDiff line numberDiff line change
@@ -550,9 +550,9 @@ void QgsRendererV2PropertiesDialog::symbolLevels()
550550
{
551551
QgsSymbolV2List symbols = mRenderer->symbols();
552552

553-
QgsSymbolLevelsV2Dialog dlg(symbols, mRenderer->symbolLevels(), this);
553+
QgsSymbolLevelsV2Dialog dlg(symbols, mRenderer->usingSymbolLevels(), this);
554554
if (dlg.exec())
555555
{
556-
mRenderer->setSymbolLevels( dlg.levels() );
556+
mRenderer->setUsingSymbolLevels( dlg.usingLevels() );
557557
}
558558
}

src/gui/symbology-ng/qgssymbollevelsv2dialog.cpp

+14-64
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,17 @@
22
#include "qgssymbollevelsv2dialog.h"
33

44
#include "qgssymbollayerv2utils.h"
5+
#include "qgssymbollayerv2.h"
56
#include "qgssymbolv2.h"
67

78
#include <QTableWidgetItem>
89

9-
QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, QgsSymbolV2LevelOrder levels, QWidget* parent)
10-
: QDialog(parent), mSymbols(symbols), mLevels(levels)
10+
QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, bool usingSymbolLevels, QWidget* parent)
11+
: QDialog(parent), mSymbols(symbols)
1112
{
1213
setupUi(this);
1314

14-
chkEnable->setChecked( !levels.isEmpty() );
15+
chkEnable->setChecked( usingSymbolLevels );
1516

1617
connect(chkEnable, SIGNAL(clicked()), this, SLOT(updateUi()));
1718

@@ -42,17 +43,14 @@ QgsSymbolLevelsV2Dialog::QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, QgsSym
4243

4344
updateUi();
4445

45-
connect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
46+
if (!usingSymbolLevels)
47+
setDefaultLevels();
48+
4649
populateTable();
4750
}
4851

4952
void QgsSymbolLevelsV2Dialog::populateTable()
5053
{
51-
if (mLevels.isEmpty())
52-
return;
53-
54-
disconnect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
55-
5654
for (int row = 0; row < mSymbols.count(); row++)
5755
{
5856
QgsSymbolV2* sym = mSymbols[row];
@@ -66,81 +64,33 @@ void QgsSymbolLevelsV2Dialog::populateTable()
6664
}
6765
else
6866
{
69-
item = new QTableWidgetItem( QString::number(levelForSymbolLayer(sym, layer)) );
67+
item = new QTableWidgetItem( QString::number( sym->symbolLayer(layer)->renderingPass() ) );
7068
}
7169
tableLevels->setItem(row, layer, item);
7270
}
7371
}
7472

75-
connect(tableLevels, SIGNAL(itemChanged(QTableWidgetItem*)), this, SLOT(updateLevels(QTableWidgetItem*)));
76-
7773
}
7874

7975
void QgsSymbolLevelsV2Dialog::updateUi()
8076
{
81-
if (chkEnable->isChecked())
82-
{
83-
if (mLevels.isEmpty())
84-
setDefaultLevels();
85-
populateTable();
86-
}
87-
else
88-
mLevels.clear();
89-
9077
tableLevels->setEnabled(chkEnable->isChecked());
9178
}
9279

9380
void QgsSymbolLevelsV2Dialog::setDefaultLevels()
9481
{
95-
mLevels.clear();
96-
for (int col = 0; col < tableLevels->columnCount(); col++)
82+
for (int i = 0; i < mSymbols.count(); i++)
9783
{
98-
QgsSymbolV2Level level;
99-
for (int i = 0; i < mSymbols.count(); i++)
84+
QgsSymbolV2* sym = mSymbols[i];
85+
for (int layer = 0; layer < sym->symbolLayerCount(); layer++)
10086
{
101-
QgsSymbolV2* sym = mSymbols[i];
102-
if (col < sym->symbolLayerCount())
103-
level.append(QgsSymbolV2LevelItem(sym, col));
87+
sym->symbolLayer(layer)->setRenderingPass(layer);
10488
}
105-
mLevels.append(level);
10689
}
10790
}
10891

109-
int QgsSymbolLevelsV2Dialog::levelForSymbolLayer(QgsSymbolV2* sym, int layer)
110-
{
111-
for (int l = 0; l < mLevels.count(); l++)
112-
{
113-
QgsSymbolV2Level& level = mLevels[l];
114-
for (int i = 0; i < level.count(); i++)
115-
{
116-
QgsSymbolV2LevelItem& item = level[i];
117-
if (item.symbol() == sym && item.layer() == layer)
118-
return l;
119-
}
120-
}
121-
return -1;
122-
}
12392

124-
void QgsSymbolLevelsV2Dialog::updateLevels(QTableWidgetItem* item)
93+
bool QgsSymbolLevelsV2Dialog::usingLevels() const
12594
{
126-
int num = item->text().toInt();
127-
if (num > 100)
128-
{
129-
item->setText("0");
130-
return;
131-
}
132-
133-
mLevels.clear();
134-
for (int col = 0; col < tableLevels->columnCount(); col++)
135-
{
136-
for (int row = 0; row < mSymbols.count(); row++)
137-
{
138-
QgsSymbolV2* sym = mSymbols[row];
139-
int level = tableLevels->item(row,col)->text().toInt();
140-
QgsSymbolV2LevelItem item(sym,col);
141-
while (level >= mLevels.count()) // append new empty levels
142-
mLevels.append( QgsSymbolV2Level() );
143-
mLevels[level].append(item);
144-
}
145-
}
95+
return chkEnable->isChecked();
14696
}

src/gui/symbology-ng/qgssymbollevelsv2dialog.h

+2-5
Original file line numberDiff line numberDiff line change
@@ -13,24 +13,21 @@ class QgsSymbolLevelsV2Dialog : public QDialog, private Ui::QgsSymbolLevelsV2Dia
1313
{
1414
Q_OBJECT
1515
public:
16-
QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, QgsSymbolV2LevelOrder levels, QWidget* parent = NULL);
16+
QgsSymbolLevelsV2Dialog(QgsSymbolV2List symbols, bool usingSymbolLevels, QWidget* parent = NULL);
1717

18-
QgsSymbolV2LevelOrder& levels() { return mLevels; }
18+
bool usingLevels() const;
1919

2020
public slots:
2121
void updateUi();
22-
void updateLevels(QTableWidgetItem* item);
2322

2423
protected:
2524
void populateTable();
2625
void setDefaultLevels();
27-
int levelForSymbolLayer(QgsSymbolV2* sym, int layer);
2826

2927
protected:
3028
//! maximal number of layers from all symbols
3129
int mMaxLayers;
3230
QgsSymbolV2List mSymbols;
33-
QgsSymbolV2LevelOrder mLevels;
3431
};
3532

3633
#endif // QGSSYMBOLLEVELSV2DIALOG_H

0 commit comments

Comments
 (0)