Skip to content

Commit 2bd06b4

Browse files
author
wonder
committedNov 6, 2009
generic solution for legend symbology items
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11934 c8812cc2-4d05-0410-92ff-de0c093fc19c

13 files changed

+141
-63
lines changed
 

‎python/core/symbology-ng-core.sip

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11

22
typedef QList<QgsSymbolV2*> QgsSymbolV2List;
33

4+
typedef QList< QPair<QString, QPixmap> > QgsLegendSymbologyList;
5+
46
///////////////
57

68
/*
@@ -60,6 +62,15 @@ public:
6062
bool usingSymbolLevels() const;
6163
void setUsingSymbolLevels(bool usingSymbolLevels);
6264

65+
//! create a renderer from XML element
66+
static QgsFeatureRendererV2* load(QDomElement& symbologyElem);
67+
68+
//! store renderer info to XML element
69+
virtual QDomElement save(QDomDocument& doc);
70+
71+
//! return a list of symbology items for the legend
72+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
73+
6374
protected:
6475
QgsFeatureRendererV2(QString type);
6576

@@ -93,6 +104,16 @@ public:
93104
virtual QString dump();
94105

95106
virtual QgsFeatureRendererV2* clone() /Factory/;
107+
108+
//! create a renderer from XML element
109+
static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
110+
111+
//! store renderer info to XML element
112+
virtual QDomElement save(QDomDocument& doc);
113+
114+
//! return a list of symbology items for the legend
115+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
116+
96117
};
97118

98119
//////////
@@ -159,9 +180,24 @@ public:
159180
bool deleteCategory(int catIndex);
160181
void deleteAllCategories();
161182

183+
//! create a renderer from XML element
184+
static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
185+
186+
//! store renderer info to XML element
187+
virtual QDomElement save(QDomDocument& doc);
188+
189+
//! return a list of symbology items for the legend
190+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
191+
162192
QString classAttribute() const;
163193
void setClassAttribute(QString attr);
164194

195+
QgsSymbolV2* sourceSymbol();
196+
void setSourceSymbol(QgsSymbolV2* sym /Transfer/);
197+
198+
QgsVectorColorRampV2* sourceColorRamp();
199+
void setSourceColorRamp(QgsVectorColorRampV2* ramp /Transfer/);
200+
165201
protected:
166202

167203
QgsSymbolV2* symbolForValue(QVariant value);
@@ -244,6 +280,21 @@ public:
244280
QgsSymbolV2* symbol,
245281
QgsVectorColorRampV2* ramp);
246282

283+
//! create a renderer from XML element
284+
static QgsFeatureRendererV2* load(QDomElement& symbologyElem) /Factory/;
285+
286+
//! store renderer info to XML element
287+
virtual QDomElement save(QDomDocument& doc);
288+
289+
//! return a list of symbology items for the legend
290+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
291+
292+
QgsSymbolV2* sourceSymbol();
293+
void setSourceSymbol(QgsSymbolV2* sym /Transfer/);
294+
295+
QgsVectorColorRampV2* sourceColorRamp();
296+
void setSourceColorRamp(QgsVectorColorRampV2* ramp /Transfer/);
297+
247298
protected:
248299
QgsSymbolV2* symbolForValue(double value);
249300
};

‎src/app/legend/qgslegendlayer.cpp

Lines changed: 4 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ void QgsLegendLayer::vectorLayerSymbology( const QgsVectorLayer* layer, double w
369369
}
370370

371371
QPixmap pix = QPixmap::fromImage( img ); // convert to pixmap
372-
itemList.push_back( std::make_pair( values, pix ) );
372+
itemList.append( qMakePair( values, pix ) );
373373
}
374374

375375

@@ -388,80 +388,23 @@ void QgsLegendLayer::vectorLayerSymbology( const QgsVectorLayer* layer, double w
388388
{
389389
classfieldname = fields[*it].name();
390390
}
391-
itemList.push_front( std::make_pair( classfieldname, QPixmap() ) );
391+
itemList.append( qMakePair( classfieldname, QPixmap() ) );
392392
}
393393
}
394394
}
395395

396396
changeSymbologySettings( layer, itemList );
397397
}
398398

399-
static QPixmap _symbolPreviewPixmap(QgsSymbolV2* sym, QSize iconSize)
400-
{
401-
QPainter p;
402-
QPixmap pix(iconSize);
403-
pix.fill(Qt::white);
404-
p.begin(&pix);
405-
p.setRenderHint(QPainter::Antialiasing);
406-
sym->drawPreviewIcon(&p, iconSize);
407-
p.end();
408-
return pix;
409-
}
410399

411400
void QgsLegendLayer::vectorLayerSymbologyV2( QgsVectorLayer* layer )
412401
{
413-
SymbologyList itemList;
414-
415402
QSize iconSize(16,16);
416403

417404
QSettings settings;
418405
bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
419406

420-
QgsFeatureRendererV2* renderer = layer->rendererV2();
421-
QString rendererType = renderer->type();
422-
if (rendererType == "singleSymbol")
423-
{
424-
QgsSingleSymbolRendererV2* r = static_cast<QgsSingleSymbolRendererV2*>(renderer);
425-
QPixmap pix = _symbolPreviewPixmap(r->symbol(), iconSize);
426-
427-
itemList.push_back( std::make_pair( "", pix ) );
428-
}
429-
else if (rendererType == "categorizedSymbol")
430-
{
431-
QgsCategorizedSymbolRendererV2* r = static_cast<QgsCategorizedSymbolRendererV2*>(renderer);
432-
if (showClassifiers)
433-
{
434-
itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
435-
}
436-
437-
int count = r->categories().count();
438-
for (int i = 0; i < count; i++)
439-
{
440-
const QgsRendererCategoryV2& cat = r->categories()[i];
441-
QPixmap pix = _symbolPreviewPixmap( cat.symbol(), iconSize );
442-
itemList.push_back( std::make_pair( cat.label(), pix ) );
443-
}
444-
}
445-
else if (rendererType == "graduatedSymbol")
446-
{
447-
QgsGraduatedSymbolRendererV2* r = static_cast<QgsGraduatedSymbolRendererV2*>(renderer);
448-
if (showClassifiers)
449-
{
450-
itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
451-
}
452-
453-
int count = r->ranges().count();
454-
for (int i = 0; i < count; i++)
455-
{
456-
const QgsRendererRangeV2& range = r->ranges()[i];
457-
QPixmap pix = _symbolPreviewPixmap( range.symbol(), iconSize );
458-
itemList.push_back( std::make_pair( range.label(), pix ) );
459-
}
460-
}
461-
else
462-
{
463-
// nothing for unknown renderers
464-
}
407+
SymbologyList itemList = layer->rendererV2()->legendSymbologyItems(iconSize);
465408

466409
changeSymbologySettings( layer, itemList );
467410
}
@@ -470,7 +413,7 @@ void QgsLegendLayer::rasterLayerSymbology( QgsRasterLayer* layer )
470413
{
471414
SymbologyList itemList;
472415
QPixmap legendpixmap = layer->legendAsPixmap( true ).scaled( 20, 20, Qt::KeepAspectRatio );
473-
itemList.push_back( std::make_pair( "", legendpixmap ) );
416+
itemList.append( qMakePair( QString(), legendpixmap ) );
474417

475418
changeSymbologySettings( layer, itemList );
476419

‎src/app/legend/qgslegendlayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ class QgsVectorLayer;
3333

3434
class QTreeWidget;
3535

36-
typedef std::list< std::pair<QString, QPixmap> > SymbologyList;
36+
typedef QList< QPair<QString, QPixmap> > SymbologyList;
3737

3838
/**
3939
Container for layer, including layer file(s), symbology class breaks and properties

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <QDomDocument>
1212
#include <QDomElement>
13+
#include <QSettings> // for legend
1314

1415
QgsRendererCategoryV2::QgsRendererCategoryV2(QVariant value, QgsSymbolV2* symbol, QString label)
1516
: mValue(value), mSymbol(symbol), mLabel(label)
@@ -335,6 +336,28 @@ QDomElement QgsCategorizedSymbolRendererV2::save(QDomDocument& doc)
335336
return rendererElem;
336337
}
337338

339+
QgsLegendSymbologyList QgsCategorizedSymbolRendererV2::legendSymbologyItems(QSize iconSize)
340+
{
341+
QSettings settings;
342+
bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
343+
344+
QgsLegendSymbologyList lst;
345+
if (showClassifiers)
346+
{
347+
lst << qMakePair( classAttribute(), QPixmap() );
348+
}
349+
350+
int count = categories().count();
351+
for (int i = 0; i < count; i++)
352+
{
353+
const QgsRendererCategoryV2& cat = categories()[i];
354+
QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( cat.symbol(), iconSize );
355+
lst << qMakePair( cat.label(), pix );
356+
}
357+
return lst;
358+
}
359+
360+
338361
QgsSymbolV2* QgsCategorizedSymbolRendererV2::sourceSymbol()
339362
{
340363
return mSourceSymbol;

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,9 @@ class QgsCategorizedSymbolRendererV2 : public QgsFeatureRendererV2
7979
//! store renderer info to XML element
8080
virtual QDomElement save(QDomDocument& doc);
8181

82+
//! return a list of symbology items for the legend
83+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
84+
8285
QgsSymbolV2* sourceSymbol();
8386
void setSourceSymbol(QgsSymbolV2* sym);
8487

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
#include <QDomDocument>
1212
#include <QDomElement>
13+
#include <QSettings> // for legend
1314

1415
QgsRendererRangeV2::QgsRendererRangeV2(double lowerValue, double upperValue, QgsSymbolV2* symbol, QString label)
1516
: mLowerValue(lowerValue), mUpperValue(upperValue), mSymbol(symbol), mLabel(label)
@@ -432,6 +433,27 @@ QDomElement QgsGraduatedSymbolRendererV2::save(QDomDocument& doc)
432433
return rendererElem;
433434
}
434435

436+
QgsLegendSymbologyList QgsGraduatedSymbolRendererV2::legendSymbologyItems(QSize iconSize)
437+
{
438+
QSettings settings;
439+
bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
440+
441+
QgsLegendSymbologyList lst;
442+
if (showClassifiers)
443+
{
444+
lst << qMakePair( classAttribute(), QPixmap() );
445+
}
446+
447+
int count = ranges().count();
448+
for (int i = 0; i < count; i++)
449+
{
450+
const QgsRendererRangeV2& range = ranges()[i];
451+
QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap( range.symbol(), iconSize );
452+
lst << qMakePair( range.label(), pix );
453+
}
454+
return lst;
455+
}
456+
435457
QgsSymbolV2* QgsGraduatedSymbolRendererV2::sourceSymbol()
436458
{
437459
return mSourceSymbol;

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -87,6 +87,9 @@ class QgsGraduatedSymbolRendererV2 : public QgsFeatureRendererV2
8787
//! store renderer info to XML element
8888
virtual QDomElement save(QDomDocument& doc);
8989

90+
//! return a list of symbology items for the legend
91+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
92+
9093
QgsSymbolV2* sourceSymbol();
9194
void setSourceSymbol(QgsSymbolV2* sym);
9295

‎src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -281,6 +281,13 @@ QDomElement QgsFeatureRendererV2::save(QDomDocument& doc)
281281
return doc.createElement(RENDERER_TAG_NAME);
282282
}
283283

284+
QgsLegendSymbologyList QgsFeatureRendererV2::legendSymbologyItems(QSize iconSize)
285+
{
286+
// empty list by default
287+
return QgsLegendSymbologyList();
288+
}
289+
290+
284291
int QgsFeatureRendererV2::fieldNameIndex( const QgsFieldMap& fields, const QString& fieldName )
285292
{
286293
for ( QgsFieldMap::const_iterator it = fields.constBegin(); it != fields.constEnd(); ++it )

‎src/core/symbology-ng/qgsrendererv2.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@
88
#include <QList>
99
#include <QString>
1010
#include <QVariant>
11+
#include <QPair>
12+
#include <QPixmap>
1113

1214
class QDomDocument;
1315
class QDomElement;
@@ -19,6 +21,8 @@ class QgsFeature;
1921
typedef QList<QgsSymbolV2*> QgsSymbolV2List;
2022
typedef QMap<QString, QgsSymbolV2* > QgsSymbolV2Map;
2123

24+
typedef QList< QPair<QString, QPixmap> > QgsLegendSymbologyList;
25+
2226
#define RENDERER_TAG_NAME "renderer-v2"
2327

2428
////////
@@ -84,6 +88,9 @@ class QgsFeatureRendererV2
8488

8589
//! store renderer info to XML element
8690
virtual QDomElement save(QDomDocument& doc);
91+
92+
//! return a list of symbology items for the legend
93+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
8794

8895
/** Returns the index of a field name or -1 if the field does not exist
8996
* copied from QgsVectorDataProvider... d'oh... probably should be elsewhere

‎src/core/symbology-ng/qgssinglesymbolrendererv2.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,3 +100,12 @@ QDomElement QgsSingleSymbolRendererV2::save(QDomDocument& doc)
100100

101101
return rendererElem;
102102
}
103+
104+
QgsLegendSymbologyList QgsSingleSymbolRendererV2::legendSymbologyItems(QSize iconSize)
105+
{
106+
QPixmap pix = QgsSymbolLayerV2Utils::symbolPreviewPixmap(mSymbol, iconSize);
107+
108+
QgsLegendSymbologyList lst;
109+
lst << qMakePair( QString(), pix );
110+
return lst;
111+
}

‎src/core/symbology-ng/qgssinglesymbolrendererv2.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,9 @@ class QgsSingleSymbolRendererV2 : public QgsFeatureRendererV2
3434
//! store renderer info to XML element
3535
virtual QDomElement save(QDomDocument& doc);
3636

37+
//! return a list of symbology items for the legend
38+
virtual QgsLegendSymbologyList legendSymbologyItems(QSize iconSize);
39+
3740
protected:
3841
QgsSymbolV2* mSymbol;
3942
};

‎src/core/symbology-ng/qgssymbollayerv2utils.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,11 @@ QPointF QgsSymbolLayerV2Utils::decodePoint(QString str)
145145
}
146146

147147
QIcon QgsSymbolLayerV2Utils::symbolPreviewIcon(QgsSymbolV2* symbol, QSize size)
148+
{
149+
return QIcon(symbolPreviewPixmap(symbol, size));
150+
}
151+
152+
QPixmap QgsSymbolLayerV2Utils::symbolPreviewPixmap(QgsSymbolV2* symbol, QSize size)
148153
{
149154
QPixmap pixmap(size);
150155
QPainter painter;
@@ -153,9 +158,10 @@ QIcon QgsSymbolLayerV2Utils::symbolPreviewIcon(QgsSymbolV2* symbol, QSize size)
153158
painter.eraseRect(QRect(QPoint(0,0),size));
154159
symbol->drawPreviewIcon(&painter, size);
155160
painter.end();
156-
return QIcon(pixmap);
161+
return pixmap;
157162
}
158163

164+
159165
QIcon QgsSymbolLayerV2Utils::symbolLayerPreviewIcon(QgsSymbolLayerV2* layer, QSize size)
160166
{
161167
QPixmap pixmap(size);

‎src/core/symbology-ng/qgssymbollayerv2utils.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@ class QgsSymbolLayerV2Utils
4747
static QIcon symbolLayerPreviewIcon(QgsSymbolLayerV2* layer, QSize size);
4848
static QIcon colorRampPreviewIcon(QgsVectorColorRampV2* ramp, QSize size);
4949

50+
static QPixmap symbolPreviewPixmap(QgsSymbolV2* symbol, QSize size);
5051
static QPixmap colorRampPreviewPixmap(QgsVectorColorRampV2* ramp, QSize size);
5152

5253
static QgsSymbolV2* loadSymbol(QDomElement& element);

0 commit comments

Comments
 (0)
Please sign in to comment.