From 6ef8c6415302878c23bb94ee1806de46c146e5ec Mon Sep 17 00:00:00 2001 From: olivierdalang Date: Fri, 3 Jul 2020 13:25:10 +0200 Subject: [PATCH] [layout expressions] add Y page offset expression this is useful for dynamically position items relative to pages in multi-pages layouts --- src/core/expression/qgsexpression.cpp | 1 + src/core/expression/qgsexpressioncontextutils.cpp | 9 +++++++++ 2 files changed, 10 insertions(+) diff --git a/src/core/expression/qgsexpression.cpp b/src/core/expression/qgsexpression.cpp index ca0e5521bf91..a55f28ba16b1 100644 --- a/src/core/expression/qgsexpression.cpp +++ b/src/core/expression/qgsexpression.cpp @@ -736,6 +736,7 @@ void QgsExpression::initVariableHelp() sVariableHelpTexts()->insert( QStringLiteral( "layout_page" ), QCoreApplication::translate( "variable_help", "Current page number in composition." ) ); sVariableHelpTexts()->insert( QStringLiteral( "layout_pageheight" ), QCoreApplication::translate( "variable_help", "Composition page height in mm." ) ); sVariableHelpTexts()->insert( QStringLiteral( "layout_pagewidth" ), QCoreApplication::translate( "variable_help", "Composition page width in mm." ) ); + sVariableHelpTexts()->insert( QStringLiteral( "layout_pageoffsets" ), QCoreApplication::translate( "variable_help", "Array of Y coordinate of the top of each page." ) ); sVariableHelpTexts()->insert( QStringLiteral( "layout_dpi" ), QCoreApplication::translate( "variable_help", "Composition resolution (DPI)." ) ); //atlas variables diff --git a/src/core/expression/qgsexpressioncontextutils.cpp b/src/core/expression/qgsexpressioncontextutils.cpp index fa15cb01ef79..6e1b9a73596b 100644 --- a/src/core/expression/qgsexpressioncontextutils.cpp +++ b/src/core/expression/qgsexpressioncontextutils.cpp @@ -510,6 +510,15 @@ QgsExpressionContextScope *QgsExpressionContextUtils::layoutScope( const QgsLayo scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layout_pageheight" ), s.height(), true ) ); scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layout_pagewidth" ), s.width(), true ) ); } + + QVariantList offsets; + for ( int i = 0; i < layout->pageCollection()->pageCount(); i++ ) + { + QPointF p = layout->pageCollection()->pagePositionToLayoutPosition( i, QgsLayoutPoint( 0, 0 ) ); + offsets << p.y(); + } + scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layout_pageoffsets" ), offsets, true ) ); + scope->addVariable( QgsExpressionContextScope::StaticVariable( QStringLiteral( "layout_dpi" ), layout->renderContext().dpi(), true ) ); scope->addFunction( QStringLiteral( "item_variables" ), new GetLayoutItemVariables( layout ) );