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 ) )

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

Lines changed: 43 additions & 0 deletions
Large diffs are not rendered by default.

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

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -471,6 +471,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
471471
bool hasStrokeWidthExpression = false;
472472
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) )
473473
{
474+
context.setOriginalValueVariable( mWidth );
474475
double scaledWidth = QgsSymbolLayerV2Utils::convertToPainterUnits( context.renderContext(),
475476
evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context, mWidth ).toDouble(),
476477
mWidthUnit, mWidthMapUnitScale );
@@ -483,6 +484,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
483484
bool ok;
484485
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
485486
{
487+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( pen.color() ) );
486488
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR, context, QVariant(), &ok ).toString();
487489
if ( ok )
488490
pen.setColor( QgsSymbolLayerV2Utils::decodeColor( colorString ) );
@@ -491,6 +493,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
491493
//offset
492494
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) )
493495
{
496+
context.setOriginalValueVariable( mOffset );
494497
offset = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, context, offset ).toDouble();
495498
}
496499

@@ -531,6 +534,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
531534
//line style
532535
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINE_STYLE ) )
533536
{
537+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePenStyle( pen.style() ) );
534538
QString lineStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_LINE_STYLE, context, QVariant(), &ok ).toString();
535539
if ( ok )
536540
pen.setStyle( QgsSymbolLayerV2Utils::decodePenStyle( lineStyleString ) );
@@ -539,6 +543,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
539543
//join style
540544
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_JOINSTYLE ) )
541545
{
546+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePenJoinStyle( pen.joinStyle() ) );
542547
QString joinStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_JOINSTYLE, context, QVariant(), &ok ).toString();
543548
if ( ok )
544549
pen.setJoinStyle( QgsSymbolLayerV2Utils::decodePenJoinStyle( joinStyleString ) );
@@ -547,6 +552,7 @@ void QgsSimpleLineSymbolLayerV2::applyDataDefinedSymbology( QgsSymbolV2RenderCon
547552
//cap style
548553
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_CAPSTYLE ) )
549554
{
555+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePenCapStyle( pen.capStyle() ) );
550556
QString capStyleString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_CAPSTYLE, context, QVariant(), &ok ).toString();
551557
if ( ok )
552558
pen.setCapStyle( QgsSymbolLayerV2Utils::decodePenCapStyle( capStyleString ) );
@@ -583,6 +589,7 @@ double QgsSimpleLineSymbolLayerV2::dxfWidth( const QgsDxfExport& e, QgsSymbolV2R
583589

584590
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH ) )
585591
{
592+
context.setOriginalValueVariable( mWidth );
586593
width = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_WIDTH, context, mWidth ).toDouble() * e.mapUnitScaleFactor( e.symbologyScaleDenominator(), widthUnit(), e.mapUnits() );
587594
}
588595
else if ( context.renderHints() & QgsSymbolV2::DataDefinedSizeScale )
@@ -598,6 +605,7 @@ QColor QgsSimpleLineSymbolLayerV2::dxfColor( QgsSymbolV2RenderContext& context )
598605
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
599606
{
600607
bool ok;
608+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mColor ) );
601609
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR, context, QVariant(), &ok ).toString();
602610
if ( ok )
603611
return ( QgsSymbolLayerV2Utils::decodeColor( colorString ) );
@@ -612,6 +620,7 @@ double QgsSimpleLineSymbolLayerV2::dxfOffset( const QgsDxfExport& e, QgsSymbolV2
612620

613621
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) )
614622
{
623+
context.setOriginalValueVariable( mOffset );
615624
offset = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, context, mOffset ).toDouble();
616625
}
617626
return offset;
@@ -805,6 +814,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolyline( const QPolygonF& points, QgsSym
805814

806815
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) )
807816
{
817+
context.setOriginalValueVariable( mOffset );
808818
offset = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, context, mOffset ).toDouble();
809819
}
810820

@@ -909,6 +919,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points
909919

910920
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_INTERVAL ) )
911921
{
922+
context.setOriginalValueVariable( mInterval );
912923
interval = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_INTERVAL, context, mInterval ).toDouble();
913924
}
914925
if ( interval <= 0 )
@@ -918,6 +929,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineInterval( const QPolygonF& points
918929
double offsetAlongLine = mOffsetAlongLine;
919930
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE ) )
920931
{
932+
context.setOriginalValueVariable( mOffsetAlongLine );
921933
offsetAlongLine = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE, context, mOffsetAlongLine ).toDouble();
922934
}
923935

@@ -992,6 +1004,7 @@ void QgsMarkerLineSymbolLayerV2::renderPolylineVertex( const QPolygonF& points,
9921004
double offsetAlongLine = mOffsetAlongLine;
9931005
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE ) )
9941006
{
1007+
context.setOriginalValueVariable( mOffsetAlongLine );
9951008
offsetAlongLine = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET_ALONG_LINE, context, mOffsetAlongLine ).toDouble();
9961009
}
9971010
if ( offsetAlongLine != 0 )

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

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -473,6 +473,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
473473
bool ok = true;
474474
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE ) )
475475
{
476+
context.setOriginalValueVariable( mSize );
476477
scaledSize = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE, context, mSize, &ok ).toDouble();
477478
}
478479

@@ -499,6 +500,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
499500
bool usingDataDefinedRotation = false;
500501
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
501502
{
503+
context.setOriginalValueVariable( angle );
502504
angle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE, context, mAngle, &ok ).toDouble() + mLineAngle;
503505
usingDataDefinedRotation = ok;
504506
}
@@ -530,6 +532,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
530532
bool createdNewPath = false;
531533
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME ) )
532534
{
535+
context.setOriginalValueVariable( mName );
533536
QString name = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME, context, QVariant(), &ok ).toString();
534537
if ( ok )
535538
{
@@ -571,12 +574,14 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
571574

572575
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
573576
{
577+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mBrush.color() ) );
574578
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR, context, QVariant(), &ok ).toString();
575579
if ( ok )
576580
mBrush.setColor( QgsSymbolLayerV2Utils::decodeColor( colorString ) );
577581
}
578582
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR_BORDER ) )
579583
{
584+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mPen.color() ) );
580585
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR_BORDER, context, QVariant(), &ok ).toString();
581586
if ( ok )
582587
{
@@ -586,6 +591,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
586591
}
587592
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
588593
{
594+
context.setOriginalValueVariable( mOutlineWidth );
589595
double outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, context, QVariant(), &ok ).toDouble();
590596
if ( ok )
591597
{
@@ -595,6 +601,7 @@ void QgsSimpleMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV
595601
}
596602
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_STYLE ) )
597603
{
604+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePenStyle( mOutlineStyle ) );
598605
QString outlineStyle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_STYLE, context, QVariant(), &ok ).toString();
599606
if ( ok )
600607
{
@@ -815,6 +822,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
815822
{
816823
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE ) )
817824
{
825+
context->setOriginalValueVariable( mSize );
818826
size = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE, *context, mSize, &ok ).toDouble();
819827
}
820828

@@ -843,6 +851,7 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
843851

844852
if ( context && hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
845853
{
854+
context->setOriginalValueVariable( mOutlineWidth );
846855
outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, *context, mOutlineWidth ).toDouble();
847856
}
848857
if ( mSizeUnit == QgsSymbolV2::MM )
@@ -855,12 +864,14 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
855864
QColor bc = mBrush.color();
856865
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
857866
{
867+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( bc ) );
858868
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR, *context, QVariant(), &ok ).toString();
859869
if ( ok )
860870
bc = QgsSymbolLayerV2Utils::decodeColor( colorString );
861871
}
862872
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR_BORDER ) )
863873
{
874+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( pc ) );
864875
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR_BORDER, *context, QVariant(), &ok ).toString();
865876
if ( ok )
866877
pc = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -879,12 +890,14 @@ bool QgsSimpleMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitSc
879890
double angle = mAngle + mLineAngle;
880891
if ( context && hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
881892
{
893+
context->setOriginalValueVariable( mAngle );
882894
angle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE, *context, mAngle ).toDouble() + mLineAngle;
883895
}
884896

885897
QString name( mName );
886898
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME ) )
887899
{
900+
context->setOriginalValueVariable( mName );
888901
name = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME, *context, QVariant(), &ok ).toString();
889902
}
890903

@@ -1197,6 +1210,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
11971210
bool ok = true;
11981211
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE ) )
11991212
{
1213+
context.setOriginalValueVariable( mSize );
12001214
scaledSize = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE, context, mSize, &ok ).toDouble();
12011215
}
12021216

@@ -1231,6 +1245,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
12311245
double angle = mAngle + mLineAngle;
12321246
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
12331247
{
1248+
context.setOriginalValueVariable( mAngle );
12341249
angle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE, context, mAngle ).toDouble() + mLineAngle;
12351250
}
12361251

@@ -1265,18 +1280,21 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
12651280
QString path = mPath;
12661281
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME ) )
12671282
{
1283+
context.setOriginalValueVariable( mPath );
12681284
path = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME, context, mPath ).toString();
12691285
}
12701286

12711287
double outlineWidth = mOutlineWidth;
12721288
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
12731289
{
1290+
context.setOriginalValueVariable( mOutlineWidth );
12741291
outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, context, mOutlineWidth ).toDouble();
12751292
}
12761293

12771294
QColor fillColor = mFillColor;
12781295
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL ) )
12791296
{
1297+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mFillColor ) );
12801298
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL, context, QVariant(), &ok ).toString();
12811299
if ( ok )
12821300
fillColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -1285,6 +1303,7 @@ void QgsSvgMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2Re
12851303
QColor outlineColor = mOutlineColor;
12861304
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE ) )
12871305
{
1306+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mOutlineColor ) );
12881307
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE, context, QVariant(), &ok ).toString();
12891308
if ( ok )
12901309
outlineColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -1510,6 +1529,7 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
15101529
bool ok = true;
15111530
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE ) )
15121531
{
1532+
context->setOriginalValueVariable( mSize );
15131533
size = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE, *context, mSize, &ok ).toDouble();
15141534
}
15151535

@@ -1537,6 +1557,7 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
15371557

15381558
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) )
15391559
{
1560+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePoint( mOffset ) );
15401561
QString offsetString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, *context, QVariant(), &ok ).toString();
15411562
if ( ok )
15421563
offset = QgsSymbolLayerV2Utils::decodePoint( offsetString );
@@ -1554,6 +1575,7 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
15541575
double angle = mAngle + mLineAngle;
15551576
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
15561577
{
1578+
context->setOriginalValueVariable( mAngle );
15571579
angle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE, *context, mAngle ).toDouble() + mLineAngle;
15581580
}
15591581
//angle = -angle; //rotation in Qt is counterclockwise
@@ -1563,18 +1585,21 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
15631585
QString path = mPath;
15641586
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME ) )
15651587
{
1588+
context->setOriginalValueVariable( mPath );
15661589
path = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_NAME, *context, mPath ).toString();
15671590
}
15681591

15691592
double outlineWidth = mOutlineWidth;
15701593
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH ) )
15711594
{
1595+
context->setOriginalValueVariable( mOutlineWidth );
15721596
outlineWidth = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE_WIDTH, *context, mOutlineWidth ).toDouble();
15731597
}
15741598

15751599
QColor fillColor = mFillColor;
15761600
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL ) )
15771601
{
1602+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mFillColor ) );
15781603
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_FILL, *context, QVariant(), &ok ).toString();
15791604
if ( ok )
15801605
fillColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -1583,6 +1608,7 @@ bool QgsSvgMarkerSymbolLayerV2::writeDxf( QgsDxfExport& e, double mmMapUnitScale
15831608
QColor outlineColor = mOutlineColor;
15841609
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE ) )
15851610
{
1611+
context->setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mOutlineColor ) );
15861612
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OUTLINE, *context, QVariant(), &ok ).toString();
15871613
if ( ok )
15881614
outlineColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -1716,6 +1742,7 @@ void QgsFontMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2R
17161742
bool ok;
17171743
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR ) )
17181744
{
1745+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodeColor( mColor ) );
17191746
QString colorString = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_COLOR, context, QVariant(), &ok ).toString();
17201747
if ( ok )
17211748
penColor = QgsSymbolLayerV2Utils::decodeColor( colorString );
@@ -1732,6 +1759,7 @@ void QgsFontMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2R
17321759
QString charToRender = mChr;
17331760
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_CHAR ) )
17341761
{
1762+
context.setOriginalValueVariable( mChr );
17351763
charToRender = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_CHAR, context, mChr ).toString();
17361764
if ( charToRender != mChr )
17371765
{
@@ -1746,6 +1774,7 @@ void QgsFontMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2R
17461774
ok = true;
17471775
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE ) )
17481776
{
1777+
context.setOriginalValueVariable( mSize );
17491778
scaledSize = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_SIZE, context, mSize, &ok ).toDouble();
17501779
}
17511780

@@ -1770,6 +1799,7 @@ void QgsFontMarkerSymbolLayerV2::renderPoint( const QPointF& point, QgsSymbolV2R
17701799
double angle = mAngle + mLineAngle;
17711800
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE ) )
17721801
{
1802+
context.setOriginalValueVariable( mAngle );
17731803
angle = evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_ANGLE, context, mAngle ).toDouble() + mLineAngle;
17741804
}
17751805

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -542,6 +542,7 @@ void QgsMarkerSymbolLayerV2::markerOffset( QgsSymbolV2RenderContext& context, do
542542

543543
if ( hasDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET ) )
544544
{
545+
context.setOriginalValueVariable( QgsSymbolLayerV2Utils::encodePoint( mOffset ) );
545546
QPointF offset = QgsSymbolLayerV2Utils::decodePoint( evaluateDataDefinedProperty( QgsSymbolLayerV2::EXPR_OFFSET, context ).toString() );
546547
offsetX = offset.x();
547548
offsetY = offset.y();

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -504,6 +504,10 @@ QgsSymbolV2RenderContext::~QgsSymbolV2RenderContext()
504504

505505
}
506506

507+
void QgsSymbolV2RenderContext::setOriginalValueVariable( const QVariant& value )
508+
{
509+
mRenderContext.expressionContext().setOriginalValueVariable( value );
510+
}
507511

508512
double QgsSymbolV2RenderContext::outputLineWidth( double width ) const
509513
{

‎src/core/symbology-ng/qgssymbolv2.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,13 @@ class CORE_EXPORT QgsSymbolV2RenderContext
254254
QgsRenderContext& renderContext() { return mRenderContext; }
255255
const QgsRenderContext& renderContext() const { return mRenderContext; }
256256

257+
/** Sets the original value variable value for data defined symbology
258+
* @param value value for original value variable. This usually represents the symbol property value
259+
* before any data defined overrides have been applied.
260+
* @note added in QGIS 2.12
261+
*/
262+
void setOriginalValueVariable( const QVariant& value );
263+
257264
QgsSymbolV2::OutputUnit outputUnit() const { return mOutputUnit; }
258265
void setOutputUnit( QgsSymbolV2::OutputUnit u ) { mOutputUnit = u; }
259266

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

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

76+
//TODO - show actual value
77+
expContext.setOriginalValueVariable( QVariant() );
78+
expContext.setHighlightedVariables( QStringList() << QgsExpressionContext::EXPR_ORIGINAL_VALUE );
79+
7680
return expContext;
7781
}
7882

0 commit comments

Comments
 (0)
Please sign in to comment.