Skip to content

Commit 910d9e8

Browse files
author
wonder
committedNov 6, 2009
Added renderer registry to allow custom renderers. GUI for renderers is still hardcoded.
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11932 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent d34fb39 commit 910d9e8

11 files changed

+229
-182
lines changed
 

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

Lines changed: 2 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -34,18 +34,10 @@ class QgsFeatureRendererV2
3434

3535
public:
3636

37-
enum RendererType
38-
{
39-
RendererSingleSymbol,
40-
RendererCategorizedSymbol,
41-
RendererGraduatedSymbol
42-
// TODO: user type?
43-
};
44-
4537
//! return a new renderer - used by default in vector layers
4638
static QgsFeatureRendererV2* defaultRenderer(QGis::GeometryType geomType) /Factory/;
4739

48-
RendererType type() const;
40+
QString type() const;
4941

5042
virtual QgsSymbolV2* symbolForFeature(QgsFeature& feature)=0;
5143

@@ -69,7 +61,7 @@ public:
6961
void setUsingSymbolLevels(bool usingSymbolLevels);
7062

7163
protected:
72-
QgsFeatureRendererV2(RendererType type);
64+
QgsFeatureRendererV2(QString type);
7365

7466
};
7567

‎src/app/legend/qgslegendlayer.cpp

Lines changed: 40 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -402,6 +402,7 @@ static QPixmap _symbolPreviewPixmap(QgsSymbolV2* sym, QSize iconSize)
402402
QPixmap pix(iconSize);
403403
pix.fill(Qt::white);
404404
p.begin(&pix);
405+
p.setRenderHint(QPainter::Antialiasing);
405406
sym->drawPreviewIcon(&p, iconSize);
406407
p.end();
407408
return pix;
@@ -417,53 +418,49 @@ void QgsLegendLayer::vectorLayerSymbologyV2( QgsVectorLayer* layer )
417418
bool showClassifiers = settings.value( "/qgis/showLegendClassifiers", false ).toBool();
418419

419420
QgsFeatureRendererV2* renderer = layer->rendererV2();
420-
switch (renderer->type())
421+
QString rendererType = renderer->type();
422+
if (rendererType == "singleSymbol")
421423
{
422-
case QgsFeatureRendererV2::RendererSingleSymbol:
423-
{
424-
QgsSingleSymbolRendererV2* r = static_cast<QgsSingleSymbolRendererV2*>(renderer);
425-
QPixmap pix = _symbolPreviewPixmap(r->symbol(), iconSize);
424+
QgsSingleSymbolRendererV2* r = static_cast<QgsSingleSymbolRendererV2*>(renderer);
425+
QPixmap pix = _symbolPreviewPixmap(r->symbol(), iconSize);
426426

427-
itemList.push_back( std::make_pair( "", pix ) );
428-
}
429-
break;
430-
case QgsFeatureRendererV2::RendererCategorizedSymbol:
431-
{
432-
QgsCategorizedSymbolRendererV2* r = static_cast<QgsCategorizedSymbolRendererV2*>(renderer);
433-
if (showClassifiers)
434-
{
435-
itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
436-
}
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+
}
437436

438-
int count = r->categories().count();
439-
for (int i = 0; i < count; i++)
440-
{
441-
const QgsRendererCategoryV2& cat = r->categories()[i];
442-
QPixmap pix = _symbolPreviewPixmap( cat.symbol(), iconSize );
443-
itemList.push_back( std::make_pair( cat.label(), pix ) );
444-
}
445-
}
446-
break;
447-
case QgsFeatureRendererV2::RendererGraduatedSymbol:
448-
{
449-
QgsGraduatedSymbolRendererV2* r = static_cast<QgsGraduatedSymbolRendererV2*>(renderer);
450-
if (showClassifiers)
451-
{
452-
itemList.push_back( std::make_pair( r->classAttribute(), QPixmap() ) );
453-
}
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+
}
454452

455-
int count = r->ranges().count();
456-
for (int i = 0; i < count; i++)
457-
{
458-
const QgsRendererRangeV2& range = r->ranges()[i];
459-
QPixmap pix = _symbolPreviewPixmap( range.symbol(), iconSize );
460-
itemList.push_back( std::make_pair( range.label(), pix ) );
461-
}
462-
}
463-
break;
464-
default:
465-
// nothing for unknown renderers
466-
break;
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
467464
}
468465

469466
changeSymbologySettings( layer, itemList );

‎src/core/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ SET(QGIS_CORE_SRCS
1313
symbology-ng/qgsmarkersymbollayerv2.cpp
1414
symbology-ng/qgsfillsymbollayerv2.cpp
1515
symbology-ng/qgsrendererv2.cpp
16+
symbology-ng/qgsrendererv2registry.cpp
1617
symbology-ng/qgssinglesymbolrendererv2.cpp
1718
symbology-ng/qgscategorizedsymbolrendererv2.cpp
1819
symbology-ng/qgsgraduatedsymbolrendererv2.cpp

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ QString QgsRendererCategoryV2::dump()
6464
///////////////////
6565

6666
QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2(QString attrName, QgsCategoryList categories)
67-
: QgsFeatureRendererV2(RendererCategorizedSymbol),
67+
: QgsFeatureRendererV2("categorizedSymbol"),
6868
mAttrName(attrName),
6969
mCategories(categories),
7070
mSourceSymbol(NULL),

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ QString QgsRendererRangeV2::dump()
6969

7070

7171
QgsGraduatedSymbolRendererV2::QgsGraduatedSymbolRendererV2(QString attrName, QgsRangeList ranges)
72-
: QgsFeatureRendererV2(RendererGraduatedSymbol),
72+
: QgsFeatureRendererV2("graduatedSymbol"),
7373
mAttrName(attrName),
7474
mRanges(ranges),
7575
mMode(Custom),

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

Lines changed: 8 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -5,9 +5,7 @@
55

66
#include "qgssinglesymbolrendererv2.h" // for default renderer
77

8-
// TODO: to be removed once renderer registry is in place
9-
#include "qgscategorizedsymbolrendererv2.h"
10-
#include "qgsgraduatedsymbolrendererv2.h"
8+
#include "qgsrendererv2registry.h"
119

1210
#include "qgsrendercontext.h"
1311
#include "qgsgeometry.h"
@@ -121,7 +119,7 @@ static unsigned char* _getPolygon(QPolygonF& pts, QList<QPolygonF>& holes, const
121119
}
122120

123121

124-
QgsFeatureRendererV2::QgsFeatureRendererV2(RendererType type)
122+
QgsFeatureRendererV2::QgsFeatureRendererV2(QString type)
125123
: mType(type), mUsingSymbolLevels(false)
126124
{
127125
}
@@ -268,22 +266,13 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::load(QDomElement& element)
268266
// load renderer
269267
QString rendererType = element.attribute("type");
270268

271-
// TODO: use renderer registry
272-
if (rendererType == "singleSymbol")
273-
{
274-
return QgsSingleSymbolRendererV2::create(element);
275-
}
276-
else if (rendererType == "categorizedSymbol")
277-
{
278-
return QgsCategorizedSymbolRendererV2::create(element);
279-
}
280-
else if (rendererType == "graduatedSymbol")
281-
{
282-
return QgsGraduatedSymbolRendererV2::create(element);
283-
}
269+
QgsRendererV2CreateFunc pfCreate = QgsRendererV2Registry::instance()->rendererCreateFunction(rendererType);
270+
271+
// unknown renderer type?
272+
if (pfCreate == NULL)
273+
return NULL;
284274

285-
// unknown renderer type
286-
return NULL;
275+
return pfCreate(element);
287276
}
288277

289278
QDomElement QgsFeatureRendererV2::save(QDomDocument& doc)

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

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -50,18 +50,10 @@ class QgsFeatureRendererV2
5050
public:
5151
// renderer takes ownership of its symbols!
5252

53-
enum RendererType
54-
{
55-
RendererSingleSymbol,
56-
RendererCategorizedSymbol,
57-
RendererGraduatedSymbol
58-
// TODO: user type?
59-
};
60-
6153
//! return a new renderer - used by default in vector layers
6254
static QgsFeatureRendererV2* defaultRenderer(QGis::GeometryType geomType);
6355

64-
RendererType type() const { return mType; }
56+
QString type() const { return mType; }
6557

6658
// to be overridden
6759
virtual QgsSymbolV2* symbolForFeature(QgsFeature& feature)=0;
@@ -100,9 +92,9 @@ class QgsFeatureRendererV2
10092

10193

10294
protected:
103-
QgsFeatureRendererV2(RendererType type);
95+
QgsFeatureRendererV2(QString type);
10496

105-
RendererType mType;
97+
QString mType;
10698

10799
bool mUsingSymbolLevels;
108100
};
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
#include "qgsrendererv2registry.h"
2+
3+
// default renderers
4+
#include "qgssinglesymbolrendererv2.h"
5+
#include "qgscategorizedsymbolrendererv2.h"
6+
#include "qgsgraduatedsymbolrendererv2.h"
7+
8+
9+
QgsRendererV2Registry* QgsRendererV2Registry::mInstance = NULL;
10+
11+
QgsRendererV2Registry::QgsRendererV2Registry()
12+
{
13+
// add default renderers
14+
addRenderer("singleSymbol", QgsSingleSymbolRendererV2::create);
15+
addRenderer("categorizedSymbol", QgsCategorizedSymbolRendererV2::create);
16+
addRenderer("graduatedSymbol", QgsGraduatedSymbolRendererV2::create);
17+
}
18+
19+
QgsRendererV2Registry* QgsRendererV2Registry::instance()
20+
{
21+
if (!mInstance)
22+
mInstance = new QgsRendererV2Registry();
23+
24+
return mInstance;
25+
}
26+
27+
28+
bool QgsRendererV2Registry::addRenderer(QString rendererName, QgsRendererV2CreateFunc pfCreate)
29+
{
30+
if (mRenderers.contains(rendererName))
31+
return false;
32+
mRenderers.insert(rendererName, pfCreate);
33+
return true;
34+
}
35+
36+
bool QgsRendererV2Registry::removeRenderer(QString rendererName)
37+
{
38+
if (!mRenderers.contains(rendererName))
39+
return false;
40+
mRenderers.remove(rendererName);
41+
return true;
42+
}
43+
44+
QgsRendererV2CreateFunc QgsRendererV2Registry::rendererCreateFunction(QString rendererName)
45+
{
46+
return mRenderers.value(rendererName, NULL);
47+
}
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
#ifndef QGSRENDERERV2REGISTRY_H
2+
#define QGSRENDERERV2REGISTRY_H
3+
4+
#include <QMap>
5+
6+
class QgsFeatureRendererV2;
7+
class QDomElement;
8+
9+
typedef QgsFeatureRendererV2* (*QgsRendererV2CreateFunc)(QDomElement&);
10+
11+
/**
12+
Registry of renderers.
13+
14+
This is a singleton, renderers can be added / removed at any time
15+
*/
16+
class QgsRendererV2Registry
17+
{
18+
public:
19+
20+
static QgsRendererV2Registry* instance();
21+
22+
bool addRenderer(QString rendererName, QgsRendererV2CreateFunc pfCreate);
23+
24+
bool removeRenderer(QString rendererName);
25+
26+
QgsRendererV2CreateFunc rendererCreateFunction(QString rendererName);
27+
28+
protected:
29+
//! protected constructor
30+
QgsRendererV2Registry();
31+
32+
static QgsRendererV2Registry* mInstance;
33+
34+
QMap<QString, QgsRendererV2CreateFunc> mRenderers;
35+
};
36+
37+
#endif // QGSRENDERERV2REGISTRY_H

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
#include <QDomElement>
99

1010
QgsSingleSymbolRendererV2::QgsSingleSymbolRendererV2(QgsSymbolV2* symbol)
11-
: QgsFeatureRendererV2(RendererSingleSymbol)
11+
: QgsFeatureRendererV2("singleSymbol")
1212
{
1313
mSymbol = symbol;
1414
}

0 commit comments

Comments
 (0)