diff --git a/src/core/layout/qgslayoutitemmap.cpp b/src/core/layout/qgslayoutitemmap.cpp index a015c82a80c..7f8102fa783 100644 --- a/src/core/layout/qgslayoutitemmap.cpp +++ b/src/core/layout/qgslayoutitemmap.cpp @@ -1155,8 +1155,19 @@ QgsExpressionContext QgsLayoutItemMap::createExpressionContext() const scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs_definition" ), mapCrs.toProj4(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_units" ), QgsUnitTypes::toString( mapCrs.mapUnits() ), true ) ); + QVariantList layers_ids; + scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_layers_ids" ), layers_ids, true ) ); + context.appendScope( scope ); + // The scope map_layers_ids has been added to the context, only now we can call layersToRender + const QList layersInMap = layersToRender( &context ); + for ( QgsMapLayer *layer : layersInMap ) + { + layers_ids << layer->id(); + } + scope->setVariable( QStringLiteral( "map_layers_ids" ), layers_ids ); + return context; } diff --git a/src/core/qgsexpressioncontext.cpp b/src/core/qgsexpressioncontext.cpp index 64894da596b..701d032ce6a 100644 --- a/src/core/qgsexpressioncontext.cpp +++ b/src/core/qgsexpressioncontext.cpp @@ -995,6 +995,14 @@ QgsExpressionContextScope *QgsExpressionContextUtils::mapSettingsScope( const Qg scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_crs_definition" ), mapSettings.destinationCrs().toProj4(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_units" ), QgsUnitTypes::toString( mapSettings.mapUnits() ), true ) ); + QVariantList layers_ids; + const QList layersInMap = mapSettings.layers(); + for ( QgsMapLayer *layer : layersInMap ) + { + layers_ids << layer->id(); + } + scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "map_layers_ids" ), layers_ids, true ) ); + scope->addFunction( QStringLiteral( "is_layer_visible" ), new GetLayerVisibility( mapSettings.layers() ) ); return scope; diff --git a/tests/src/core/testqgslayoutitem.cpp b/tests/src/core/testqgslayoutitem.cpp index 45120e3cfe2..2b80c895f79 100644 --- a/tests/src/core/testqgslayoutitem.cpp +++ b/tests/src/core/testqgslayoutitem.cpp @@ -1431,6 +1431,12 @@ void TestQgsLayoutItem::itemVariablesFunction() QgsExpression e4( QStringLiteral( "map_get( item_variables( 'Map_id' ), 'map_units' )" ) ); r = e4.evaluate( &c ); QCOMPARE( r.toString(), QString( "degrees" ) ); + + QgsVectorLayer *layer = new QgsVectorLayer( QStringLiteral( "Point?field=id_a:integer" ), QStringLiteral( "A" ), QStringLiteral( "memory" ) ); + map->setLayers( QList() << layer ); + QgsExpression e5( QStringLiteral( "map_get( item_variables( 'Map_id' ), 'map_layers_ids' )" ) ); + r = e5.evaluate( &c ); + QCOMPARE( r.toStringList().join( ',' ), layer->id() ); } void TestQgsLayoutItem::variables()