Skip to content

Commit fdfb804

Browse files
committedAug 22, 2015
Port some GUI classes to expression contexts
1 parent 89a362c commit fdfb804

File tree

6 files changed

+50
-14
lines changed

6 files changed

+50
-14
lines changed
 

‎src/gui/editorwidgets/qgsrelationreferencewidget.cpp

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -263,7 +263,12 @@ void QgsRelationReferenceWidget::setForeignKey( const QVariant& value )
263263
if ( mReadOnlySelector )
264264
{
265265
QgsExpression expr( mReferencedLayer->displayExpression() );
266-
QString title = expr.evaluate( &mFeature ).toString();
266+
QgsExpressionContext context;
267+
context << QgsExpressionContextUtils::globalScope()
268+
<< QgsExpressionContextUtils::projectScope()
269+
<< QgsExpressionContextUtils::layerScope( mReferencedLayer );
270+
context.setFeature( mFeature );
271+
QString title = expr.evaluate( &context ).toString();
267272
if ( expr.hasEvalError() )
268273
{
269274
title = mFeature.attribute( mFkeyFieldIdx ).toString();
@@ -688,7 +693,12 @@ void QgsRelationReferenceWidget::featureIdentified( const QgsFeature& feature )
688693
if ( mReadOnlySelector )
689694
{
690695
QgsExpression expr( mReferencedLayer->displayExpression() );
691-
QString title = expr.evaluate( &feature ).toString();
696+
QgsExpressionContext context;
697+
context << QgsExpressionContextUtils::globalScope()
698+
<< QgsExpressionContextUtils::projectScope()
699+
<< QgsExpressionContextUtils::layerScope( mReferencedLayer );
700+
context.setFeature( feature );
701+
QString title = expr.evaluate( &context ).toString();
692702
if ( expr.hasEvalError() )
693703
{
694704
title = feature.attribute( mFkeyFieldIdx ).toString();

‎src/gui/editorwidgets/qgsvaluerelationwidgetwrapper.cpp

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -217,11 +217,16 @@ QgsValueRelationWidgetWrapper::ValueRelationCache QgsValueRelationWidgetWrapper:
217217
int ki = layer->fieldNameIndex( config.value( "Key" ).toString() );
218218
int vi = layer->fieldNameIndex( config.value( "Value" ).toString() );
219219

220+
QgsExpressionContext context;
221+
context << QgsExpressionContextUtils::globalScope()
222+
<< QgsExpressionContextUtils::projectScope()
223+
<< QgsExpressionContextUtils::layerScope( layer );
224+
220225
QgsExpression *e = 0;
221226
if ( !config.value( "FilterExpression" ).toString().isEmpty() )
222227
{
223228
e = new QgsExpression( config.value( "FilterExpression" ).toString() );
224-
if ( e->hasParserError() || !e->prepare( layer->fields() ) )
229+
if ( e->hasParserError() || !e->prepare( &context ) )
225230
ki = -1;
226231
}
227232

@@ -263,7 +268,8 @@ QgsValueRelationWidgetWrapper::ValueRelationCache QgsValueRelationWidgetWrapper:
263268
QgsFeature f;
264269
while ( fit.nextFeature( f ) )
265270
{
266-
if ( e && !e->evaluate( &f ).toBool() )
271+
context.setFeature( f );
272+
if ( e && !e->evaluate( &context ).toBool() )
267273
continue;
268274

269275
cache.append( ValueRelationItem( f.attribute( ki ), f.attribute( vi ).toString() ) );

‎src/gui/qgsfieldexpressionwidget.cpp

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,10 @@ QgsFieldExpressionWidget::QgsFieldExpressionWidget( QWidget *parent )
5656
connect( mButton, SIGNAL( clicked() ), this, SLOT( editExpression() ) );
5757
// NW TODO - Fix in 2.6
5858
// connect( mCombo->lineEdit(), SIGNAL( returnPressed() ), this, SIGNAL( returnPressed() ) );
59+
60+
mExpressionContext.reset( new QgsExpressionContext() );
61+
mExpressionContext->appendScope( QgsExpressionContextUtils::globalScope() );
62+
mExpressionContext->appendScope( QgsExpressionContextUtils::projectScope() );
5963
}
6064

6165
void QgsFieldExpressionWidget::setExpressionDialogTitle( QString title )
@@ -96,8 +100,7 @@ QString QgsFieldExpressionWidget::currentText() const
96100
bool QgsFieldExpressionWidget::isValidExpression( QString *expressionError ) const
97101
{
98102
QString temp;
99-
QgsVectorLayer* vl = layer();
100-
return QgsExpression::isValid( currentText(), vl ? vl->fields() : QgsFields(), expressionError ? *expressionError : temp );
103+
return QgsExpression::isValid( currentText(), mExpressionContext.data(), expressionError ? *expressionError : temp );
101104
}
102105

103106
bool QgsFieldExpressionWidget::isExpression() const
@@ -135,6 +138,12 @@ void QgsFieldExpressionWidget::setLayer( QgsMapLayer *layer )
135138

136139
void QgsFieldExpressionWidget::setLayer( QgsVectorLayer *layer )
137140
{
141+
mExpressionContext.reset( new QgsExpressionContext() );
142+
mExpressionContext->appendScope( QgsExpressionContextUtils::globalScope() );
143+
mExpressionContext->appendScope( QgsExpressionContextUtils::projectScope() );
144+
if ( layer )
145+
mExpressionContext->appendScope( QgsExpressionContextUtils::layerScope( layer ) );
146+
138147
mFieldProxyModel->sourceFieldModel()->setLayer( layer );
139148
}
140149

@@ -269,9 +278,7 @@ void QgsFieldExpressionWidget::updateLineEditStyle( const QString expression )
269278

270279
bool QgsFieldExpressionWidget::isExpressionValid( const QString expressionStr )
271280
{
272-
QgsVectorLayer* vl = layer();
273-
274281
QgsExpression expression( expressionStr );
275-
expression.prepare( vl ? vl->fields() : QgsFields() );
282+
expression.prepare( mExpressionContext.data() );
276283
return !expression.hasParserError();
277284
}

‎src/gui/qgsfieldexpressionwidget.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,7 @@ class GUI_EXPORT QgsFieldExpressionWidget : public QWidget
137137
QgsFieldProxyModel* mFieldProxyModel;
138138
QString mExpressionDialogTitle;
139139
QSharedPointer<const QgsDistanceArea> mDa;
140+
QScopedPointer< QgsExpressionContext > mExpressionContext;
140141
};
141142

142143
#endif // QGSFIELDEXPRESSIONWIDGET_H

‎src/gui/qgssearchquerybuilder.cpp

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -199,9 +199,13 @@ long QgsSearchQueryBuilder::countRecords( QString searchString )
199199

200200
int count = 0;
201201
QgsFeature feat;
202-
const QgsFields& fields = mLayer->fields();
203202

204-
if ( !search.prepare( fields ) )
203+
QgsExpressionContext context;
204+
context << QgsExpressionContextUtils::globalScope()
205+
<< QgsExpressionContextUtils::projectScope()
206+
<< QgsExpressionContextUtils::layerScope( mLayer );
207+
208+
if ( !search.prepare( &context ) )
205209
{
206210
QMessageBox::critical( this, tr( "Evaluation error" ), search.evalErrorString() );
207211
return -1;
@@ -213,7 +217,8 @@ long QgsSearchQueryBuilder::countRecords( QString searchString )
213217

214218
while ( fit.nextFeature( feat ) )
215219
{
216-
QVariant value = search.evaluate( &feat );
220+
context.setFeature( feat );
221+
QVariant value = search.evaluate( &context );
217222
if ( value.toInt() != 0 )
218223
{
219224
count++;

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

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -207,7 +207,13 @@ void QgsSizeScaleWidget::computeFromLayerTriggered()
207207
return;
208208

209209
QgsExpression expression( mExpressionWidget->currentField() );
210-
if ( ! expression.prepare( mLayer->fields() ) )
210+
211+
QgsExpressionContext context;
212+
context << QgsExpressionContextUtils::globalScope()
213+
<< QgsExpressionContextUtils::projectScope()
214+
<< QgsExpressionContextUtils::layerScope( mLayer );
215+
216+
if ( ! expression.prepare( &context ) )
211217
return;
212218

213219
QStringList lst( expression.referencedColumns() );
@@ -225,7 +231,8 @@ void QgsSizeScaleWidget::computeFromLayerTriggered()
225231
while ( fit.nextFeature( f ) )
226232
{
227233
bool ok;
228-
const double value = expression.evaluate( f ).toDouble( &ok );
234+
context.setFeature( f );
235+
const double value = expression.evaluate( &context ).toDouble( &ok );
229236
if ( ok )
230237
{
231238
max = qMax( max, value );

0 commit comments

Comments
 (0)
Please sign in to comment.