Skip to content

Commit 59c43f1

Browse files
committedSep 15, 2015
[composer] Fix data defined map style/layer set, add test
(fallout from expression contexts)
1 parent 481d2c0 commit 59c43f1

File tree

3 files changed

+47
-10
lines changed

3 files changed

+47
-10
lines changed
 

‎src/core/composer/qgscomposermap.cpp

Lines changed: 18 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -198,6 +198,8 @@ QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, const QS
198198
{
199199
const QgsMapSettings &ms = mComposition->mapSettings();
200200

201+
QScopedPointer< QgsExpressionContext > expressionContext( createExpressionContext() );
202+
201203
QgsMapSettings jobMapSettings;
202204
jobMapSettings.setExtent( extent );
203205
jobMapSettings.setOutputSize( size.toSize() );
@@ -208,7 +210,7 @@ QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, const QS
208210
jobMapSettings.setRotation( mEvaluatedMapRotation );
209211

210212
//set layers to render
211-
QStringList theLayerSet = layersToRender();
213+
QStringList theLayerSet = layersToRender( expressionContext.data() );
212214
if ( -1 != mCurrentExportLayer )
213215
{
214216
//exporting with separate layers (eg, to svg layers), so we only want to render a single map layer
@@ -219,7 +221,7 @@ QgsMapSettings QgsComposerMap::mapSettings( const QgsRectangle& extent, const QS
219221
: QStringList(); //exporting decorations such as map frame/grid/overview, so no map layers required
220222
}
221223
jobMapSettings.setLayers( theLayerSet );
222-
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender() );
224+
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender( *expressionContext ) );
223225
jobMapSettings.setDestinationCrs( ms.destinationCrs() );
224226
jobMapSettings.setCrsTransformEnabled( ms.hasCrsTransformEnabled() );
225227
jobMapSettings.setFlags( ms.flags() );
@@ -523,12 +525,20 @@ const QgsMapRenderer *QgsComposerMap::mapRenderer() const
523525
Q_NOWARN_DEPRECATED_POP
524526
}
525527

526-
QStringList QgsComposerMap::layersToRender() const
528+
QStringList QgsComposerMap::layersToRender( const QgsExpressionContext* context ) const
527529
{
530+
const QgsExpressionContext* evalContext = context;
531+
QScopedPointer< QgsExpressionContext > scopedContext;
532+
if ( !evalContext )
533+
{
534+
scopedContext.reset( createExpressionContext() );
535+
evalContext = scopedContext.data();
536+
}
537+
528538
QStringList renderLayerSet;
529539

530540
QVariant exprVal;
531-
if ( dataDefinedEvaluate( QgsComposerObject::MapStylePreset, exprVal ) )
541+
if ( dataDefinedEvaluate( QgsComposerObject::MapStylePreset, exprVal, *evalContext ) )
532542
{
533543
QString presetName = exprVal.toString();
534544

@@ -549,7 +559,7 @@ QStringList QgsComposerMap::layersToRender() const
549559
}
550560
}
551561

552-
if ( dataDefinedEvaluate( QgsComposerObject::MapLayers, exprVal ) )
562+
if ( dataDefinedEvaluate( QgsComposerObject::MapLayers, exprVal, *evalContext ) )
553563
{
554564
renderLayerSet.clear();
555565

@@ -583,10 +593,10 @@ QStringList QgsComposerMap::layersToRender() const
583593
return renderLayerSet;
584594
}
585595

586-
QMap<QString, QString> QgsComposerMap::layerStyleOverridesToRender() const
596+
QMap<QString, QString> QgsComposerMap::layerStyleOverridesToRender( const QgsExpressionContext& context ) const
587597
{
588598
QVariant exprVal;
589-
if ( dataDefinedEvaluate( QgsComposerObject::MapStylePreset, exprVal ) )
599+
if ( dataDefinedEvaluate( QgsComposerObject::MapStylePreset, exprVal, context ) )
590600
{
591601
QString presetName = exprVal.toString();
592602

@@ -2175,7 +2185,7 @@ void QgsComposerMap::refreshDataDefinedProperty( const QgsComposerObject::DataDe
21752185
property == QgsComposerObject::AllProperties )
21762186
{
21772187
QgsRectangle beforeExtent = *currentMapExtent();
2178-
refreshMapExtents();
2188+
refreshMapExtents( evalContext );
21792189
emit itemChanged();
21802190
if ( *currentMapExtent() != beforeExtent )
21812191
{

‎src/core/composer/qgscomposermap.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -921,10 +921,10 @@ class CORE_EXPORT QgsComposerMap : public QgsComposerItem
921921
void updateToolTip();
922922

923923
/** Returns a list of the layers to render for this map item*/
924-
QStringList layersToRender() const;
924+
QStringList layersToRender( const QgsExpressionContext* context = 0 ) const;
925925

926926
/** Returns current layer style overrides for this map item*/
927-
QMap<QString, QString> layerStyleOverridesToRender() const;
927+
QMap<QString, QString> layerStyleOverridesToRender( const QgsExpressionContext& context ) const;
928928

929929
/** Returns extent that considers mOffsetX / mOffsetY (during content move)*/
930930
QgsRectangle transformedExtent() const;

‎tests/src/core/testqgscomposermap.cpp

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
#include "qgsmultibandcolorrenderer.h"
2525
#include "qgsrasterlayer.h"
2626
#include "qgsvectorlayer.h"
27+
#include "qgsvectordataprovider.h"
2728
#include "qgsproject.h"
2829
#include "qgsvisibilitypresetcollection.h"
2930
#include <QObject>
@@ -288,6 +289,32 @@ void TestQgsComposerMap::dataDefinedLayers()
288289
result = mComposerMap->layersToRender();
289290
QVERIFY( result.isEmpty() );
290291

292+
293+
//test with atlas feature evaluation
294+
QgsVectorLayer* atlasLayer = new QgsVectorLayer( "Point?field=col1:string", "atlas", "memory" );
295+
QVERIFY( atlasLayer->isValid() );
296+
QgsFeature f1( atlasLayer->dataProvider()->fields(), 1 );
297+
f1.setAttribute( "col1", mLinesLayer->name() );
298+
QgsFeature f2( atlasLayer->dataProvider()->fields(), 1 );
299+
f2.setAttribute( "col1", mPointsLayer->name() );
300+
atlasLayer->dataProvider()->addFeatures( QgsFeatureList() << f1 << f2 );
301+
mComposition->atlasComposition().setCoverageLayer( atlasLayer );
302+
mComposition->atlasComposition().setEnabled( true );
303+
mComposition->setAtlasMode( QgsComposition::ExportAtlas );
304+
mComposition->atlasComposition().beginRender();
305+
mComposition->atlasComposition().prepareForFeature( 0 );
306+
307+
mComposerMap->setDataDefinedProperty( QgsComposerObject::MapLayers, true, true, QString( "\"col1\"" ), QString() );
308+
result = mComposerMap->layersToRender();
309+
QCOMPARE( result.count(), 1 );
310+
QCOMPARE( result.at( 0 ), mLinesLayer->id() );
311+
mComposition->atlasComposition().prepareForFeature( 1 );
312+
result = mComposerMap->layersToRender();
313+
QCOMPARE( result.count(), 1 );
314+
QCOMPARE( result.at( 0 ), mPointsLayer->id() );
315+
mComposition->atlasComposition().setEnabled( false );
316+
delete atlasLayer;
317+
291318
//render test
292319
mComposerMap->setDataDefinedProperty( QgsComposerObject::MapLayers, true, true,
293320
QString( "'%1|%2'" ).arg( mPolysLayer->name() ).arg( mPointsLayer->name() ), QString() );

0 commit comments

Comments
 (0)
Please sign in to comment.