Skip to content

Commit 0cab6b3

Browse files
committedAug 22, 2015
Port renderers to expression contexts
1 parent d6d6827 commit 0cab6b3

19 files changed

+90
-21
lines changed
 

‎src/app/qgsmaptoolrotatepointsymbols.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,8 @@ void QgsMapToolRotatePointSymbols::canvasPressEvent( QMouseEvent *e )
110110
if ( !renderer )
111111
return;
112112
QgsRenderContext context = QgsRenderContext::fromMapSettings( mCanvas->mapSettings() );
113+
context.expressionContext() << QgsExpressionContextUtils::layerScope( mActiveLayer );
114+
context.expressionContext().setFeature( pointFeature );
113115
renderer->startRender( context, mActiveLayer->fields() );
114116

115117
//find all rotation fields used by renderer for feature

‎src/app/qgsmaptoolselectutils.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
137137
QgsDebugMsg( "doDifference: " + QString( doDifference ? "T" : "F" ) );
138138

139139
QgsRenderContext context = QgsRenderContext::fromMapSettings( canvas->mapSettings() );
140+
context.expressionContext() << QgsExpressionContextUtils::layerScope( vlayer );
140141
QgsFeatureRendererV2* r = vlayer->rendererV2();
141142
if ( r )
142143
r->startRender( context, vlayer->fields() );
@@ -158,6 +159,7 @@ void QgsMapToolSelectUtils::setSelectFeatures( QgsMapCanvas* canvas,
158159
double closestFeatureDist = std::numeric_limits<double>::max();
159160
while ( fit.nextFeature( f ) )
160161
{
162+
context.expressionContext().setFeature( f );
161163
// make sure to only use features that are visible
162164
if ( r && !r->willRenderFeature( f, context ) )
163165
continue;

‎src/core/dxf/qgsdxfexport.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -934,6 +934,7 @@ void QgsDxfExport::writeEntities()
934934
QgsFeature fet;
935935
while ( featureIt.nextFeature( fet ) )
936936
{
937+
ctx.expressionContext().setFeature( fet );
937938
QString layerName( dxfLayerName( layerIt->second == -1 ? vl->name() : fet.attribute( layerIt->second ).toString() ) );
938939

939940
sctx.setFeature( &fet );
@@ -1002,6 +1003,9 @@ void QgsDxfExport::writeEntitiesSymbolLevels( QgsVectorLayer* layer )
10021003
QHash< QgsSymbolV2*, QList<QgsFeature> > features;
10031004

10041005
QgsRenderContext ctx = renderContext();
1006+
ctx.expressionContext() << QgsExpressionContextUtils::globalScope()
1007+
<< QgsExpressionContextUtils::projectScope()
1008+
<< QgsExpressionContextUtils::layerScope( layer );
10051009
QgsSymbolV2RenderContext sctx( ctx, QgsSymbolV2::MM, 1.0, false, 0, 0 );
10061010
renderer->startRender( ctx, layer->fields() );
10071011

@@ -1023,6 +1027,7 @@ void QgsDxfExport::writeEntitiesSymbolLevels( QgsVectorLayer* layer )
10231027
QgsSymbolV2* featureSymbol = 0;
10241028
while ( fit.nextFeature( fet ) )
10251029
{
1030+
ctx.expressionContext().setFeature( fet );
10261031
featureSymbol = renderer->symbolForFeature( fet, ctx );
10271032
if ( !featureSymbol )
10281033
{

‎src/core/qgsmaphittest.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@ void QgsMapHitTest::run()
4242
context.setExtent( mSettings.outputExtentToLayerExtent( vl, mSettings.visibleExtent() ) );
4343
}
4444

45+
context.expressionContext() << QgsExpressionContextUtils::layerScope( vl );
4546
SymbolV2Set& usedSymbols = mHitTest[vl];
4647
runHitTestLayer( vl, usedSymbols, context );
4748
}
@@ -61,6 +62,7 @@ void QgsMapHitTest::runHitTestLayer( QgsVectorLayer* vl, SymbolV2Set& usedSymbol
6162
QgsFeatureIterator fi = vl->getFeatures( request );
6263
while ( fi.nextFeature( f ) )
6364
{
65+
context.expressionContext().setFeature( f );
6466
if ( moreSymbolsPerFeature )
6567
{
6668
foreach ( QgsSymbolV2* s, r->originalSymbolsForFeature( f, context ) )

‎src/core/qgsvectorfilewriter.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,6 +1573,7 @@ bool QgsVectorFileWriter::addFeature( QgsFeature& feature, QgsFeatureRendererV2*
15731573
//add OGR feature style type
15741574
if ( mSymbologyExport != NoSymbology && renderer )
15751575
{
1576+
mRenderContext.expressionContext().setFeature( feature );
15761577
//SymbolLayerSymbology: concatenate ogr styles of all symbollayers
15771578
QgsSymbolV2List symbols = renderer->symbolsForFeature( feature, mRenderContext );
15781579
QString styleString;
@@ -2500,6 +2501,11 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels
25002501
if ( !layer )
25012502
return ErrInvalidLayer;
25022503

2504+
mRenderContext.expressionContext() = QgsExpressionContext();
2505+
mRenderContext.expressionContext() << QgsExpressionContextUtils::globalScope()
2506+
<< QgsExpressionContextUtils::projectScope()
2507+
<< QgsExpressionContextUtils::layerScope( layer );
2508+
25032509
QgsFeatureRendererV2 *renderer = layer->rendererV2();
25042510
if ( !renderer )
25052511
return ErrInvalidLayer;
@@ -2540,6 +2546,7 @@ QgsVectorFileWriter::WriterError QgsVectorFileWriter::exportFeaturesSymbolLevels
25402546
return ErrProjection;
25412547
}
25422548
}
2549+
mRenderContext.expressionContext().setFeature( fet );
25432550

25442551
featureSymbol = renderer->symbolForFeature( fet, mRenderContext );
25452552
if ( !featureSymbol )

‎src/core/qgsvectorlayer.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -718,11 +718,16 @@ bool QgsVectorLayer::countSymbolFeatures( bool showProgress )
718718
// Renderer (rule based) may depend on context scale, with scale is ignored if 0
719719
QgsRenderContext renderContext;
720720
renderContext.setRendererScale( 0 );
721+
renderContext.expressionContext() << QgsExpressionContextUtils::globalScope()
722+
<< QgsExpressionContextUtils::projectScope()
723+
<< QgsExpressionContextUtils::layerScope( this );
724+
721725
mRendererV2->startRender( renderContext, fields() );
722726

723727
QgsFeature f;
724728
while ( fit.nextFeature( f ) )
725729
{
730+
renderContext.expressionContext().setFeature( f );
726731
QgsSymbolV2List featureSymbolList = mRendererV2->originalSymbolsForFeature( f, renderContext );
727732
for ( QgsSymbolV2List::iterator symbolIt = featureSymbolList.begin(); symbolIt != featureSymbolList.end(); ++symbolIt )
728733
{

‎src/core/qgsvectorlayerrenderer.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ void QgsVectorLayerRenderer::drawRendererV2Levels( QgsFeatureIterator& fit )
348348
return;
349349
}
350350

351+
mContext.expressionContext().setFeature( fet );
351352
QgsSymbolV2* sym = mRendererV2->symbolForFeature( fet, mContext );
352353
if ( !sym )
353354
{

‎src/core/symbology-ng/qgscategorizedsymbolrendererv2.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -211,8 +211,8 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::symbolForFeature( QgsFeature& featu
211211
return symbol; // no data-defined rotation/scaling - just return the symbol
212212

213213
// find out rotation, size scale
214-
const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0;
215-
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.;
214+
const double rotation = mRotation.data() ? mRotation->evaluate( &context.expressionContext() ).toDouble() : 0;
215+
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( &context.expressionContext() ).toDouble() : 1.;
216216

217217
// take a temporary symbol (or create it if doesn't exist)
218218
QgsSymbolV2* tempSymbol = mTempSymbols[symbol];
@@ -243,7 +243,7 @@ QgsSymbolV2* QgsCategorizedSymbolRendererV2::originalSymbolForFeature( QgsFeatur
243243
if ( mAttrNum == -1 )
244244
{
245245
Q_ASSERT( mExpression.data() );
246-
value = mExpression->evaluate( &feature );
246+
value = mExpression->evaluate( &context.expressionContext() );
247247
}
248248
else
249249
{
@@ -409,7 +409,7 @@ void QgsCategorizedSymbolRendererV2::startRender( QgsRenderContext& context, con
409409
if ( mAttrNum == -1 )
410410
{
411411
mExpression.reset( new QgsExpression( mAttrName ) );
412-
mExpression->prepare( fields );
412+
mExpression->prepare( &context.expressionContext() );
413413
}
414414

415415
QgsCategoryList::iterator it = mCategories.begin();

‎src/core/symbology-ng/qgsgraduatedsymbolrendererv2.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -326,8 +326,8 @@ QgsSymbolV2* QgsGraduatedSymbolRendererV2::symbolForFeature( QgsFeature& feature
326326
return symbol; // no data-defined rotation/scaling - just return the symbol
327327

328328
// find out rotation, size scale
329-
const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0;
330-
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.;
329+
const double rotation = mRotation.data() ? mRotation->evaluate( &context.expressionContext() ).toDouble() : 0;
330+
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( &context.expressionContext() ).toDouble() : 1.;
331331

332332
// take a temporary symbol (or create it if doesn't exist)
333333
QgsSymbolV2* tempSymbol = mTempSymbols[symbol];
@@ -355,7 +355,7 @@ QgsSymbolV2* QgsGraduatedSymbolRendererV2::originalSymbolForFeature( QgsFeature&
355355
QVariant value;
356356
if ( mAttrNum < 0 || mAttrNum >= attrs.count() )
357357
{
358-
value = mExpression->evaluate( &feature );
358+
value = mExpression->evaluate( &context.expressionContext() );
359359
}
360360
else
361361
{
@@ -380,7 +380,7 @@ void QgsGraduatedSymbolRendererV2::startRender( QgsRenderContext& context, const
380380
if ( mAttrNum == -1 )
381381
{
382382
mExpression.reset( new QgsExpression( mAttrName ) );
383-
mExpression->prepare( fields );
383+
mExpression->prepare( &context.expressionContext() );
384384
}
385385

386386
QgsRangeList::iterator it = mRanges.begin();

‎src/core/symbology-ng/qgsheatmaprenderer.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ void QgsHeatmapRenderer::startRender( QgsRenderContext& context, const QgsFields
7676
if ( mWeightAttrNum == -1 )
7777
{
7878
mWeightExpression.reset( new QgsExpression( mWeightExpressionString ) );
79-
mWeightExpression->prepare( fields );
79+
mWeightExpression->prepare( &context.expressionContext() );
8080
}
8181

8282
initializeValues( context );
@@ -122,7 +122,7 @@ bool QgsHeatmapRenderer::renderFeature( QgsFeature& feature, QgsRenderContext& c
122122
if ( mWeightAttrNum == -1 )
123123
{
124124
Q_ASSERT( mWeightExpression.data() );
125-
value = mWeightExpression->evaluate( &feature );
125+
value = mWeightExpression->evaluate( &context.expressionContext() );
126126
}
127127
else
128128
{

‎src/core/symbology-ng/qgsrendererv2.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -234,6 +234,7 @@ QgsFeatureRendererV2* QgsFeatureRendererV2::defaultRenderer( QGis::GeometryType
234234
QgsSymbolV2* QgsFeatureRendererV2::symbolForFeature( QgsFeature& feature )
235235
{
236236
QgsRenderContext context;
237+
context.setExpressionContext( QgsExpressionContextUtils::createFeatureBasedContext( feature, QgsFields() ) );
237238
return symbolForFeature( feature, context );
238239
}
239240

‎src/core/symbology-ng/qgsrulebasedrendererv2.cpp

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -233,12 +233,13 @@ QgsLegendSymbolListV2 QgsRuleBasedRendererV2::Rule::legendSymbolItemsV2( int cur
233233
}
234234

235235

236-
bool QgsRuleBasedRendererV2::Rule::isFilterOK( QgsFeature& f, QgsRenderContext * ) const
236+
bool QgsRuleBasedRendererV2::Rule::isFilterOK( QgsFeature& f, QgsRenderContext* context ) const
237237
{
238238
if ( ! mFilter || mElseRule )
239239
return true;
240240

241-
QVariant res = mFilter->evaluate( &f );
241+
context->expressionContext().setFeature( f );
242+
QVariant res = mFilter->evaluate( context ? &context->expressionContext() : 0 );
242243
return res.toInt() != 0;
243244
}
244245

@@ -409,7 +410,7 @@ bool QgsRuleBasedRendererV2::Rule::startRender( QgsRenderContext& context, const
409410

410411
// init this rule
411412
if ( mFilter )
412-
mFilter->prepare( fields );
413+
mFilter->prepare( &context.expressionContext() );
413414
if ( mSymbol )
414415
mSymbol->startRender( context, &fields );
415416

‎src/core/symbology-ng/qgssinglesymbolrendererv2.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,11 +47,11 @@ QgsSingleSymbolRendererV2::~QgsSingleSymbolRendererV2()
4747

4848
QgsSymbolV2* QgsSingleSymbolRendererV2::symbolForFeature( QgsFeature& feature, QgsRenderContext &context )
4949
{
50-
Q_UNUSED( context );
50+
context.expressionContext().setFeature( feature );
5151
if ( !mRotation.data() && !mSizeScale.data() ) return mSymbol.data();
5252

53-
const double rotation = mRotation.data() ? mRotation->evaluate( feature ).toDouble() : 0;
54-
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( feature ).toDouble() : 1.;
53+
const double rotation = mRotation.data() ? mRotation->evaluate( &context.expressionContext() ).toDouble() : 0;
54+
const double sizeScale = mSizeScale.data() ? mSizeScale->evaluate( &context.expressionContext() ).toDouble() : 1.;
5555

5656
if ( mTempSymbol->type() == QgsSymbolV2::Marker )
5757
{

‎src/gui/attributetable/qgsattributetablefiltermodel.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,9 @@ void QgsAttributeTableFilterModel::generateListOfVisibleFeatures()
230230
bool filter = false;
231231
QgsRectangle rect = mCanvas->mapSettings().mapToLayerCoordinates( layer(), mCanvas->extent() );
232232
QgsRenderContext renderContext;
233+
renderContext.expressionContext() << QgsExpressionContextUtils::globalScope()
234+
<< QgsExpressionContextUtils::projectScope()
235+
<< QgsExpressionContextUtils::layerScope( layer() );
233236
QgsFeatureRendererV2* renderer = layer()->rendererV2();
234237

235238
mFilteredFeatures.clear();
@@ -280,6 +283,7 @@ void QgsAttributeTableFilterModel::generateListOfVisibleFeatures()
280283

281284
while ( features.nextFeature( f ) )
282285
{
286+
renderContext.expressionContext().setFeature( f );
283287
if ( !filter || renderer->willRenderFeature( f, renderContext ) )
284288
{
285289
mFilteredFeatures << f.id();

‎src/gui/qgsmaptoolidentify.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -244,6 +244,7 @@ bool QgsMapToolIdentify::identifyVectorLayer( QList<IdentifyResult> *results, Qg
244244
bool filter = false;
245245

246246
QgsRenderContext context( QgsRenderContext::fromMapSettings( mCanvas->mapSettings() ) );
247+
context.expressionContext() << QgsExpressionContextUtils::layerScope( layer );
247248
QgsFeatureRendererV2* renderer = layer->rendererV2();
248249
if ( renderer && renderer->capabilities() & QgsFeatureRendererV2::ScaleDependent )
249250
{
@@ -257,6 +258,7 @@ bool QgsMapToolIdentify::identifyVectorLayer( QList<IdentifyResult> *results, Qg
257258
QMap< QString, QString > derivedAttributes = commonDerivedAttributes;
258259

259260
QgsFeatureId fid = f_it->id();
261+
context.expressionContext().setFeature( *f_it );
260262

261263
if ( filter && !renderer->willRenderFeature( *f_it, context ) )
262264
continue;

‎src/gui/symbology-ng/qgscategorizedsymbolrendererv2widget.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -646,12 +646,18 @@ void QgsCategorizedSymbolRendererV2Widget::addCategories()
646646
{
647647
// Lets assume it's an expression
648648
QgsExpression* expression = new QgsExpression( attrName );
649-
expression->prepare( mLayer->fields() );
649+
QgsExpressionContext context;
650+
context << QgsExpressionContextUtils::globalScope()
651+
<< QgsExpressionContextUtils::projectScope()
652+
<< QgsExpressionContextUtils::layerScope( mLayer );
653+
654+
expression->prepare( &context );
650655
QgsFeatureIterator fit = mLayer->getFeatures();
651656
QgsFeature feature;
652657
while ( fit.nextFeature( feature ) )
653658
{
654-
QVariant value = expression->evaluate( feature );
659+
context.setFeature( feature );
660+
QVariant value = expression->evaluate( &context );
655661
if ( unique_vals.contains( value ) )
656662
continue;
657663
unique_vals << value;

‎src/gui/symbology-ng/qgsrulebasedrendererv2widget.cpp

Lines changed: 17 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,14 @@ void QgsRuleBasedRendererV2Widget::countFeatures()
504504

505505
QgsRenderContext renderContext;
506506
renderContext.setRendererScale( 0 ); // ignore scale
507+
508+
QgsExpressionContext context;
509+
context << QgsExpressionContextUtils::globalScope()
510+
<< QgsExpressionContextUtils::projectScope()
511+
<< QgsExpressionContextUtils::layerScope( mLayer );
512+
513+
renderContext.setExpressionContext( context );
514+
507515
mRenderer->startRender( renderContext, mLayer->fields() );
508516

509517
int nFeatures = mLayer->featureCount();
@@ -514,6 +522,7 @@ void QgsRuleBasedRendererV2Widget::countFeatures()
514522
QgsFeature f;
515523
while ( fit.nextFeature( f ) )
516524
{
525+
renderContext.expressionContext().setFeature( f );
517526
QgsRuleBasedRendererV2::RuleList featureRuleList = mRenderer->rootRule()->rulesForFeature( f, &renderContext );
518527

519528
foreach ( QgsRuleBasedRendererV2::Rule* rule, featureRuleList )
@@ -633,9 +642,12 @@ void QgsRendererRulePropsDialog::testFilter()
633642
return;
634643
}
635644

636-
const QgsFields& fields = mLayer->fields();
645+
QgsExpressionContext context;
646+
context << QgsExpressionContextUtils::globalScope()
647+
<< QgsExpressionContextUtils::projectScope()
648+
<< QgsExpressionContextUtils::layerScope( mLayer );
637649

638-
if ( !filter.prepare( fields ) )
650+
if ( !filter.prepare( &context ) )
639651
{
640652
QMessageBox::critical( this, tr( "Evaluation error" ), filter.evalErrorString() );
641653
return;
@@ -649,7 +661,9 @@ void QgsRendererRulePropsDialog::testFilter()
649661
QgsFeature f;
650662
while ( fit.nextFeature( f ) )
651663
{
652-
QVariant value = filter.evaluate( &f );
664+
context.setFeature( f );
665+
666+
QVariant value = filter.evaluate( &context );
653667
if ( value.toInt() != 0 )
654668
count++;
655669
if ( filter.hasEvalError() )

‎src/server/qgswmsserver.cpp

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -949,6 +949,7 @@ void QgsWMSServer::runHitTestLayer( QgsVectorLayer* vl, SymbolV2Set& usedSymbols
949949
QgsFeatureIterator fi = vl->getFeatures( request );
950950
while ( fi.nextFeature( f ) )
951951
{
952+
context.expressionContext().setFeature( f );
952953
if ( moreSymbolsPerFeature )
953954
{
954955
foreach ( QgsSymbolV2* s, r->originalSymbolsForFeature( f, context ) )
@@ -2073,6 +2074,8 @@ int QgsWMSServer::featureInfoFromVectorLayer( QgsVectorLayer* layer,
20732074
continue;
20742075
}
20752076

2077+
renderContext.expressionContext().setFeature( feature );
2078+
20762079
//check if feature is rendered at all
20772080
r2->startRender( renderContext, layer->pendingFields() );
20782081
bool renderV2 = r2->willRenderFeature( feature, renderContext );
@@ -2683,6 +2686,13 @@ void QgsWMSServer::applyOpacities( const QStringList& layerList, QList< QPair< Q
26832686
vectorRenderers.push_back( qMakePair( vl, rendererV2->clone() ) );
26842687
//modify symbols of current renderer
26852688
QgsRenderContext context;
2689+
context.expressionContext() << QgsExpressionContextUtils::globalScope()
2690+
<< QgsExpressionContextUtils::projectScope();
2691+
if ( vl )
2692+
{
2693+
context.expressionContext() << QgsExpressionContextUtils::layerScope( vl );
2694+
}
2695+
26862696
QgsSymbolV2List symbolList = rendererV2->symbols( context );
26872697
QgsSymbolV2List::iterator symbolIt = symbolList.begin();
26882698
for ( ; symbolIt != symbolList.end(); ++symbolIt )

‎tests/src/core/testqgsrulebasedrenderer.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -84,18 +84,25 @@ class TestQgsRuleBasedRenderer: public QObject
8484
QVERIFY( r.capabilities() & QgsFeatureRendererV2::MoreSymbolsPerFeature );
8585

8686
QgsRenderContext ctx; // dummy render context
87+
ctx.expressionContext().setFields( layer->fields() );
8788
r.startRender( ctx, layer->fields() );
8889

8990
// test willRenderFeature
91+
ctx.expressionContext().setFeature( f1 );
9092
QVERIFY( r.willRenderFeature( f1, ctx ) );
93+
ctx.expressionContext().setFeature( f2 );
9194
QVERIFY( r.willRenderFeature( f2, ctx ) );
95+
ctx.expressionContext().setFeature( f3 );
9296
QVERIFY( !r.willRenderFeature( f3, ctx ) );
9397

9498
// test symbolsForFeature
99+
ctx.expressionContext().setFeature( f1 );
95100
QgsSymbolV2List lst1 = r.symbolsForFeature( f1, ctx );
96101
QVERIFY( lst1.count() == 1 );
102+
ctx.expressionContext().setFeature( f2 );
97103
QgsSymbolV2List lst2 = r.symbolsForFeature( f2, ctx );
98104
QVERIFY( lst2.count() == 2 );
105+
ctx.expressionContext().setFeature( f3 );
99106
QgsSymbolV2List lst3 = r.symbolsForFeature( f3, ctx );
100107
QVERIFY( lst3.count() == 0 );
101108

0 commit comments

Comments
 (0)
Please sign in to comment.