2525// qgis includes...
2626// #include <qgisapp.h>
2727#include < diagram/qgspiediagram.h>
28+ #include < diagram/qgstextdiagram.h>
2829#include < qgsdiagramrenderer.h>
2930#include < qgsmaplayer.h>
3031#include < qgsvectordataprovider.h>
3132#include < qgsvectorlayer.h>
3233#include < qgsapplication.h>
3334#include < qgsproviderregistry.h>
3435#include < qgsrenderer.h>
36+ #include " qgssinglesymbolrenderer.h"
3537// qgis test includes
3638#include " qgsmultirenderchecker.h"
3739#include " qgspallabeling.h"
@@ -87,6 +89,14 @@ class TestQgsDiagram : public QObject
8789 mPointsLayer = new QgsVectorLayer ( myPointFileInfo.filePath (),
8890 myPointFileInfo.completeBaseName (), QStringLiteral ( " ogr" ) );
8991
92+ // we don't want to render the points themselves, just the diagrams
93+ QgsStringMap symbolProps;
94+ symbolProps.insert ( " color" , " 0,0,0,0" );
95+ symbolProps.insert ( " outline_style" , " no" );
96+ QgsMarkerSymbol* symbol = QgsMarkerSymbol::createSimple ( symbolProps );
97+ QgsSingleSymbolRenderer* symbolRenderer = new QgsSingleSymbolRenderer ( symbol );
98+ mPointsLayer ->setRenderer ( symbolRenderer );
99+
90100 // Create map composition to draw on
91101 mMapSettings ->setLayers ( QList<QgsMapLayer*>() << mPointsLayer );
92102
@@ -204,6 +214,118 @@ class TestQgsDiagram : public QObject
204214 mPointsLayer ->setDiagramRenderer ( 0 );
205215 }
206216
217+ void testDataDefinedPosition ()
218+ {
219+ QgsDiagramSettings ds;
220+ QColor col1 = Qt::red;
221+ QColor col2 = Qt::yellow;
222+ col1.setAlphaF ( 0.5 );
223+ col2.setAlphaF ( 0.5 );
224+ ds.categoryColors = QList<QColor>() << col1 << col2;
225+ ds.categoryAttributes = QList<QString>() << " \" Pilots\" " << " \" Cabin Crew\" " ;
226+ ds.maxScaleDenominator = -1 ;
227+ ds.minScaleDenominator = -1 ;
228+ ds.minimumSize = 0 ;
229+ ds.penColor = Qt::green;
230+ ds.penWidth = .5 ;
231+ ds.scaleByArea = true ;
232+ ds.sizeType = QgsUnitTypes::RenderMillimeters;
233+ ds.size = QSizeF ( 15 , 15 );
234+ ds.angleOffset = 0 ;
235+
236+ QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer ();
237+ dr->setDiagram ( new QgsPieDiagram () );
238+ dr->setDiagramSettings ( ds );
239+ mPointsLayer ->setDiagramRenderer ( dr );
240+
241+ QgsDiagramLayerSettings dls = QgsDiagramLayerSettings ();
242+ dls.setPlacement ( QgsDiagramLayerSettings::OverPoint );
243+ dls.setShowAllDiagrams ( true );
244+
245+ // Set data defined position
246+ dls.properties ().setProperty ( QgsDiagramLayerSettings::PositionX, new QgsExpressionBasedProperty ( " $x + -5" , true ) );
247+ dls.properties ().setProperty ( QgsDiagramLayerSettings::PositionY, new QgsExpressionBasedProperty ( " $y + 5" , true ) );
248+
249+ mPointsLayer ->setDiagramLayerSettings ( dls );
250+
251+ QVERIFY ( imageCheck ( " piediagram_datadefined_position" ) );
252+ }
253+
254+ void testDataDefinedOutline ()
255+ {
256+ QgsDiagramSettings ds;
257+ QColor col1 = Qt::red;
258+ QColor col2 = Qt::yellow;
259+ col1.setAlphaF ( 0.5 );
260+ col2.setAlphaF ( 0.5 );
261+ ds.categoryColors = QList<QColor>() << col1 << col2;
262+ ds.categoryAttributes = QList<QString>() << " \" Pilots\" " << " \" Cabin Crew\" " ;
263+ ds.maxScaleDenominator = -1 ;
264+ ds.minScaleDenominator = -1 ;
265+ ds.minimumSize = 0 ;
266+ ds.penColor = Qt::green;
267+ ds.penWidth = .5 ;
268+ ds.scaleByArea = true ;
269+ ds.sizeType = QgsUnitTypes::RenderMillimeters;
270+ ds.size = QSizeF ( 15 , 15 );
271+ ds.angleOffset = 0 ;
272+
273+ QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer ();
274+ dr->setDiagram ( new QgsPieDiagram () );
275+ dr->setDiagramSettings ( ds );
276+ mPointsLayer ->setDiagramRenderer ( dr );
277+
278+ QgsDiagramLayerSettings dls = QgsDiagramLayerSettings ();
279+ dls.setPlacement ( QgsDiagramLayerSettings::OverPoint );
280+ dls.setShowAllDiagrams ( true );
281+
282+ // setup data defined outline
283+ dls.properties ().setProperty ( QgsDiagramLayerSettings::OutlineColor, new QgsExpressionBasedProperty ( " if(\" Pilots\" >1,'0,0,0,255','255,0,0,255')" , true ) );
284+ dls.properties ().setProperty ( QgsDiagramLayerSettings::OutlineWidth, new QgsExpressionBasedProperty ( " \" Staff\" / 2.0" , true ) );
285+
286+ mPointsLayer ->setDiagramLayerSettings ( dls );
287+
288+ QVERIFY ( imageCheck ( " piediagram_datadefined_outline" ) );
289+ }
290+
291+
292+ void testDataDefinedBackgroundColor ()
293+ {
294+ QgsDiagramSettings ds;
295+ QColor col1 = Qt::red;
296+ QColor col2 = Qt::yellow;
297+ // hide the text so we are just testing the background color
298+ col1.setAlphaF ( 0 );
299+ col2.setAlphaF ( 0 );
300+ ds.categoryColors = QList<QColor>() << col1 << col2;
301+ ds.categoryAttributes = QList<QString>() << " \" Pilots\" " << " \" Cabin Crew\" " ;
302+ ds.maxScaleDenominator = -1 ;
303+ ds.minScaleDenominator = -1 ;
304+ ds.minimumSize = 0 ;
305+ ds.penColor = Qt::green;
306+ ds.penWidth = .5 ;
307+ ds.scaleByArea = true ;
308+ ds.sizeType = QgsUnitTypes::RenderMillimeters;
309+ ds.size = QSizeF ( 15 , 15 );
310+ ds.angleOffset = 0 ;
311+
312+ QgsSingleCategoryDiagramRenderer *dr = new QgsSingleCategoryDiagramRenderer ();
313+ dr->setDiagram ( new QgsTextDiagram () );
314+ dr->setDiagramSettings ( ds );
315+ mPointsLayer ->setDiagramRenderer ( dr );
316+
317+ QgsDiagramLayerSettings dls = QgsDiagramLayerSettings ();
318+ dls.setPlacement ( QgsDiagramLayerSettings::OverPoint );
319+ dls.setShowAllDiagrams ( true );
320+
321+ // setup data defined outline
322+ dls.properties ().setProperty ( QgsDiagramLayerSettings::BackgroundColor, new QgsExpressionBasedProperty ( " if(\" Pilots\" >1,'0,0,255,150','255,0,0,150')" , true ) );
323+
324+ mPointsLayer ->setDiagramLayerSettings ( dls );
325+
326+ QVERIFY ( imageCheck ( " textdiagram_datadefined_background" ) );
327+ }
328+
207329};
208330
209331bool TestQgsDiagram::imageCheck ( const QString& theTestType )
@@ -215,13 +337,14 @@ bool TestQgsDiagram::imageCheck( const QString& theTestType )
215337 mMapSettings ->setExtent ( extent );
216338 mMapSettings ->setFlag ( QgsMapSettings::ForceVectorOutput );
217339 mMapSettings ->setOutputDpi ( 96 );
218- QgsMultiRenderChecker myChecker;
219- myChecker.setControlName ( " expected_" + theTestType );
220- myChecker.setMapSettings ( *mMapSettings );
221- myChecker.setColorTolerance ( 15 );
222- bool myResultFlag = myChecker.runTest ( theTestType, 200 );
223- mReport += myChecker.report ();
224- return myResultFlag;
340+ QgsMultiRenderChecker checker;
341+ checker.setControlPathPrefix ( " diagrams" );
342+ checker.setControlName ( " expected_" + theTestType );
343+ checker.setMapSettings ( *mMapSettings );
344+ checker.setColorTolerance ( 15 );
345+ bool resultFlag = checker.runTest ( theTestType, 200 );
346+ mReport += checker.report ();
347+ return resultFlag;
225348}
226349
227350QGSTEST_MAIN ( TestQgsDiagram )
0 commit comments