Skip to content

Commit cad339d

Browse files
committed
[diagrams] save attribute names instead of indices (fix #7914)
1 parent a7b92fd commit cad339d

File tree

4 files changed

+95
-77
lines changed

4 files changed

+95
-77
lines changed

python/core/qgsdiagramrendererv2.sip

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ struct QgsDiagramLayerSettings
3434
int xPosColumn; //attribute index for x coordinate (or -1 if position not data defined)
3535
int yPosColumn;//attribute index for y coordinate (or -1 if position not data defined)
3636

37-
void readXML( const QDomElement& elem );
38-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
37+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
38+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
3939
};
4040

4141
//diagram settings for rendering
@@ -88,8 +88,8 @@ class QgsDiagramSettings
8888
//! Scale diagrams smaller than mMinimumSize to mMinimumSize
8989
double minimumSize;
9090

91-
void readXML( const QDomElement& elem );
92-
void writeXML( QDomElement& rendererElem, QDomDocument& doc ) const;
91+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
92+
void writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
9393
};
9494

9595
//additional diagram settings for interpolated size rendering
@@ -134,8 +134,8 @@ class QgsDiagramRendererV2
134134
/**Returns list with all diagram settings in the renderer*/
135135
virtual QList<QgsDiagramSettings> diagramSettings() const = 0;
136136

137-
virtual void readXML( const QDomElement& elem ) = 0;
138-
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc ) const = 0;
137+
virtual void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) = 0;
138+
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const = 0;
139139

140140
protected:
141141

@@ -156,8 +156,8 @@ class QgsDiagramRendererV2
156156
static int dpiPaintDevice( const QPainter* );
157157

158158
//read / write diagram
159-
void _readXML( const QDomElement& elem );
160-
void _writeXML( QDomElement& rendererElem, QDomDocument& doc ) const;
159+
void _readXML( const QDomElement& elem, const QgsVectorLayer* layer );
160+
void _writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
161161
};
162162

163163
/**Renders the diagrams for all features with the same settings*/
@@ -179,8 +179,8 @@ class QgsSingleCategoryDiagramRenderer : QgsDiagramRendererV2
179179

180180
QList<QgsDiagramSettings> diagramSettings() const;
181181

182-
void readXML( const QDomElement& elem );
183-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
182+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
183+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
184184

185185
protected:
186186
bool diagramSettings( const QgsAttributes&, const QgsRenderContext& c, QgsDiagramSettings& s );
@@ -222,8 +222,8 @@ class QgsLinearlyInterpolatedDiagramRenderer : QgsDiagramRendererV2
222222
int classificationAttribute() const;
223223
void setClassificationAttribute( int index );
224224

225-
void readXML( const QDomElement& elem );
226-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
225+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
226+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
227227

228228
protected:
229229
bool diagramSettings( const QgsAttributes&, const QgsRenderContext& c, QgsDiagramSettings& s );

src/core/qgsdiagramrendererv2.cpp

Lines changed: 64 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
* *
1414
***************************************************************************/
1515
#include "qgsdiagramrendererv2.h"
16+
#include "qgsvectorlayer.h"
1617
#include "diagram/qgstextdiagram.h"
1718
#include "diagram/qgspiediagram.h"
1819
#include "diagram/qgshistogramdiagram.h"
@@ -21,8 +22,10 @@
2122
#include <QPainter>
2223

2324

24-
void QgsDiagramLayerSettings::readXML( const QDomElement& elem )
25+
void QgsDiagramLayerSettings::readXML( const QDomElement& elem, const QgsVectorLayer* layer )
2526
{
27+
Q_UNUSED( layer )
28+
2629
placement = ( Placement )elem.attribute( "placement" ).toInt();
2730
placementFlags = ( LinePlacementFlags )elem.attribute( "linePlacementFlags" ).toInt();
2831
priority = elem.attribute( "priority" ).toInt();
@@ -32,8 +35,10 @@ void QgsDiagramLayerSettings::readXML( const QDomElement& elem )
3235
yPosColumn = elem.attribute( "yPosColumn" ).toInt();
3336
}
3437

35-
void QgsDiagramLayerSettings::writeXML( QDomElement& layerElem, QDomDocument& doc ) const
38+
void QgsDiagramLayerSettings::writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
3639
{
40+
Q_UNUSED( layer )
41+
3742
QDomElement diagramLayerElem = doc.createElement( "DiagramLayerSettings" );
3843
diagramLayerElem.setAttribute( "placement", placement );
3944
diagramLayerElem.setAttribute( "linePlacementFlags", placementFlags );
@@ -45,7 +50,7 @@ void QgsDiagramLayerSettings::writeXML( QDomElement& layerElem, QDomDocument& do
4550
layerElem.appendChild( diagramLayerElem );
4651
}
4752

48-
void QgsDiagramSettings::readXML( const QDomElement& elem )
53+
void QgsDiagramSettings::readXML( const QDomElement& elem, const QgsVectorLayer* layer )
4954
{
5055
font.fromString( elem.attribute( "font" ) );
5156
backgroundColor.setNamedColor( elem.attribute( "backgroundColor" ) );
@@ -117,26 +122,44 @@ void QgsDiagramSettings::readXML( const QDomElement& elem )
117122

118123
//colors
119124
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 )
123128
{
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+
}
127137
}
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
134139
{
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+
}
136159
}
137160
}
138161

139-
void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc ) const
162+
void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
140163
{
141164
QDomElement categoryElem = doc.createElement( "DiagramCategory" );
142165
categoryElem.setAttribute( "font", font.toString() );
@@ -209,26 +232,15 @@ void QgsDiagramSettings::writeXML( QDomElement& rendererElem, QDomDocument& doc
209232
categoryElem.setAttribute( "angleOffset", QString::number( angleOffset ) );
210233

211234
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 )
213237
{
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" );
221239

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 );
230243
}
231-
categoryElem.setAttribute( "categories", categories );
232244

233245
rendererElem.appendChild( categoryElem );
234246
}
@@ -305,8 +317,10 @@ int QgsDiagramRendererV2::dpiPaintDevice( const QPainter* painter )
305317
return -1;
306318
}
307319

308-
void QgsDiagramRendererV2::_readXML( const QDomElement& elem )
320+
void QgsDiagramRendererV2::_readXML( const QDomElement& elem, const QgsVectorLayer* layer )
309321
{
322+
Q_UNUSED( layer )
323+
310324
delete mDiagram;
311325
QString diagramType = elem.attribute( "diagramType" );
312326
if ( diagramType == "Pie" )
@@ -327,9 +341,11 @@ void QgsDiagramRendererV2::_readXML( const QDomElement& elem )
327341
}
328342
}
329343

330-
void QgsDiagramRendererV2::_writeXML( QDomElement& rendererElem, QDomDocument& doc ) const
344+
void QgsDiagramRendererV2::_writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
331345
{
332346
Q_UNUSED( doc );
347+
Q_UNUSED( layer )
348+
333349
if ( mDiagram )
334350
{
335351
rendererElem.setAttribute( "diagramType", mDiagram->diagramName() );
@@ -363,23 +379,23 @@ QList<QgsDiagramSettings> QgsSingleCategoryDiagramRenderer::diagramSettings() co
363379
return settingsList;
364380
}
365381

366-
void QgsSingleCategoryDiagramRenderer::readXML( const QDomElement& elem )
382+
void QgsSingleCategoryDiagramRenderer::readXML( const QDomElement& elem, const QgsVectorLayer* layer )
367383
{
368384
QDomElement categoryElem = elem.firstChildElement( "DiagramCategory" );
369385
if ( categoryElem.isNull() )
370386
{
371387
return;
372388
}
373389

374-
mSettings.readXML( categoryElem );
375-
_readXML( elem );
390+
mSettings.readXML( categoryElem, layer );
391+
_readXML( elem, layer );
376392
}
377393

378-
void QgsSingleCategoryDiagramRenderer::writeXML( QDomElement& layerElem, QDomDocument& doc ) const
394+
void QgsSingleCategoryDiagramRenderer::writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
379395
{
380396
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 );
383399
layerElem.appendChild( rendererElem );
384400
}
385401

@@ -421,7 +437,7 @@ QSizeF QgsLinearlyInterpolatedDiagramRenderer::diagramSize( const QgsAttributes&
421437
return mDiagram->diagramSize( attributes, c, mSettings, mInterpolationSettings );
422438
}
423439

424-
void QgsLinearlyInterpolatedDiagramRenderer::readXML( const QDomElement& elem )
440+
void QgsLinearlyInterpolatedDiagramRenderer::readXML( const QDomElement& elem, const QgsVectorLayer* layer )
425441
{
426442
mInterpolationSettings.lowerValue = elem.attribute( "lowerValue" ).toDouble();
427443
mInterpolationSettings.upperValue = elem.attribute( "upperValue" ).toDouble();
@@ -433,12 +449,12 @@ void QgsLinearlyInterpolatedDiagramRenderer::readXML( const QDomElement& elem )
433449
QDomElement settingsElem = elem.firstChildElement( "DiagramCategory" );
434450
if ( !settingsElem.isNull() )
435451
{
436-
mSettings.readXML( settingsElem );
452+
mSettings.readXML( settingsElem, layer );
437453
}
438-
_readXML( elem );
454+
_readXML( elem, layer );
439455
}
440456

441-
void QgsLinearlyInterpolatedDiagramRenderer::writeXML( QDomElement& layerElem, QDomDocument& doc ) const
457+
void QgsLinearlyInterpolatedDiagramRenderer::writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const
442458
{
443459
QDomElement rendererElem = doc.createElement( "LinearlyInterpolatedDiagramRenderer" );
444460
rendererElem.setAttribute( "lowerValue", QString::number( mInterpolationSettings.lowerValue ) );
@@ -448,7 +464,7 @@ void QgsLinearlyInterpolatedDiagramRenderer::writeXML( QDomElement& layerElem, Q
448464
rendererElem.setAttribute( "upperWidth", QString::number( mInterpolationSettings.upperSize.width() ) );
449465
rendererElem.setAttribute( "upperHeight", QString::number( mInterpolationSettings.upperSize.height() ) );
450466
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 );
453469
layerElem.appendChild( rendererElem );
454470
}

src/core/qgsdiagramrendererv2.h

Lines changed: 14 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,8 @@ class QDomElement;
3232
class QgsPalGeometry;
3333
class QgsCoordinateTransform;
3434
class QgsMapToPixel;
35+
class QgsVectorLayer;
36+
3537
namespace pal { class Layer; }
3638

3739
class CORE_EXPORT QgsDiagramLayerSettings
@@ -88,8 +90,8 @@ class CORE_EXPORT QgsDiagramLayerSettings
8890
int xPosColumn; //attribute index for x coordinate (or -1 if position not data defined)
8991
int yPosColumn;//attribute index for y coordinate (or -1 if position not data defined)
9092

91-
void readXML( const QDomElement& elem );
92-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
93+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
94+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
9395
};
9496

9597
//diagram settings for rendering
@@ -141,8 +143,8 @@ class CORE_EXPORT QgsDiagramSettings
141143
//! Scale diagrams smaller than mMinimumSize to mMinimumSize
142144
double minimumSize;
143145

144-
void readXML( const QDomElement& elem );
145-
void writeXML( QDomElement& rendererElem, QDomDocument& doc ) const;
146+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
147+
void writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
146148
};
147149

148150
//additional diagram settings for interpolated size rendering
@@ -181,8 +183,8 @@ class CORE_EXPORT QgsDiagramRendererV2
181183
/**Returns list with all diagram settings in the renderer*/
182184
virtual QList<QgsDiagramSettings> diagramSettings() const = 0;
183185

184-
virtual void readXML( const QDomElement& elem ) = 0;
185-
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc ) const = 0;
186+
virtual void readXML( const QDomElement& elem, const QgsVectorLayer* layer ) = 0;
187+
virtual void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const = 0;
186188

187189
protected:
188190

@@ -203,8 +205,8 @@ class CORE_EXPORT QgsDiagramRendererV2
203205
static int dpiPaintDevice( const QPainter* );
204206

205207
//read / write diagram
206-
void _readXML( const QDomElement& elem );
207-
void _writeXML( QDomElement& rendererElem, QDomDocument& doc ) const;
208+
void _readXML( const QDomElement& elem, const QgsVectorLayer* layer );
209+
void _writeXML( QDomElement& rendererElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
208210

209211
/**Reference to the object that does the real diagram rendering*/
210212
QgsDiagram* mDiagram;
@@ -225,8 +227,8 @@ class CORE_EXPORT QgsSingleCategoryDiagramRenderer : public QgsDiagramRendererV2
225227

226228
QList<QgsDiagramSettings> diagramSettings() const;
227229

228-
void readXML( const QDomElement& elem );
229-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
230+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
231+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
230232

231233
protected:
232234
bool diagramSettings( const QgsAttributes&, const QgsRenderContext& c, QgsDiagramSettings& s );
@@ -267,8 +269,8 @@ class CORE_EXPORT QgsLinearlyInterpolatedDiagramRenderer : public QgsDiagramRend
267269
int classificationAttribute() const { return mInterpolationSettings.classificationAttribute; }
268270
void setClassificationAttribute( int index ) { mInterpolationSettings.classificationAttribute = index; }
269271

270-
void readXML( const QDomElement& elem );
271-
void writeXML( QDomElement& layerElem, QDomDocument& doc ) const;
272+
void readXML( const QDomElement& elem, const QgsVectorLayer* layer );
273+
void writeXML( QDomElement& layerElem, QDomDocument& doc, const QgsVectorLayer* layer ) const;
272274

273275
protected:
274276
bool diagramSettings( const QgsAttributes&, const QgsRenderContext& c, QgsDiagramSettings& s );

0 commit comments

Comments
 (0)