Skip to content

Commit 1e6d8d3

Browse files
Added default feature title format when display expression is empty (#3735)
* Added default feature title format when display expression is empty * handling empty layer name * Unnamed Layer translatable --------- Co-authored-by: VitorVieiraZ <vmvieira8@outlook.com>
1 parent 9bade72 commit 1e6d8d3

3 files changed

Lines changed: 81 additions & 1 deletion

File tree

app/attributes/attributepreviewcontroller.cpp

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,7 +135,25 @@ QString AttributePreviewController::featureTitle( )
135135
QgsExpressionContext context( globalProjectLayerScopes( mFeatureLayerPair.layer() ) );
136136
context.setFeature( mFeatureLayerPair.feature() );
137137
QgsExpression expr( mFeatureLayerPair.layer()->displayExpression() );
138-
return expr.evaluate( &context ).toString();
138+
139+
QString title = expr.evaluate( &context ).toString();
140+
141+
if ( title.isEmpty() )
142+
{
143+
// let's use a default format with layer name as user did not set any specific display expression
144+
if ( mFeatureLayerPair.layer() && mFeatureLayerPair.layer()->isValid() && mFeatureLayerPair.feature().isValid() )
145+
{
146+
QString layerName = mFeatureLayerPair.layer()->name();
147+
if ( layerName.isEmpty() )
148+
{
149+
layerName = tr( "Unnamed Layer" );
150+
}
151+
152+
title = QStringLiteral( "%1 (%2)" ).arg( layerName ).arg( mFeatureLayerPair.feature().id() );
153+
}
154+
}
155+
156+
return title;
139157
}
140158

141159
QList<QgsExpressionContextScope *> AttributePreviewController::globalProjectLayerScopes( QgsMapLayer *layer )

app/test/testattributepreviewcontroller.cpp

Lines changed: 61 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -201,3 +201,64 @@ void TestAttributePreviewController::testPreviewForms()
201201
// Cleanup
202202
QgsProject::instance()->removeAllMapLayers();
203203
}
204+
205+
void TestAttributePreviewController::testFeatureTitle()
206+
{
207+
// Layer creation
208+
QgsVectorLayer *layer =
209+
new QgsVectorLayer( QStringLiteral( "Point?field=name:string" ),
210+
QStringLiteral( "layer" ),
211+
QStringLiteral( "memory" )
212+
);
213+
QVERIFY( layer && layer->isValid() );
214+
215+
layer->setName( QStringLiteral( "Point" ) );
216+
217+
QgsFeature f1( layer->dataProvider()->fields() );
218+
f1.setAttribute( QStringLiteral( "name" ), "My feature" );
219+
layer->dataProvider()->addFeatures( QgsFeatureList() << f1 );
220+
221+
QgsFeature f2( layer->dataProvider()->fields() );
222+
f2.setAttribute( QStringLiteral( "name" ), "" );
223+
layer->dataProvider()->addFeatures( QgsFeatureList() << f2 );
224+
225+
QgsProject::instance()->addMapLayer( layer );
226+
227+
AttributePreviewController controller;
228+
controller.setProject( QgsProject::instance() );
229+
230+
//
231+
// Valid scenarios
232+
//
233+
234+
FeatureLayerPair pair1( layer->getFeature( 1 ), layer );
235+
controller.setFeatureLayerPair( pair1 );
236+
QCOMPARE( controller.title(), QStringLiteral( "My feature" ) );
237+
238+
FeatureLayerPair pair2( layer->getFeature( 2 ), layer );
239+
controller.setFeatureLayerPair( pair2 );
240+
QCOMPARE( controller.title(), QStringLiteral( "Point (2)" ) );
241+
242+
//
243+
// FeaturePair is somehow malformed
244+
//
245+
246+
FeatureLayerPair pair3( QgsFeature(), nullptr );
247+
controller.setFeatureLayerPair( pair3 );
248+
QCOMPARE( controller.title(), QStringLiteral( "" ) );
249+
250+
FeatureLayerPair pair4( layer->getFeature( 2 ), nullptr );
251+
controller.setFeatureLayerPair( pair4 );
252+
QCOMPARE( controller.title(), QStringLiteral( "" ) );
253+
254+
FeatureLayerPair pair5( QgsFeature(), layer );
255+
controller.setFeatureLayerPair( pair5 );
256+
QCOMPARE( controller.title(), QStringLiteral( "" ) );
257+
258+
//
259+
// Set layer name as empty and check if default "Unnamed Layer" is applied
260+
//
261+
layer->setName( QStringLiteral( "" ) );
262+
controller.setFeatureLayerPair( pair2 );
263+
QCOMPARE( controller.title(), QStringLiteral( "Unnamed Layer (2)" ) );
264+
}

app/test/testattributepreviewcontroller.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class TestAttributePreviewController: public QObject
3030

3131
void testPreviewForms();
3232
void testMultilineMapTips();
33+
void testFeatureTitle();
3334

3435
private:
3536
};

0 commit comments

Comments
 (0)