From f74db81b9ac2598493117721e6180c65a6a38ab0 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Thu, 20 Aug 2015 15:06:09 +1000 Subject: [PATCH] Hide contextual functions from builder unless provided by context --- python/core/qgsexpression.sip | 8 +++++++- python/core/qgsexpressioncontext.sip | 3 ++- src/core/qgsexpression.h | 10 +++++++++- src/core/qgsexpressioncontext.h | 5 +++-- src/gui/qgsexpressionbuilderwidget.cpp | 6 ++++++ 5 files changed, 27 insertions(+), 5 deletions(-) diff --git a/python/core/qgsexpression.sip b/python/core/qgsexpression.sip index 17c874bc4038..5ef9fa7f650f 100644 --- a/python/core/qgsexpression.sip +++ b/python/core/qgsexpression.sip @@ -247,7 +247,8 @@ class QgsExpression bool usesGeometry = false, QStringList referencedColumns = QStringList(), bool lazyEval = false, - bool handlesNull = false ); + bool handlesNull = false, + bool isContextual = false ); virtual ~Function(); @@ -272,6 +273,11 @@ class QgsExpression virtual QStringList referencedColumns() const; + /** Returns whether the function is only available if provided by a QgsExpressionContext object. + * @note added in QGIS 2.12 + */ + bool isContextual() const; + /** The group the function belongs to. */ QString group(); /** The help text for the function. */ diff --git a/python/core/qgsexpressioncontext.sip b/python/core/qgsexpressioncontext.sip index 3969ea042422..dfec2baa691d 100644 --- a/python/core/qgsexpressioncontext.sip +++ b/python/core/qgsexpressioncontext.sip @@ -19,7 +19,8 @@ class QgsScopedExpressionFunction : QgsExpression::Function bool usesGeometry = false, QStringList referencedColumns = QStringList(), bool lazyEval = false, - bool handlesNull = false ); + bool handlesNull = false, + bool isContextual = true ); virtual ~QgsScopedExpressionFunction(); diff --git a/src/core/qgsexpression.h b/src/core/qgsexpression.h index fb60b8646b48..370d9ae7ce1f 100644 --- a/src/core/qgsexpression.h +++ b/src/core/qgsexpression.h @@ -341,7 +341,8 @@ class CORE_EXPORT QgsExpression bool usesGeometry = false, QStringList referencedColumns = QStringList(), bool lazyEval = false, - bool handlesNull = false ) + bool handlesNull = false, + bool isContextual = false ) : mName( fnname ) , mParams( params ) , mUsesGeometry( usesGeometry ) @@ -350,6 +351,7 @@ class CORE_EXPORT QgsExpression , mReferencedColumns( referencedColumns ) , mLazyEval( lazyEval ) , mHandlesNull( handlesNull ) + , mIsContextual( isContextual ) {} virtual ~Function() {} @@ -375,6 +377,11 @@ class CORE_EXPORT QgsExpression virtual QStringList referencedColumns() const { return mReferencedColumns; } + /** Returns whether the function is only available if provided by a QgsExpressionContext object. + * @note added in QGIS 2.12 + */ + bool isContextual() const { return mIsContextual; } + /** The group the function belongs to. */ QString group() { return mGroup; } /** The help text for the function. */ @@ -409,6 +416,7 @@ class CORE_EXPORT QgsExpression QStringList mReferencedColumns; bool mLazyEval; bool mHandlesNull; + bool mIsContextual; //if true function is only available through an expression context }; class StaticFunction : public Function diff --git a/src/core/qgsexpressioncontext.h b/src/core/qgsexpressioncontext.h index c24ea5f9477e..d8dfdb31193b 100644 --- a/src/core/qgsexpressioncontext.h +++ b/src/core/qgsexpressioncontext.h @@ -46,8 +46,9 @@ class CORE_EXPORT QgsScopedExpressionFunction : public QgsExpression::Function bool usesGeometry = false, QStringList referencedColumns = QStringList(), bool lazyEval = false, - bool handlesNull = false ) - : QgsExpression::Function( fnname, params, group, helpText, usesGeometry, referencedColumns, lazyEval, handlesNull ) + bool handlesNull = false, + bool isContextual = true ) + : QgsExpression::Function( fnname, params, group, helpText, usesGeometry, referencedColumns, lazyEval, handlesNull, isContextual ) {} virtual ~QgsScopedExpressionFunction() {} diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp index c1e1ecd6a51d..06825b3f8079 100644 --- a/src/gui/qgsexpressionbuilderwidget.cpp +++ b/src/gui/qgsexpressionbuilderwidget.cpp @@ -445,6 +445,12 @@ void QgsExpressionBuilderWidget::updateFunctionTree() QString name = func->name(); if ( name.startsWith( "_" ) ) // do not display private functions continue; + if ( func->isContextual() ) + { + //don't show contextual functions by default - it's up the the QgsExpressionContext + //object to provide them if supported + continue; + } if ( func->params() != 0 ) name += "("; else if ( !name.startsWith( "$" ) )