13
13
* *
14
14
***************************************************************************/
15
15
#include " qgsdiagramrendererv2.h"
16
+ #include " qgsvectorlayer.h"
16
17
#include " diagram/qgstextdiagram.h"
17
18
#include " diagram/qgspiediagram.h"
18
19
#include " diagram/qgshistogramdiagram.h"
21
22
#include < QPainter>
22
23
23
24
24
- void QgsDiagramLayerSettings::readXML ( const QDomElement& elem )
25
+ void QgsDiagramLayerSettings::readXML ( const QDomElement& elem, const QgsVectorLayer* layer )
25
26
{
27
+ Q_UNUSED ( layer )
28
+
26
29
placement = ( Placement )elem.attribute ( " placement" ).toInt ();
27
30
placementFlags = ( LinePlacementFlags )elem.attribute ( " linePlacementFlags" ).toInt ();
28
31
priority = elem.attribute ( " priority" ).toInt ();
@@ -32,8 +35,10 @@ void QgsDiagramLayerSettings::readXML( const QDomElement& elem )
32
35
yPosColumn = elem.attribute ( " yPosColumn" ).toInt ();
33
36
}
34
37
35
- void QgsDiagramLayerSettings::writeXML ( QDomElement& layerElem, QDomDocument& doc ) const
38
+ void QgsDiagramLayerSettings::writeXML ( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
36
39
{
40
+ Q_UNUSED ( layer )
41
+
37
42
QDomElement diagramLayerElem = doc.createElement ( " DiagramLayerSettings" );
38
43
diagramLayerElem.setAttribute ( " placement" , placement );
39
44
diagramLayerElem.setAttribute ( " linePlacementFlags" , placementFlags );
@@ -45,7 +50,7 @@ void QgsDiagramLayerSettings::writeXML( QDomElement& layerElem, QDomDocument& do
45
50
layerElem.appendChild ( diagramLayerElem );
46
51
}
47
52
48
- void QgsDiagramSettings::readXML ( const QDomElement& elem )
53
+ void QgsDiagramSettings::readXML ( const QDomElement& elem, const QgsVectorLayer* layer )
49
54
{
50
55
font.fromString ( elem.attribute ( " font" ) );
51
56
backgroundColor.setNamedColor ( elem.attribute ( " backgroundColor" ) );
@@ -117,26 +122,44 @@ void QgsDiagramSettings::readXML( const QDomElement& elem )
117
122
118
123
// colors
119
124
categoryColors.clear ();
120
- QStringList colorList = elem.attribute ( " colors " ). split ( " / " );
121
- QStringList::const_iterator colorIt = colorList. constBegin ();
122
- for ( ; colorIt != colorList. constEnd (); ++colorIt )
125
+ QDomNodeList attributes = elem.elementsByTagName ( " attribute " );
126
+
127
+ if ( attributes. length () > 0 )
123
128
{
124
- QColor newColor ( *colorIt );
125
- newColor.setAlpha ( 255 - transparency );
126
- categoryColors.append ( QColor ( newColor ) );
129
+ for ( uint i = 0 ; i < attributes.length (); i++ )
130
+ {
131
+ QDomElement attrElem = attributes.at ( i ).toElement ();
132
+ QColor newColor ( attrElem.attribute ( " color" ) );
133
+ newColor.setAlpha ( 255 - transparency );
134
+ categoryColors.append ( newColor );
135
+ categoryIndices.append ( layer->fieldNameIndex ( attrElem.attribute ( " field" ) ) );
136
+ }
127
137
}
128
-
129
- // attribute indices
130
- categoryIndices.clear ();
131
- QStringList catList = elem.attribute ( " categories" ).split ( " /" );
132
- QStringList::const_iterator catIt = catList.constBegin ();
133
- for ( ; catIt != catList.constEnd (); ++catIt )
138
+ else
134
139
{
135
- categoryIndices.append ( catIt->toInt () );
140
+ // Restore old format attributes and colors
141
+
142
+ QStringList colorList = elem.attribute ( " colors" ).split ( " /" );
143
+ QStringList::const_iterator colorIt = colorList.constBegin ();
144
+ for ( ; colorIt != colorList.constEnd (); ++colorIt )
145
+ {
146
+ QColor newColor ( *colorIt );
147
+ newColor.setAlpha ( 255 - transparency );
148
+ categoryColors.append ( QColor ( newColor ) );
149
+ }
150
+
151
+ // attribute indices
152
+ categoryIndices.clear ();
153
+ QStringList catList = elem.attribute ( " categories" ).split ( " /" );
154
+ QStringList::const_iterator catIt = catList.constBegin ();
155
+ for ( ; catIt != catList.constEnd (); ++catIt )
156
+ {
157
+ categoryIndices.append ( catIt->toInt () );
158
+ }
136
159
}
137
160
}
138
161
139
- void QgsDiagramSettings::writeXML ( QDomElement& rendererElem, QDomDocument& doc ) const
162
+ void QgsDiagramSettings::writeXML ( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
140
163
{
141
164
QDomElement categoryElem = doc.createElement ( " DiagramCategory" );
142
165
categoryElem.setAttribute ( " font" , font.toString () );
@@ -209,26 +232,15 @@ void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc
209
232
categoryElem.setAttribute ( " angleOffset" , QString::number ( angleOffset ) );
210
233
211
234
QString colors;
212
- for ( int i = 0 ; i < categoryColors.size (); ++i )
235
+ int nCats = qMin ( categoryColors.size (), categoryIndices.size () );
236
+ for ( int i = 0 ; i < nCats; ++i )
213
237
{
214
- if ( i > 0 )
215
- {
216
- colors.append ( " /" );
217
- }
218
- colors.append ( categoryColors.at ( i ).name () );
219
- }
220
- categoryElem.setAttribute ( " colors" , colors );
238
+ QDomElement attributeElem = doc.createElement ( " attribute" );
221
239
222
- QString categories;
223
- for ( int i = 0 ; i < categoryIndices.size (); ++i )
224
- {
225
- if ( i > 0 )
226
- {
227
- categories.append ( " /" );
228
- }
229
- categories.append ( QString::number ( categoryIndices.at ( i ) ) );
240
+ attributeElem.setAttribute ( " field" , layer->pendingFields ().at ( categoryIndices.at ( i ) ).name () );
241
+ attributeElem.setAttribute ( " color" , categoryColors.at ( i ).name () );
242
+ categoryElem.appendChild ( attributeElem );
230
243
}
231
- categoryElem.setAttribute ( " categories" , categories );
232
244
233
245
rendererElem.appendChild ( categoryElem );
234
246
}
@@ -305,8 +317,10 @@ int QgsDiagramRendererV2::dpiPaintDevice( const QPainter* painter )
305
317
return -1 ;
306
318
}
307
319
308
- void QgsDiagramRendererV2::_readXML ( const QDomElement& elem )
320
+ void QgsDiagramRendererV2::_readXML ( const QDomElement& elem, const QgsVectorLayer* layer )
309
321
{
322
+ Q_UNUSED ( layer )
323
+
310
324
delete mDiagram ;
311
325
QString diagramType = elem.attribute ( " diagramType" );
312
326
if ( diagramType == " Pie" )
@@ -327,9 +341,11 @@ void QgsDiagramRendererV2::_readXML( const QDomElement& elem )
327
341
}
328
342
}
329
343
330
- void QgsDiagramRendererV2::_writeXML ( QDomElement& rendererElem, QDomDocument& doc ) const
344
+ void QgsDiagramRendererV2::_writeXML ( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
331
345
{
332
346
Q_UNUSED ( doc );
347
+ Q_UNUSED ( layer )
348
+
333
349
if ( mDiagram )
334
350
{
335
351
rendererElem.setAttribute ( " diagramType" , mDiagram ->diagramName () );
@@ -363,23 +379,23 @@ QList<QgsDiagramSettings> QgsSingleCategoryDiagramRenderer::diagramSettings() co
363
379
return settingsList;
364
380
}
365
381
366
- void QgsSingleCategoryDiagramRenderer::readXML ( const QDomElement& elem )
382
+ void QgsSingleCategoryDiagramRenderer::readXML ( const QDomElement& elem, const QgsVectorLayer* layer )
367
383
{
368
384
QDomElement categoryElem = elem.firstChildElement ( " DiagramCategory" );
369
385
if ( categoryElem.isNull () )
370
386
{
371
387
return ;
372
388
}
373
389
374
- mSettings .readXML ( categoryElem );
375
- _readXML ( elem );
390
+ mSettings .readXML ( categoryElem, layer );
391
+ _readXML ( elem, layer );
376
392
}
377
393
378
- void QgsSingleCategoryDiagramRenderer::writeXML ( QDomElement& layerElem, QDomDocument& doc ) const
394
+ void QgsSingleCategoryDiagramRenderer::writeXML ( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
379
395
{
380
396
QDomElement rendererElem = doc.createElement ( " SingleCategoryDiagramRenderer" );
381
- mSettings .writeXML ( rendererElem, doc );
382
- _writeXML ( rendererElem, doc );
397
+ mSettings .writeXML ( rendererElem, doc, layer );
398
+ _writeXML ( rendererElem, doc , layer );
383
399
layerElem.appendChild ( rendererElem );
384
400
}
385
401
@@ -421,7 +437,7 @@ QSizeF QgsLinearlyInterpolatedDiagramRenderer::diagramSize( const QgsAttributes&
421
437
return mDiagram ->diagramSize ( attributes, c, mSettings , mInterpolationSettings );
422
438
}
423
439
424
- void QgsLinearlyInterpolatedDiagramRenderer::readXML ( const QDomElement& elem )
440
+ void QgsLinearlyInterpolatedDiagramRenderer::readXML ( const QDomElement& elem, const QgsVectorLayer* layer )
425
441
{
426
442
mInterpolationSettings .lowerValue = elem.attribute ( " lowerValue" ).toDouble ();
427
443
mInterpolationSettings .upperValue = elem.attribute ( " upperValue" ).toDouble ();
@@ -433,12 +449,12 @@ void QgsLinearlyInterpolatedDiagramRenderer::readXML( const QDomElement& elem )
433
449
QDomElement settingsElem = elem.firstChildElement ( " DiagramCategory" );
434
450
if ( !settingsElem.isNull () )
435
451
{
436
- mSettings .readXML ( settingsElem );
452
+ mSettings .readXML ( settingsElem, layer );
437
453
}
438
- _readXML ( elem );
454
+ _readXML ( elem, layer );
439
455
}
440
456
441
- void QgsLinearlyInterpolatedDiagramRenderer::writeXML ( QDomElement& layerElem, QDomDocument& doc ) const
457
+ void QgsLinearlyInterpolatedDiagramRenderer::writeXML ( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
442
458
{
443
459
QDomElement rendererElem = doc.createElement ( " LinearlyInterpolatedDiagramRenderer" );
444
460
rendererElem.setAttribute ( " lowerValue" , QString::number ( mInterpolationSettings .lowerValue ) );
@@ -448,7 +464,7 @@ void QgsLinearlyInterpolatedDiagramRenderer::writeXML( QDomElement& layerElem, Q
448
464
rendererElem.setAttribute ( " upperWidth" , QString::number ( mInterpolationSettings .upperSize .width () ) );
449
465
rendererElem.setAttribute ( " upperHeight" , QString::number ( mInterpolationSettings .upperSize .height () ) );
450
466
rendererElem.setAttribute ( " classificationAttribute" , mInterpolationSettings .classificationAttribute );
451
- mSettings .writeXML ( rendererElem, doc );
452
- _writeXML ( rendererElem, doc );
467
+ mSettings .writeXML ( rendererElem, doc, layer );
468
+ _writeXML ( rendererElem, doc, layer );
453
469
layerElem.appendChild ( rendererElem );
454
470
}
0 commit comments