@@ -3062,7 +3062,9 @@ QStringList QgsComposition::customProperties() const
30623062 return mCustomProperties .keys ();
30633063}
30643064
3065- bool QgsComposition::dataDefinedEvaluate ( QgsComposerObject::DataDefinedProperty property, QVariant &expressionValue, QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties )
3065+ bool QgsComposition::dataDefinedEvaluate ( QgsComposerObject::DataDefinedProperty property, QVariant &expressionValue,
3066+ const QgsExpressionContext& context,
3067+ QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties )
30663068{
30673069 if ( property == QgsComposerObject::NoProperty || property == QgsComposerObject::AllProperties )
30683070 {
@@ -3092,7 +3094,7 @@ bool QgsComposition::dataDefinedEvaluate( QgsComposerObject::DataDefinedProperty
30923094 }
30933095
30943096 // evaluate data defined property using current atlas context
3095- QVariant result = dataDefinedValue ( property, useFeature ? ¤tFeature : 0 , layerFields, dataDefinedProperties );
3097+ QVariant result = dataDefinedValue ( property, useFeature ? ¤tFeature : 0 , layerFields, context, dataDefinedProperties );
30963098
30973099 if ( result.isValid () )
30983100 {
@@ -3132,7 +3134,7 @@ bool QgsComposition::dataDefinedActive( const QgsComposerObject::DataDefinedProp
31323134 return dd->isActive ();
31333135}
31343136
3135- QVariant QgsComposition::dataDefinedValue ( QgsComposerObject::DataDefinedProperty property, const QgsFeature *feature, const QgsFields& fields, QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties ) const
3137+ QVariant QgsComposition::dataDefinedValue ( QgsComposerObject::DataDefinedProperty property, const QgsFeature *feature, const QgsFields& fields, const QgsExpressionContext& context, QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties ) const
31363138{
31373139 if ( property == QgsComposerObject::AllProperties || property == QgsComposerObject::NoProperty )
31383140 {
@@ -3168,14 +3170,14 @@ QVariant QgsComposition::dataDefinedValue( QgsComposerObject::DataDefinedPropert
31683170
31693171 if ( !dd->expressionIsPrepared () )
31703172 {
3171- prepareDataDefinedExpression ( dd, dataDefinedProperties );
3173+ prepareDataDefinedExpression ( dd, dataDefinedProperties, context );
31723174 }
31733175
31743176 if ( useExpression && dd->expressionIsPrepared () )
31753177 {
31763178 QgsExpression* expr = dd->expression ();
31773179
3178- result = expr->evaluate ( feature );
3180+ result = expr->evaluate ( &context );
31793181 if ( expr->hasEvalError () )
31803182 {
31813183 QgsDebugMsgLevel ( QString ( " Evaluate error:" ) + expr->evalErrorString (), 4 );
@@ -3198,34 +3200,42 @@ QVariant QgsComposition::dataDefinedValue( QgsComposerObject::DataDefinedPropert
31983200 return result;
31993201}
32003202
3201- void QgsComposition::prepareDataDefinedExpression ( QgsDataDefined *dd, QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties ) const
3203+ void QgsComposition::prepareDataDefinedExpression ( QgsDataDefined *dd, QMap<QgsComposerObject::DataDefinedProperty, QgsDataDefined *> *dataDefinedProperties,
3204+ const QgsExpressionContext& context ) const
32023205{
3203- QgsVectorLayer* atlasLayer = 0 ;
3204-
3205- if ( mAtlasComposition .enabled () )
3206- {
3207- atlasLayer = mAtlasComposition .coverageLayer ();
3208- }
3209-
32103206 // if specific QgsDataDefined passed, prepare it
32113207 // otherwise prepare all QgsDataDefineds
32123208 if ( dd )
32133209 {
3214- dd->prepareExpression ( atlasLayer );
3210+ dd->prepareExpression ( context );
32153211 }
32163212 else
32173213 {
32183214 QMap< QgsComposerObject::DataDefinedProperty, QgsDataDefined* >::const_iterator it = dataDefinedProperties->constBegin ();
32193215 for ( ; it != dataDefinedProperties->constEnd (); ++it )
32203216 {
3221- it.value ()->prepareExpression ( atlasLayer );
3217+ it.value ()->prepareExpression ( context );
32223218 }
32233219 }
32243220}
32253221
3222+ QgsExpressionContext* QgsComposition::createExpressionContext () const
3223+ {
3224+ QgsExpressionContext* context = new QgsExpressionContext ();
3225+ context->appendScope ( QgsExpressionContextUtils::globalScope () );
3226+ context->appendScope ( QgsExpressionContextUtils::projectScope () );
3227+ context->appendScope ( QgsExpressionContextUtils::compositionScope ( this ) );
3228+ if ( mAtlasComposition .enabled () )
3229+ {
3230+ context->appendScope ( QgsExpressionContextUtils::atlasScope ( &mAtlasComposition ) );
3231+ }
3232+ return context;
3233+ }
3234+
32263235void QgsComposition::prepareAllDataDefinedExpressions ()
32273236{
3228- prepareDataDefinedExpression ( 0 , &mDataDefinedProperties );
3237+ QScopedPointer< QgsExpressionContext > context ( createExpressionContext () );
3238+ prepareDataDefinedExpression ( 0 , &mDataDefinedProperties , *context.data () );
32293239}
32303240
32313241void QgsComposition::relativeResizeRect ( QRectF& rectToResize, const QRectF& boundsBefore, const QRectF& boundsAfter )
0 commit comments