Skip to content

Commit d5630cc

Browse files
author
wonder
committed
Added loading and saving of renderers v2 in project files.
git-svn-id: http://svn.osgeo.org/qgis/branches/symbology-ng-branch@11881 c8812cc2-4d05-0410-92ff-de0c093fc19c
1 parent 1e7c9cf commit d5630cc

File tree

8 files changed

+589
-251
lines changed

8 files changed

+589
-251
lines changed

resources/symbology-ng-style.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
<!DOCTYPE qgis_style>
22
<qgis_style version="0" >
3+
<symbols>
34
<symbol type="marker" name="blue square" >
45
<layer class="SimpleMarker" locked="0" >
56
<prop k="angle" v="0" />
@@ -97,6 +98,8 @@
9798
<prop k="size" v="12" />
9899
</layer>
99100
</symbol>
101+
</symbols>
102+
<colorramps>
100103
<colorramp type="gradient" name="blue" >
101104
<prop k="color1" v="0,0,255" />
102105
<prop k="color2" v="207,205,255" />
@@ -109,4 +112,5 @@
109112
<prop k="color1" v="255,0,0" />
110113
<prop k="color2" v="255,255,0" />
111114
</colorramp>
115+
</colorramps>
112116
</qgis_style>

src/core/qgsvectorlayer.cpp

Lines changed: 30 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,12 +2315,28 @@ bool QgsVectorLayer::readXml( QDomNode & layer_node )
23152315
}
23162316
}
23172317

2318-
QString errorMsg;
2319-
if ( !readSymbology( layer_node, errorMsg ) )
2318+
QDomElement rendererElement = layer_node.firstChildElement(RENDERER_TAG_NAME);
2319+
if (!rendererElement.isNull())
23202320
{
2321-
return false;
2321+
// using renderer v2
2322+
setUsingRendererV2(true);
2323+
2324+
QgsFeatureRendererV2* r = QgsFeatureRendererV2::load(rendererElement);
2325+
if (r == NULL)
2326+
return false;
2327+
setRendererV2(r);
23222328
}
2329+
else
2330+
{
2331+
// using renderer v1
2332+
setUsingRendererV2(false);
23232333

2334+
QString errorMsg;
2335+
if ( !readSymbology( layer_node, errorMsg ) )
2336+
{
2337+
return false;
2338+
}
2339+
}
23242340

23252341
return mValid; // should be true if read successfully
23262342

@@ -2455,13 +2471,19 @@ bool QgsVectorLayer::writeXml( QDomNode & layer_node,
24552471
}
24562472

24572473
// renderer specific settings
2458-
2459-
QString errorMsg;
2460-
if ( !writeSymbology( layer_node, document, errorMsg ) )
2474+
if (mUsingRendererV2)
24612475
{
2462-
return false;
2476+
QDomElement rendererElement = mRendererV2->save(document);
2477+
layer_node.appendChild(rendererElement);
2478+
}
2479+
else
2480+
{
2481+
QString errorMsg;
2482+
if ( !writeSymbology( layer_node, document, errorMsg ) )
2483+
{
2484+
return false;
2485+
}
24632486
}
2464-
24652487

24662488
return true;
24672489
} // bool QgsVectorLayer::writeXml

src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,18 @@
11
#include "qgsrendererv2.h"
22
#include "qgssymbolv2.h"
3+
#include "qgssymbollayerv2utils.h"
34

45
#include "qgsrendercontext.h"
56
#include "qgsgeometry.h"
67
#include "qgsfeature.h"
78
#include "qgslogger.h"
89

10+
#include <QDomElement>
11+
#include <QDomDocument>
912
#include <QPolygonF>
1013

1114

15+
1216
static unsigned char* _getPoint(QPointF& pt, const QgsMapToPixel& mapToPixel, unsigned char* wkb)
1317
{
1418
wkb++; // jump over endian info
@@ -247,6 +251,40 @@ QString QgsFeatureRendererV2::dump()
247251
}
248252

249253

254+
QgsFeatureRendererV2* QgsFeatureRendererV2::load(QDomElement& element)
255+
{
256+
// <renderer-v2 type=""> ... </renderer-v2>
257+
258+
if (element.isNull())
259+
return NULL;
260+
261+
// load renderer
262+
QString rendererType = element.attribute("type");
263+
264+
// TODO: use renderer registry
265+
if (rendererType == "singleSymbol")
266+
{
267+
return QgsSingleSymbolRendererV2::create(element);
268+
}
269+
else if (rendererType == "categorizedSymbol")
270+
{
271+
return QgsCategorizedSymbolRendererV2::create(element);
272+
}
273+
else if (rendererType == "graduatedSymbol")
274+
{
275+
return QgsGraduatedSymbolRendererV2::create(element);
276+
}
277+
278+
// unknown renderer type
279+
return NULL;
280+
}
281+
282+
QDomElement QgsFeatureRendererV2::save(QDomDocument& doc)
283+
{
284+
// create empty renderer element
285+
return doc.createElement(RENDERER_TAG_NAME);
286+
}
287+
250288
///////////////////
251289

252290
QgsSingleSymbolRendererV2::QgsSingleSymbolRendererV2(QgsSymbolV2* symbol)
@@ -310,6 +348,39 @@ QgsSymbolV2List QgsSingleSymbolRendererV2::symbols()
310348
return lst;
311349
}
312350

351+
QgsFeatureRendererV2* QgsSingleSymbolRendererV2::create(QDomElement& element)
352+
{
353+
QDomElement symbolsElem = element.firstChildElement("symbols");
354+
if (symbolsElem.isNull())
355+
return NULL;
356+
357+
QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem);
358+
359+
if (!symbolMap.contains("0"))
360+
return NULL;
361+
362+
QgsSingleSymbolRendererV2* r = new QgsSingleSymbolRendererV2( symbolMap.take("0") );
363+
364+
// delete symbols if there are any more
365+
QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap);
366+
367+
// TODO: symbol levels
368+
return r;
369+
}
370+
371+
QDomElement QgsSingleSymbolRendererV2::save(QDomDocument& doc)
372+
{
373+
QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME);
374+
rendererElem.setAttribute("type", "singleSymbol");
375+
376+
QgsSymbolV2Map symbols;
377+
symbols["0"] = mSymbol;
378+
QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc);
379+
rendererElem.appendChild(symbolsElem);
380+
381+
return rendererElem;
382+
}
383+
313384
///////////////////
314385

315386
QgsRendererCategoryV2::QgsRendererCategoryV2(QVariant value, QgsSymbolV2* symbol, QString label)
@@ -513,6 +584,81 @@ QgsSymbolV2List QgsCategorizedSymbolRendererV2::symbols()
513584
return lst;
514585
}
515586

587+
QgsFeatureRendererV2* QgsCategorizedSymbolRendererV2::create(QDomElement& element)
588+
{
589+
QDomElement symbolsElem = element.firstChildElement("symbols");
590+
if (symbolsElem.isNull())
591+
return NULL;
592+
593+
QDomElement catsElem = element.firstChildElement("categories");
594+
if (catsElem.isNull())
595+
return NULL;
596+
597+
QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem);
598+
QgsCategoryList cats;
599+
600+
QDomElement catElem = catsElem.firstChildElement();
601+
while (!catElem.isNull())
602+
{
603+
if (catElem.tagName() == "category")
604+
{
605+
QVariant value = QVariant(catElem.attribute("value"));
606+
QString symbolName = catElem.attribute("symbol");
607+
QString label = catElem.attribute("label");
608+
if (symbolMap.contains(symbolName))
609+
{
610+
QgsSymbolV2* symbol = symbolMap.take(symbolName);
611+
cats.append( QgsRendererCategoryV2(value, symbol, label) );
612+
}
613+
}
614+
catElem = catElem.nextSiblingElement();
615+
}
616+
617+
int attrNum = element.attribute("attr").toInt();
618+
619+
QgsCategorizedSymbolRendererV2* r = new QgsCategorizedSymbolRendererV2(attrNum, cats);
620+
621+
// delete symbols if there are any more
622+
QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap);
623+
624+
// TODO: symbol levels
625+
return r;
626+
}
627+
628+
QDomElement QgsCategorizedSymbolRendererV2::save(QDomDocument& doc)
629+
{
630+
QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME);
631+
rendererElem.setAttribute("type", "categorizedSymbol");
632+
rendererElem.setAttribute("attr", mAttrNum);
633+
634+
// categories
635+
int i = 0;
636+
QgsSymbolV2Map symbols;
637+
QDomElement catsElem = doc.createElement("categories");
638+
QgsCategoryList::const_iterator it = mCategories.constBegin();
639+
for ( ; it != mCategories.end(); it++)
640+
{
641+
const QgsRendererCategoryV2& cat = *it;
642+
QString symbolName = QString::number(i);
643+
symbols.insert(symbolName, cat.symbol());
644+
645+
QDomElement catElem = doc.createElement("category");
646+
catElem.setAttribute("value", cat.value().toString());
647+
catElem.setAttribute("symbol", symbolName);
648+
catElem.setAttribute("label", cat.label());
649+
catsElem.appendChild(catElem);
650+
i++;
651+
}
652+
653+
rendererElem.appendChild(catsElem);
654+
655+
// save symbols
656+
QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc);
657+
rendererElem.appendChild(symbolsElem);
658+
659+
return rendererElem;
660+
}
661+
516662
/////////////////////////
517663
// graduated
518664

@@ -778,3 +924,82 @@ QgsGraduatedSymbolRendererV2* QgsGraduatedSymbolRendererV2::createRenderer(
778924

779925
return new QgsGraduatedSymbolRendererV2( attrNum, ranges );
780926
}
927+
928+
929+
930+
QgsFeatureRendererV2* QgsGraduatedSymbolRendererV2::create(QDomElement& element)
931+
{
932+
QDomElement symbolsElem = element.firstChildElement("symbols");
933+
if (symbolsElem.isNull())
934+
return NULL;
935+
936+
QDomElement rangesElem = element.firstChildElement("ranges");
937+
if (rangesElem.isNull())
938+
return NULL;
939+
940+
QgsSymbolV2Map symbolMap = QgsSymbolLayerV2Utils::loadSymbols(symbolsElem);
941+
QgsRangeList ranges;
942+
943+
QDomElement rangeElem = rangesElem.firstChildElement();
944+
while (!rangeElem.isNull())
945+
{
946+
if (rangeElem.tagName() == "range")
947+
{
948+
double lowerValue = rangeElem.attribute("lower").toDouble();
949+
double upperValue = rangeElem.attribute("upper").toDouble();
950+
QString symbolName = rangeElem.attribute("symbol");
951+
QString label = rangeElem.attribute("label");
952+
if (symbolMap.contains(symbolName))
953+
{
954+
QgsSymbolV2* symbol = symbolMap.take(symbolName);
955+
ranges.append( QgsRendererRangeV2(lowerValue, upperValue, symbol, label) );
956+
}
957+
}
958+
rangeElem = rangeElem.nextSiblingElement();
959+
}
960+
961+
int attrNum = element.attribute("attr").toInt();
962+
963+
QgsGraduatedSymbolRendererV2* r = new QgsGraduatedSymbolRendererV2(attrNum, ranges);
964+
965+
// delete symbols if there are any more
966+
QgsSymbolLayerV2Utils::clearSymbolMap(symbolMap);
967+
968+
// TODO: symbol levels
969+
return r;
970+
}
971+
972+
QDomElement QgsGraduatedSymbolRendererV2::save(QDomDocument& doc)
973+
{
974+
QDomElement rendererElem = doc.createElement(RENDERER_TAG_NAME);
975+
rendererElem.setAttribute("type", "graduatedSymbol");
976+
rendererElem.setAttribute("attr", mAttrNum);
977+
978+
// ranges
979+
int i = 0;
980+
QgsSymbolV2Map symbols;
981+
QDomElement rangesElem = doc.createElement("ranges");
982+
QgsRangeList::const_iterator it = mRanges.constBegin();
983+
for ( ; it != mRanges.end(); it++)
984+
{
985+
const QgsRendererRangeV2& range = *it;
986+
QString symbolName = QString::number(i);
987+
symbols.insert(symbolName, range.symbol());
988+
989+
QDomElement rangeElem = doc.createElement("range");
990+
rangeElem.setAttribute("lower", range.lowerValue());
991+
rangeElem.setAttribute("upper", range.upperValue());
992+
rangeElem.setAttribute("symbol", symbolName);
993+
rangeElem.setAttribute("label", range.label());
994+
rangesElem.appendChild(rangeElem);
995+
i++;
996+
}
997+
998+
rendererElem.appendChild(rangesElem);
999+
1000+
// save symbols
1001+
QDomElement symbolsElem = QgsSymbolLayerV2Utils::saveSymbols(symbols, doc);
1002+
rendererElem.appendChild(symbolsElem);
1003+
1004+
return rendererElem;
1005+
}

0 commit comments

Comments
 (0)