@@ -274,6 +274,17 @@ QVariant QgsExpressionContext::variable( const QString& name ) const
274274 return scope ? scope->variable ( name ) : QVariant ();
275275}
276276
277+ QVariantMap QgsExpressionContext::variablesToMap () const
278+ {
279+ QStringList names = variableNames ();
280+ QVariantMap m;
281+ Q_FOREACH ( const QString& name, names )
282+ {
283+ m.insert ( name, variable ( name ) );
284+ }
285+ return m;
286+ }
287+
277288bool QgsExpressionContext::isHighlightedVariable ( const QString &name ) const
278289{
279290 return mHighlightedVariables .contains ( name );
@@ -598,6 +609,41 @@ class GetNamedProjectColor : public QgsScopedExpressionFunction
598609
599610};
600611
612+ class GetComposerItemVariables : public QgsScopedExpressionFunction
613+ {
614+ public:
615+ GetComposerItemVariables ( const QgsComposition* c )
616+ : QgsScopedExpressionFunction( QStringLiteral( " item_variables" ), QgsExpression::ParameterList() << QgsExpression::Parameter( QStringLiteral( " id" ) ), QStringLiteral( " Composition" ) )
617+ , mComposition ( c )
618+ {}
619+
620+ virtual QVariant func ( const QVariantList& values, const QgsExpressionContext*, QgsExpression* ) override
621+ {
622+ if ( !mComposition )
623+ return QVariant ();
624+
625+ QString id = values.at ( 0 ).toString ().toLower ();
626+
627+ const QgsComposerItem* item = mComposition ->getComposerItemById ( id );
628+ if ( !item )
629+ return QVariant ();
630+
631+ QgsExpressionContext c = item->createExpressionContext ();
632+
633+ return c.variablesToMap ();
634+ }
635+
636+ QgsScopedExpressionFunction* clone () const override
637+ {
638+ return new GetComposerItemVariables ( mComposition );
639+ }
640+
641+ private:
642+
643+ const QgsComposition* mComposition ;
644+
645+ };
646+
601647// /@endcond
602648
603649QgsExpressionContextScope* QgsExpressionContextUtils::projectScope ( const QgsProject* project )
@@ -757,6 +803,10 @@ QgsExpressionContextScope* QgsExpressionContextUtils::mapSettingsScope( const Qg
757803 QgsGeometry centerPoint = QgsGeometry::fromPoint ( mapSettings.visibleExtent ().center () );
758804 scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " map_extent_center" ), QVariant::fromValue ( centerPoint ), true ) );
759805
806+ scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " map_crs" ), mapSettings.destinationCrs ().authid (), true ) );
807+ scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " map_crs_definition" ), mapSettings.destinationCrs ().toProj4 (), true ) );
808+ scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " map_units" ), QgsUnitTypes::toString ( mapSettings.mapUnits () ), true ) );
809+
760810 return scope;
761811}
762812
@@ -807,6 +857,9 @@ QgsExpressionContextScope *QgsExpressionContextUtils::compositionScope( const Qg
807857 scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " layout_pagewidth" ), composition->paperWidth (), true ) );
808858 scope->addVariable ( QgsExpressionContextScope::StaticVariable ( QStringLiteral ( " layout_dpi" ), composition->printResolution (), true ) );
809859
860+
861+ scope->addFunction ( QStringLiteral ( " item_variables" ), new GetComposerItemVariables ( composition ) );
862+
810863 return scope;
811864}
812865
@@ -959,6 +1012,7 @@ QgsExpressionContext QgsExpressionContextUtils::createFeatureBasedContext( const
9591012void QgsExpressionContextUtils::registerContextFunctions ()
9601013{
9611014 QgsExpression::registerFunction ( new GetNamedProjectColor ( nullptr ) );
1015+ QgsExpression::registerFunction ( new GetComposerItemVariables ( nullptr ) );
9621016}
9631017
9641018bool QgsScopedExpressionFunction::usesGeometry ( const QgsExpression::NodeFunction* node ) const
0 commit comments