Skip to content

Commit a8f8cfe

Browse files
committedOct 1, 2015
Finish implementation of @value context variable
1 parent 5cfdea5 commit a8f8cfe

15 files changed

+226
-67
lines changed
 

‎python/core/qgsexpressioncontext.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,13 @@ class QgsExpressionContext
376376
*/
377377
QgsFields fields() const;
378378

379+
/** Sets the original value variable value for the context.
380+
* @param value value for original value variable. This usually represents the an original widget
381+
* value before any data defined overrides have been applied.
382+
* @note added in QGIS 2.12
383+
*/
384+
void setOriginalValueVariable( const QVariant& value );
385+
379386
};
380387

381388
/** \ingroup core

‎python/core/symbology-ng/qgssymbolv2.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -188,6 +188,13 @@ class QgsSymbolV2RenderContext
188188
QgsRenderContext& renderContext();
189189
//void setRenderContext( QgsRenderContext& c );
190190

191+
/** Sets the original value variable value for data defined symbology
192+
* @param value value for original value variable. This usually represents the symbol property value
193+
* before any data defined overrides have been applied.
194+
* @note added in QGIS 2.12
195+
*/
196+
void setOriginalValueVariable( const QVariant& value );
197+
191198
QgsSymbolV2::OutputUnit outputUnit() const;
192199
void setOutputUnit( QgsSymbolV2::OutputUnit u );
193200

‎src/app/qgslabelinggui.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,10 @@ static QgsExpressionContext _getExpressionContext( const void* context )
5050
if ( layer )
5151
expContext << QgsExpressionContextUtils::layerScope( layer );
5252

53+
//TODO - show actual value
54+
expContext.setOriginalValueVariable( QVariant() );
55+
expContext.setHighlightedVariables( QStringList() << QgsExpressionContext::EXPR_ORIGINAL_VALUE );
56+
5357
return expContext;
5458
}
5559

‎src/core/qgsexpressioncontext.cpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@
3131

3232
const QString QgsExpressionContext::EXPR_FIELDS( "_fields_" );
3333
const QString QgsExpressionContext::EXPR_FEATURE( "_feature_" );
34+
const QString QgsExpressionContext::EXPR_ORIGINAL_VALUE( "value" );
3435

3536
//
3637
// QgsExpressionContextScope
@@ -413,6 +414,14 @@ QgsFields QgsExpressionContext::fields() const
413414
return qvariant_cast<QgsFields>( variable( QgsExpressionContext::EXPR_FIELDS ) );
414415
}
415416

417+
void QgsExpressionContext::setOriginalValueVariable( const QVariant &value )
418+
{
419+
if ( mStack.isEmpty() )
420+
mStack.append( new QgsExpressionContextScope() );
421+
422+
mStack.last()->setVariable( QgsExpressionContext::EXPR_ORIGINAL_VALUE, value );
423+
}
424+
416425

417426
//
418427
// QgsExpressionContextUtils

‎src/core/qgsexpressioncontext.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -410,8 +410,16 @@ class CORE_EXPORT QgsExpressionContext
410410
*/
411411
QgsFields fields() const;
412412

413+
/** Sets the original value variable value for the context.
414+
* @param value value for original value variable. This usually represents the an original widget
415+
* value before any data defined overrides have been applied.
416+
* @note added in QGIS 2.12
417+
*/
418+
void setOriginalValueVariable( const QVariant& value );
419+
413420
static const QString EXPR_FIELDS;
414421
static const QString EXPR_FEATURE;
422+
static const QString EXPR_ORIGINAL_VALUE;
415423

416424
private:
417425

‎src/core/qgspallabeling.cpp

Lines changed: 72 additions & 65 deletions
Large diffs are not rendered by default.

‎src/core/qgspallabeling.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -531,7 +531,7 @@ class CORE_EXPORT QgsPalLayerSettings
531531
* @returns true/false whether result is null or invalid
532532
* @note not available in python bindings
533533
*/
534-
bool dataDefinedEvaluate( QgsPalLayerSettings::DataDefinedProperties p, QVariant& exprVal, const QgsExpressionContext* context = 0 ) const;
534+
bool dataDefinedEvaluate( QgsPalLayerSettings::DataDefinedProperties p, QVariant& exprVal, QgsExpressionContext* context = 0, QVariant originalValue = QVariant() ) const;
535535

536536
/** Whether data definition is active
537537
*/
@@ -624,7 +624,7 @@ class CORE_EXPORT QgsPalLayerSettings
624624
// convenience data defined evaluation function
625625
bool dataDefinedValEval( DataDefinedValueType valType,
626626
QgsPalLayerSettings::DataDefinedProperties p,
627-
QVariant& exprVal, const QgsExpressionContext& context );
627+
QVariant& exprVal, QgsExpressionContext &context, QVariant originalValue = QVariant() );
628628

629629
void parseTextStyle( QFont& labelFont,
630630
QgsPalLayerSettings::SizeUnit fontunits,

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,12 +207,14 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
207207
bool ok;
208208
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
209209
{
210+
context.setOriginalValueVariable( mOutlineWidth );
210211
double width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, context, mOutlineWidth ).toDouble();
211212
width = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(), width, mOutlineWidthUnit, mOutlineWidthMapUnitScale );
212213
mPen.setWidthF( width );
213214
}
214215
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_STYLE ) )
215216
{
217+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePenStyle( mPen.style() ) );
216218
QString styleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_STYLE, context, QVariant(), &ok ).toString();
217219
if ( ok )
218220
{
@@ -222,12 +224,14 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
222224
}
223225
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR ) )
224226
{
227+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mBrush.color() ) );
225228
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR, context, QVariant(), &ok ).toString();
226229
if ( ok )
227230
mBrush.setColor( QgsSymbolLayerV2Utils::decodeColor( colorString ) );
228231
}
229232
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_COLOR ) )
230233
{
234+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mPen.color() ) );
231235
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_COLOR, context, QVariant(), &ok ).toString();
232236
if ( ok )
233237
mPen.setColor( QgsSymbolLayerV2Utils::decodeColor( colorString ) );
@@ -239,6 +243,7 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
239243
QString symbolName = mSymbolName;
240244
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SYMBOL_NAME ) )
241245
{
246+
context.setOriginalValueVariable( mSymbolName );
242247
symbolName = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SYMBOL_NAME, context, mSymbolName ).toString();
243248
}
244249
preparePath( symbolName, context, &scaledWidth, &scaledHeight, context.feature() );
@@ -260,6 +265,7 @@ void QgsEllipseSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Rend
260265
double rotation = 0.0;
261266
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ROTATION ) )
262267
{
268+
context.setOriginalValueVariable( mAngle );
263269
rotation = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ROTATION, context, mAngle ).toDouble() + mLineAngle;
264270
}
265271
else if ( !qgsDoubleNear( mAngle + mLineAngle, 0.0 ) )
@@ -462,6 +468,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
462468

463469
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) ) //1. priority: data defined setting on symbol layer le
464470
{
471+
context.setOriginalValueVariable( mSymbolWidth );
465472
width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context, mSymbolWidth ).toDouble();
466473
}
467474
else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level
@@ -481,6 +488,7 @@ void QgsEllipseSymbolLayerV2::preparePath( const QString& symbolName, QgsSymbolV
481488
double height = 0;
482489
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_HEIGHT ) ) //1. priority: data defined setting on symbol layer level
483490
{
491+
context.setOriginalValueVariable( mSymbolHeight );
484492
height = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_HEIGHT, context, mSymbolHeight ).toDouble();
485493
}
486494
else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level
@@ -565,6 +573,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
565573

566574
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) ) //1. priority: data defined setting on symbol layer le
567575
{
576+
context->setOriginalValueVariable( mSymbolWidth );
568577
symbolWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, *context, mSymbolWidth ).toDouble();
569578
}
570579
else if ( context->renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level
@@ -580,6 +589,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
580589
double symbolHeight = mSymbolHeight;
581590
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_HEIGHT ) ) //1. priority: data defined setting on symbol layer level
582591
{
592+
context->setOriginalValueVariable( mSymbolHeight );
583593
symbolHeight = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_HEIGHT, *context, mSymbolHeight ).toDouble();
584594
}
585595
else if ( context->renderHints() & QgsSymbolV2::DataDefinedSizeScale ) //2. priority: is data defined size on symbol level
@@ -596,6 +606,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
596606

597607
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
598608
{
609+
context->setOriginalValueVariable( mOutlineWidth );
599610
outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, *context, mOutlineWidth ).toDouble();
600611
}
601612
if ( mOutlineWidthUnit == QgsSymbolV2::MM )
@@ -608,6 +619,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
608619
QColor fc = mFillColor;
609620
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR ) )
610621
{
622+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mFillColor ) );
611623
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL_COLOR, *context, QVariant(), &ok ).toString();
612624
if ( ok )
613625
fc = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -617,6 +629,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
617629
QColor oc = mOutlineColor;
618630
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_COLOR ) )
619631
{
632+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mOutlineColor ) );
620633
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_COLOR, *context, QVariant(), &ok ).toString();
621634
if ( ok )
622635
oc = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -626,6 +639,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
626639
QString symbolName = mSymbolName;
627640
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SYMBOL_NAME ) )
628641
{
642+
context->setOriginalValueVariable( mSymbolName );
629643
symbolName = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SYMBOL_NAME, *context, mSymbolName ).toString();
630644
}
631645

@@ -639,6 +653,7 @@ bool QgsEllipseSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScaleFa
639653
double rotation = 0.0;
640654
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ROTATION ) )
641655
{
656+
context->setOriginalValueVariable( mAngle );
642657
rotation = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ROTATION, *context, mAngle ).toDouble() + mLineAngle;
643658
}
644659
else if ( !qgsDoubleNear( mAngle + mLineAngle, 0.0 ) )

0 commit comments

Comments
 (0)
Please sign in to comment.