Skip to content

Commit 4654732

Browse files
author
wonder
committedNov 3, 2009
split code of renderers into several files
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11909 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent ef9190d commit 4654732

12 files changed

+1014
-955
lines changed
 

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

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -78,7 +78,7 @@ protected:
7878
class QgsSingleSymbolRendererV2 : QgsFeatureRendererV2
7979
{
8080
%TypeHeaderCode
81-
#include <qgsrendererv2.h>
81+
#include <qgssinglesymbolrendererv2.h>
8282
%End
8383

8484
public:
@@ -108,7 +108,7 @@ public:
108108
class QgsRendererCategoryV2
109109
{
110110
%TypeHeaderCode
111-
#include <qgsrendererv2.h>
111+
#include <qgscategorizedsymbolrendererv2.h>
112112
%End
113113

114114
public:
@@ -135,7 +135,7 @@ typedef QList<QgsRendererCategoryV2> QgsCategoryList;
135135
class QgsCategorizedSymbolRendererV2 : QgsFeatureRendererV2
136136
{
137137
%TypeHeaderCode
138-
#include <qgsrendererv2.h>
138+
#include <qgscategorizedsymbolrendererv2.h>
139139
%End
140140

141141
public:
@@ -180,7 +180,7 @@ protected:
180180
class QgsRendererRangeV2
181181
{
182182
%TypeHeaderCode
183-
#include <qgsrendererv2.h>
183+
#include <qgsgraduatedsymbolrendererv2.h>
184184
%End
185185

186186
public:
@@ -206,7 +206,7 @@ typedef QList<QgsRendererRangeV2> QgsRangeList;
206206
class QgsGraduatedSymbolRendererV2 : QgsFeatureRendererV2
207207
{
208208
%TypeHeaderCode
209-
#include <qgsrendererv2.h>
209+
#include <qgsgraduatedsymbolrendererv2.h>
210210
%End
211211

212212
public:

‎src/app/legend/qgslegendlayer.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@
3939
#include "qgsrendererv2.h"
4040
#include "qgssymbolv2.h"
4141

42+
#include "qgssinglesymbolrendererv2.h"
43+
#include "qgscategorizedsymbolrendererv2.h"
44+
#include "qgsgraduatedsymbolrendererv2.h"
45+
4246
#include <iostream>
4347
#include <QAction>
4448
#include <QCoreApplication>

‎src/core/CMakeLists.txt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,9 @@ SET(QGIS_CORE_SRCS
1313
symbology-ng/qgsmarkersymbollayerv2.cpp
1414
symbology-ng/qgsfillsymbollayerv2.cpp
1515
symbology-ng/qgsrendererv2.cpp
16+
symbology-ng/qgssinglesymbolrendererv2.cpp
17+
symbology-ng/qgscategorizedsymbolrendererv2.cpp
18+
symbology-ng/qgsgraduatedsymbolrendererv2.cpp
1619
symbology-ng/qgsvectorcolorrampv2.cpp
1720
symbology-ng/qgsstylev2.cpp
1821

Lines changed: 290 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,290 @@
1+
2+
#include "qgscategorizedsymbolrendererv2.h"
3+
4+
#include "qgssymbolv2.h"
5+
#include "qgssymbollayerv2utils.h"
6+
7+
#include "qgsfeature.h"
8+
#include "qgslogger.h"
9+
10+
#include <QDomDocument>
11+
#include <QDomElement>
12+
13+
QgsRendererCategoryV2::QgsRendererCategoryV2(QVariant value, QgsSymbolV2* symbol, QString label)
14+
: mValue(value), mSymbol(symbol), mLabel(label)
15+
{
16+
}
17+
18+
QgsRendererCategoryV2::QgsRendererCategoryV2(const QgsRendererCategoryV2& cat)
19+
: mValue(cat.mValue), mLabel(cat.mLabel)
20+
{
21+
mSymbol = cat.mSymbol->clone();
22+
}
23+
24+
25+
QgsRendererCategoryV2::~QgsRendererCategoryV2()
26+
{
27+
delete mSymbol;
28+
}
29+
30+
QVariant QgsRendererCategoryV2::value() const
31+
{
32+
return mValue;
33+
}
34+
35+
QgsSymbolV2* QgsRendererCategoryV2::symbol() const
36+
{
37+
return mSymbol;
38+
}
39+
40+
QString QgsRendererCategoryV2::label() const
41+
{
42+
return mLabel;
43+
}
44+
45+
void QgsRendererCategoryV2::setSymbol(QgsSymbolV2* s)
46+
{
47+
if (mSymbol == s)
48+
return;
49+
delete mSymbol;
50+
mSymbol = s;
51+
}
52+
53+
void QgsRendererCategoryV2::setLabel(QString label)
54+
{
55+
mLabel = label;
56+
}
57+
58+
QString QgsRendererCategoryV2::dump()
59+
{
60+
return QString("%1::%2::%3\n").arg(mValue.toString()).arg(mLabel).arg(mSymbol->dump());
61+
}
62+
63+
///////////////////
64+
65+
QgsCategorizedSymbolRendererV2::QgsCategorizedSymbolRendererV2(QString attrName, QgsCategoryList categories)
66+
: QgsFeatureRendererV2(RendererCategorizedSymbol), mAttrName(attrName), mCategories(categories)
67+
{
68+
for (int i = 0; i < mCategories.count(); ++i)
69+
{
70+
QgsRendererCategoryV2& cat = mCategories[i];
71+
if (cat.symbol() == NULL)
72+
{
73+
QgsDebugMsg("invalid symbol in a category! ignoring...");
74+
mCategories.removeAt(i--);
75+
}
76+
//mCategories.insert(cat.value().toString(), cat);
77+
}
78+
}
79+
80+
QgsCategorizedSymbolRendererV2::~QgsCategorizedSymbolRendererV2()
81+
{
82+
mCategories.clear(); // this should also call destructors of symbols
83+
}
84+
85+
void QgsCategorizedSymbolRendererV2::rebuildHash()
86+
{
87+
mSymbolHash.clear();
88+
89+
for (int i = 0; i < mCategories.count(); ++i)
90+
{
91+
QgsRendererCategoryV2& cat = mCategories[i];
92+
mSymbolHash.insert(cat.value().toString(), cat.symbol());
93+
}
94+
}
95+
96+
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForValue(QVariant value)
97+
{
98+
// TODO: special case for int, double
99+
100+
QHash<QString, QgsSymbolV2*>::iterator it = mSymbolHash.find(value.toString());
101+
if (it == mSymbolHash.end())
102+
{
103+
if (mSymbolHash.count() == 0)
104+
QgsDebugMsg("there are no hashed symbols!!!");
105+
else
106+
QgsDebugMsg("attribute value not found: " + value.toString());
107+
return NULL;
108+
}
109+
else
110+
return *it;
111+
}
112+
113+
QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature(QgsFeature& feature)
114+
{
115+
const QgsAttributeMap& attrMap = feature.attributeMap();
116+
QgsAttributeMap::const_iterator ita = attrMap.find(mAttrNum);
117+
if (ita == attrMap.end())
118+
{
119+
QgsDebugMsg("attribute '"+mAttrName+"' (index "+QString::number(mAttrNum)+") required by renderer not found");
120+
return NULL;
121+
}
122+
123+
// find the right category
124+
return symbolForValue(*ita);
125+
}
126+
127+
int QgsCategorizedSymbolRendererV2::categoryIndexForValue(QVariant val)
128+
{
129+
for (int i = 0; i < mCategories.count(); i++)
130+
{
131+
if (mCategories[i].value() == val)
132+
return i;
133+
}
134+
return -1;
135+
}
136+
137+
bool QgsCategorizedSymbolRendererV2::updateCategorySymbol(int catIndex, QgsSymbolV2* symbol)
138+
{
139+
if (catIndex < 0 || catIndex >= mCategories.size())
140+
return false;
141+
mCategories[catIndex].setSymbol(symbol);
142+
return true;
143+
}
144+
145+
bool QgsCategorizedSymbolRendererV2::updateCategoryLabel(int catIndex, QString label)
146+
{
147+
if (catIndex < 0 || catIndex >= mCategories.size())
148+
return false;
149+
mCategories[catIndex].setLabel(label);
150+
return true;
151+
}
152+
153+
bool QgsCategorizedSymbolRendererV2::deleteCategory(int catIndex)
154+
{
155+
if (catIndex < 0 || catIndex >= mCategories.size())
156+
return false;
157+
158+
mCategories.removeAt(catIndex);
159+
return true;
160+
}
161+
162+
void QgsCategorizedSymbolRendererV2::deleteAllCategories()
163+
{
164+
mCategories.clear();
165+
}
166+
167+
void QgsCategorizedSymbolRendererV2::startRender(QgsRenderContext& context, const QgsFieldMap& fields)
168+
{
169+
// make sure that the hash table is up to date
170+
rebuildHash();
171+
172+
// find out classification attribute index from name
173+
mAttrNum = fieldNameIndex(fields, mAttrName);
174+
175+
QgsCategoryList::iterator it = mCategories.begin();
176+
for ( ; it != mCategories.end(); ++it)
177+
it->symbol()->startRender(context);
178+
}
179+
180+
void QgsCategorizedSymbolRendererV2::stopRender(QgsRenderContext& context)
181+
{
182+
QgsCategoryList::iterator it = mCategories.begin();
183+
for ( ; it != mCategories.end(); ++it)
184+
it->symbol()->stopRender(context);
185+
}
186+
187+
QList<QString> QgsCategorizedSymbolRendererV2::usedAttributes()
188+
{
189+
QList<QString> lst;
190+
lst.append(mAttrName);
191+
return lst;
192+
}
193+
194+
QString QgsCategorizedSymbolRendererV2::dump()
195+
{
196+
QString s = QString("CATEGORIZED: idx %1\n").arg(mAttrName);
197+
for (int i=0; i<mCategories.count();i++)
198+
s += mCategories[i].dump();
199+
return s;
200+
}
201+
202+
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::clone()
203+
{
204+
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2( mAttrName, mCategories );
205+
r->setUsingSymbolLevels( usingSymbolLevels() );
206+
return r;
207+
}
208+
209+
QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols()
210+
{
211+
QgsSymbolV2List lst;
212+
for (int i = 0; i < mCategories.count(); i++)
213+
lst.append(mCategories[i].symbol());
214+
return lst;
215+
}
216+
217+
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create(QDomElement& element)
218+
{
219+
QDomElement symbolsElem = element.firstChildElement("symbols");
220+
if (symbolsElem.isNull())
221+
return NULL;
222+
223+
QDomElement catsElem = element.firstChildElement("categories");
224+
if (catsElem.isNull())
225+
return NULL;
226+
227+
QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem);
228+
QgsCategoryList cats;
229+
230+
QDomElement catElem = catsElem.firstChildElement();
231+
while (!catElem.isNull())
232+
{
233+
if (catElem.tagName() == "category")
234+
{
235+
QVariant value = QVariant(catElem.attribute("value"));
236+
QString symbolName = catElem.attribute("symbol");
237+
QString label = catElem.attribute("label");
238+
if (symbolMap.contains(symbolName))
239+
{
240+
QgsSymbolV2* symbol = symbolMap.take(symbolName);
241+
cats.append( QgsRendererCategoryV2(value, symbol, label) );
242+
}
243+
}
244+
catElem = catElem.nextSiblingElement();
245+
}
246+
247+
QString attrName = element.attribute("attr");
248+
249+
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2(attrName, cats);
250+
251+
// delete symbols if there are any more
252+
QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap);
253+
254+
// TODO: symbol levels
255+
return r;
256+
}
257+
258+
QDomElement QgsCategorizedSymbolRendererV2::save(QDomDocument& doc)
259+
{
260+
QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME);
261+
rendererElem.setAttribute("type", "categorizedSymbol");
262+
rendererElem.setAttribute("attr", mAttrName);
263+
264+
// categories
265+
int i = 0;
266+
QgsSymbolV2Map symbols;
267+
QDomElement catsElem = doc.createElement("categories");
268+
QgsCategoryList::const_iterator it = mCategories.constBegin();
269+
for ( ; it != mCategories.end(); it++)
270+
{
271+
const QgsRendererCategoryV2& cat = *it;
272+
QString symbolName = QString::number(i);
273+
symbols.insert(symbolName, cat.symbol());
274+
275+
QDomElement catElem = doc.createElement("category");
276+
catElem.setAttribute("value", cat.value().toString());
277+
catElem.setAttribute("symbol", symbolName);
278+
catElem.setAttribute("label", cat.label());
279+
catsElem.appendChild(catElem);
280+
i++;
281+
}
282+
283+
rendererElem.appendChild(catsElem);
284+
285+
// save symbols
286+
QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc);
287+
rendererElem.appendChild(symbolsElem);
288+
289+
return rendererElem;
290+
}

0 commit comments

Comments
 (0)