From e3196484e15d0552ca44b8ab736e0ffb3e65cd77 Mon Sep 17 00:00:00 2001 From: Alessandro Pasotti Date: Wed, 31 May 2023 09:56:25 +0200 Subject: [PATCH] Add more context to the legend filter expressions in layouts Fix #53229 --- .../auto_generated/qgslegendfilterbutton.sip.in | 8 ++++++++ src/gui/layout/qgslayoutlegendwidget.cpp | 1 + src/gui/qgslegendfilterbutton.cpp | 15 ++++++++++++++- src/gui/qgslegendfilterbutton.h | 10 ++++++++++ 4 files changed, 33 insertions(+), 1 deletion(-) diff --git a/python/gui/auto_generated/qgslegendfilterbutton.sip.in b/python/gui/auto_generated/qgslegendfilterbutton.sip.in index 2680d18924a..2459cf0f7c0 100644 --- a/python/gui/auto_generated/qgslegendfilterbutton.sip.in +++ b/python/gui/auto_generated/qgslegendfilterbutton.sip.in @@ -39,6 +39,14 @@ Returns the current text used as filter expression %Docstring Sets the current text used as filter expression. This will update the menu +%End + + void registerExpressionContextGenerator( QgsExpressionContextGenerator *generator ); +%Docstring +Register an expression context generator class that will be used to retrieve +an expression context for the button when required. + +.. versionadded:: 3.32 %End QgsVectorLayer *vectorLayer() const; diff --git a/src/gui/layout/qgslayoutlegendwidget.cpp b/src/gui/layout/qgslayoutlegendwidget.cpp index 6fd12f2f397..b10e8e2b35d 100644 --- a/src/gui/layout/qgslayoutlegendwidget.cpp +++ b/src/gui/layout/qgslayoutlegendwidget.cpp @@ -203,6 +203,7 @@ QgsLayoutLegendWidget::QgsLayoutLegendWidget( QgsLayoutItemLegend *legend, QgsMa mGroupFontButton->registerExpressionContextGenerator( this ); mLayerFontButton->registerExpressionContextGenerator( this ); mItemFontButton->registerExpressionContextGenerator( this ); + mExpressionFilterButton->registerExpressionContextGenerator( this ); mTitleFontButton->setLayer( coverageLayer() ); mGroupFontButton->setLayer( coverageLayer() ); diff --git a/src/gui/qgslegendfilterbutton.cpp b/src/gui/qgslegendfilterbutton.cpp index 7883ada7ed0..ac3a2ca68fe 100644 --- a/src/gui/qgslegendfilterbutton.cpp +++ b/src/gui/qgslegendfilterbutton.cpp @@ -20,6 +20,7 @@ #include "qgsapplication.h" #include "qgsexpressionbuilderdialog.h" +#include "qgsexpressioncontextutils.h" QgsLegendFilterButton::QgsLegendFilterButton( QWidget *parent ) : QToolButton( parent ) @@ -58,7 +59,14 @@ void QgsLegendFilterButton::onToggle( bool checked ) void QgsLegendFilterButton::onSetLegendFilterExpression() { - QgsExpressionBuilderDialog dlg( mLayer, mExpression ); + QgsExpressionContext context; + if ( mExpressionContextGenerator ) + context = mExpressionContextGenerator->createExpressionContext(); + else + { + context.appendScopes( QgsExpressionContextUtils::globalProjectLayerScopes( mLayer ) ); + } + QgsExpressionBuilderDialog dlg( mLayer, mExpression, nullptr, QStringLiteral( "generic" ), context ); if ( dlg.exec() ) { setExpressionText( dlg.expressionText() ); @@ -79,6 +87,11 @@ void QgsLegendFilterButton::onSetLegendFilterExpression() } } +void QgsLegendFilterButton::registerExpressionContextGenerator( QgsExpressionContextGenerator *generator ) +{ + mExpressionContextGenerator = generator; +} + void QgsLegendFilterButton::onClearFilterExpression() { mClearExpressionAction->setEnabled( false ); diff --git a/src/gui/qgslegendfilterbutton.h b/src/gui/qgslegendfilterbutton.h index d1838b0d9a6..10a1885a0e7 100644 --- a/src/gui/qgslegendfilterbutton.h +++ b/src/gui/qgslegendfilterbutton.h @@ -17,8 +17,10 @@ #include #include "qgis_gui.h" +#include "qgsexpressioncontext.h" class QgsVectorLayer; +class QgsExpressionContextGenerator; /** * \ingroup gui @@ -52,6 +54,13 @@ class GUI_EXPORT QgsLegendFilterButton: public QToolButton */ void setExpressionText( const QString &expression ); + /** + * Register an expression context generator class that will be used to retrieve + * an expression context for the button when required. + * \since QGIS 3.32 + */ + void registerExpressionContextGenerator( QgsExpressionContextGenerator *generator ); + /** * Returns the current associated vectorLayer * May be NULLPTR @@ -76,6 +85,7 @@ class GUI_EXPORT QgsLegendFilterButton: public QToolButton QAction *mSetExpressionAction = nullptr; QAction *mClearExpressionAction = nullptr; QString mExpression; + QgsExpressionContextGenerator *mExpressionContextGenerator = nullptr; void updateMenu();