From 024fa4e506bf70a4a9ce694452d8e0470b41f8f8 Mon Sep 17 00:00:00 2001 From: lbartoletti Date: Fri, 7 Feb 2020 21:31:20 +0100 Subject: [PATCH 1/2] Fix identify menu when an expression is used as display name --- src/gui/qgsidentifymenu.cpp | 20 +++++++++++++++++--- 1 file changed, 17 insertions(+), 3 deletions(-) diff --git a/src/gui/qgsidentifymenu.cpp b/src/gui/qgsidentifymenu.cpp index af561ead1c79..c458b0a00674 100644 --- a/src/gui/qgsidentifymenu.cpp +++ b/src/gui/qgsidentifymenu.cpp @@ -25,6 +25,7 @@ #include "qgslogger.h" #include "qgssettings.h" #include "qgsgui.h" +#include "qgsexpressioncontextutils.h" //TODO 4.0 add explicitly qobject parent to constructor QgsIdentifyMenu::QgsIdentifyMenu( QgsMapCanvas *canvas ) @@ -282,7 +283,12 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayField() ).toString(); + + QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) ); + QgsExpression exp( layer->displayExpression() ); + exp.prepare( &context ); + context.setFeature( results[0].mFeature ); + QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() ) featureTitle = QStringLiteral( "%1" ).arg( results[0].mFeature.id() ); layerAction = new QAction( QStringLiteral( "%1 (%2)" ).arg( layer->name(), featureTitle ), this ); @@ -304,7 +310,11 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayField() ).toString(); + QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) ); + QgsExpression exp( layer->displayExpression() ); + exp.prepare( &context ); + context.setFeature( results[0].mFeature ); + QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() ) featureTitle = QStringLiteral( "%1" ).arg( results[0].mFeature.id() ); layerMenu = new QMenu( QStringLiteral( "%1 (%2)" ).arg( layer->name(), featureTitle ), this ); @@ -364,7 +374,11 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayField() ).toString(); + QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) ); + QgsExpression exp( layer->displayExpression() ); + exp.prepare( &context ); + context.setFeature( result.mFeature ); + QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() ) featureTitle = QStringLiteral( "%1" ).arg( result.mFeature.id() ); From 618020af86a1f52dd5d942bdd0f4b793be662275 Mon Sep 17 00:00:00 2001 From: lbartoletti Date: Mon, 10 Feb 2020 08:50:20 +0100 Subject: [PATCH 2/2] avoid code duplication --- src/gui/qgsidentifymenu.cpp | 16 ++++------------ 1 file changed, 4 insertions(+), 12 deletions(-) diff --git a/src/gui/qgsidentifymenu.cpp b/src/gui/qgsidentifymenu.cpp index c458b0a00674..5bf3caaccf0e 100644 --- a/src/gui/qgsidentifymenu.cpp +++ b/src/gui/qgsidentifymenu.cpp @@ -279,15 +279,14 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayExpression() ); + exp.prepare( &context ); + context.setFeature( results[0].mFeature ); // use a menu only if actions will be listed if ( !createMenu ) { // case 1 - - QgsExpressionContext context( QgsExpressionContextUtils::globalProjectLayerScopes( layer ) ); - QgsExpression exp( layer->displayExpression() ); - exp.prepare( &context ); - context.setFeature( results[0].mFeature ); QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() ) featureTitle = QStringLiteral( "%1" ).arg( results[0].mFeature.id() ); @@ -310,10 +309,6 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayExpression() ); - exp.prepare( &context ); - context.setFeature( results[0].mFeature ); QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() ) featureTitle = QStringLiteral( "%1" ).arg( results[0].mFeature.id() ); @@ -374,9 +369,6 @@ void QgsIdentifyMenu::addVectorLayer( QgsVectorLayer *layer, const QListdisplayExpression() ); - exp.prepare( &context ); context.setFeature( result.mFeature ); QString featureTitle = exp.evaluate( &context ).toString(); if ( featureTitle.isEmpty() )