Skip to content

Commit 39f0035

Browse files
committed
Improve preview of current variable value in expression builder
1 parent 0356752 commit 39f0035

File tree

5 files changed

+60
-51
lines changed

5 files changed

+60
-51
lines changed

python/core/qgsexpression.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -692,6 +692,14 @@ class QgsExpression
692692
*/
693693
static QString group( const QString& group );
694694

695+
/** Formats an expression result for friendly display to the user. Truncates the result to a sensible
696+
* length, and presents text representations of non numeric/text types (eg geometries and features).
697+
* @param value expression result to format
698+
* @returns formatted string, may contain HTML formatting characters
699+
* @note added in QGIS 2.14
700+
*/
701+
static QString formatPreviewString( const QVariant& value );
702+
695703
protected:
696704
void initGeomCalculator();
697705
};

src/core/qgsexpression.cpp

Lines changed: 42 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4561,13 +4561,9 @@ QString QgsExpression::variableHelpText( const QString &variableName, bool showV
45614561
{
45624562
valueString = QCoreApplication::translate( "variable_help", "not set" );
45634563
}
4564-
else if ( value.type() == QVariant::String )
4565-
{
4566-
valueString = QString( "'<b>%1</b>'" ).arg( value.toString() );
4567-
}
45684564
else
45694565
{
4570-
valueString = QString( "<b>%1</b>" ).arg( value.toString() );
4566+
valueString = QString( "<b>%1</b>" ).arg( formatPreviewString( value ) );
45714567
}
45724568
text.append( QCoreApplication::translate( "variable_help", "<p>Current value: %1</p>" ).arg( valueString ) );
45734569
}
@@ -4602,6 +4598,47 @@ QString QgsExpression::group( const QString& name )
46024598
return gGroups.value( name, name );
46034599
}
46044600

4601+
QString QgsExpression::formatPreviewString( const QVariant& value )
4602+
{
4603+
if ( value.canConvert<QgsGeometry>() )
4604+
{
4605+
//result is a geometry
4606+
QgsGeometry geom = value.value<QgsGeometry>();
4607+
if ( geom.isEmpty() )
4608+
return tr( "<i>&lt;empty geometry&gt;</i>" );
4609+
else
4610+
return tr( "<i>&lt;geometry: %1&gt;</i>" ).arg( QgsWKBTypes::displayString( geom.geometry()->wkbType() ) );
4611+
}
4612+
else if ( value.canConvert< QgsFeature >() )
4613+
{
4614+
//result is a feature
4615+
QgsFeature feat = value.value<QgsFeature>();
4616+
return tr( "<i>&lt;feature: %1&gt;</i>" ).arg( feat.id() );
4617+
}
4618+
else if ( value.canConvert< QgsExpression::Interval >() )
4619+
{
4620+
//result is a feature
4621+
QgsExpression::Interval interval = value.value<QgsExpression::Interval>();
4622+
return tr( "<i>&lt;interval: %1 days&gt;</i>" ).arg( interval.days() );
4623+
}
4624+
else if ( value.type() == QVariant::String )
4625+
{
4626+
QString previewString = value.toString();
4627+
if ( previewString.length() > 63 )
4628+
{
4629+
return QString( tr( "'%1...'" ) ).arg( previewString.left( 60 ) );
4630+
}
4631+
else
4632+
{
4633+
return previewString.prepend( '\'' ).append( '\'' );
4634+
}
4635+
}
4636+
else
4637+
{
4638+
return value.toString();
4639+
}
4640+
}
4641+
46054642
QVariant QgsExpression::Function::func( const QVariantList& values, const QgsFeature* feature, QgsExpression* parent )
46064643
{
46074644
//default implementation creates a QgsFeatureBasedExpressionContext

src/core/qgsexpression.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,14 @@ class CORE_EXPORT QgsExpression
10521052
*/
10531053
static QString group( const QString& group );
10541054

1055+
/** Formats an expression result for friendly display to the user. Truncates the result to a sensible
1056+
* length, and presents text representations of non numeric/text types (eg geometries and features).
1057+
* @param value expression result to format
1058+
* @returns formatted string, may contain HTML formatting characters
1059+
* @note added in QGIS 2.14
1060+
*/
1061+
static QString formatPreviewString( const QVariant& value );
1062+
10551063
protected:
10561064
/**
10571065
* Used by QgsOgcUtils to create an empty

src/gui/qgsexpressionbuilderwidget.cpp

Lines changed: 2 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,7 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
557557
mExpressionContext.setFeature( mFeature );
558558
QVariant value = exp.evaluate( &mExpressionContext );
559559
if ( !exp.hasEvalError() )
560-
lblPreview->setText( formatPreviewString( value ) );
560+
lblPreview->setText( QgsExpression::formatPreviewString( value ) );
561561
}
562562
else
563563
{
@@ -572,7 +572,7 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
572572
QVariant value = exp.evaluate( &mExpressionContext );
573573
if ( !exp.hasEvalError() )
574574
{
575-
lblPreview->setText( formatPreviewString( value ) );
575+
lblPreview->setText( QgsExpression::formatPreviewString( value ) );
576576
}
577577
}
578578

@@ -598,44 +598,6 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged()
598598
}
599599
}
600600

601-
QString QgsExpressionBuilderWidget::formatPreviewString( const QVariant& value ) const
602-
{
603-
if ( value.canConvert<QgsGeometry>() )
604-
{
605-
//result is a geometry
606-
QgsGeometry geom = value.value<QgsGeometry>();
607-
if ( geom.isEmpty() )
608-
return tr( "<i>&lt;empty geometry&gt;</i>" );
609-
else
610-
return tr( "<i>&lt;geometry: %1&gt;</i>" ).arg( QgsWKBTypes::displayString( geom.geometry()->wkbType() ) );
611-
}
612-
else if ( value.canConvert< QgsFeature >() )
613-
{
614-
//result is a feature
615-
QgsFeature feat = value.value<QgsFeature>();
616-
return tr( "<i>&lt;feature: %1&gt;</i>" ).arg( feat.id() );
617-
}
618-
else if ( value.canConvert< QgsExpression::Interval >() )
619-
{
620-
//result is a feature
621-
QgsExpression::Interval interval = value.value<QgsExpression::Interval>();
622-
return tr( "<i>&lt;interval: %1 days&gt;</i>" ).arg( interval.days() );
623-
}
624-
else
625-
{
626-
QString previewString = value.toString();
627-
628-
if ( previewString.length() > 63 )
629-
{
630-
return QString( tr( "%1..." ) ).arg( previewString.left( 60 ) );
631-
}
632-
else
633-
{
634-
return previewString;
635-
}
636-
}
637-
}
638-
639601
void QgsExpressionBuilderWidget::loadExpressionContext()
640602
{
641603
QStringList variableNames = mExpressionContext.filteredVariableNames();

src/gui/qgsexpressionbuilderwidget.h

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -261,12 +261,6 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp
261261
QString loadFunctionHelp( QgsExpressionItem* functionName );
262262
QString helpStylesheet() const;
263263

264-
/** Formats an expression preview result for display in the widget
265-
* by truncating the string
266-
* @param value expression preview result to format
267-
*/
268-
QString formatPreviewString( const QVariant& value ) const;
269-
270264
void loadExpressionContext();
271265

272266
bool mAutoSave;

0 commit comments

Comments
 (0)