Misc cleanups following c9f0d83

This commit is contained in:
Nyall Dawson 2015-11-20 10:38:34 +11:00
parent e3489e0bec
commit 323f265c94
11 changed files with 95 additions and 46 deletions

View File

@ -1,7 +1,9 @@
/** /** \ingroup core
* Interface used by class that will filter the features of a layer. * \class QgsFeatureFilterProvider
* The only method `filterFeatures` fill the `QgsFeatureRequest` to get only the * Abstract interface for use by classes that filter the features of a layer.
* wanted features. * A QgsFeatureFilterProvider provides a method for modifying a QgsFeatureRequest in place to apply
* additional filters to the request.
* \note added in QGIS 2.14
**/ **/
class QgsFeatureFilterProvider class QgsFeatureFilterProvider
{ {
@ -10,15 +12,16 @@ class QgsFeatureFilterProvider
%End %End
public: public:
/** Add some filter to the feature request to don't have the unauthorized (unauthorised) features
/** Add additional filters to the feature request to further restrict the features returned by the request.
* Derived classes must implement this method.
* @param layer the layer to filter * @param layer the layer to filter
* @param featureRequest the feature request to update * @param featureRequest the feature request to update
* @note not available in Python bindings
*/ */
virtual void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const = 0; virtual void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const = 0;
/** Create a clone of the feature filter provider /** Create a clone of the feature filter provider
* @return a new clone * @return a new clone
*/ */
virtual QgsFeatureFilterProvider* clone() const = 0; virtual QgsFeatureFilterProvider* clone() const = 0 /Factory/;
}; };

View File

@ -50,10 +50,26 @@ class QgsFeatureRequest
QgsFeatureRequest& setFilterFids( const QgsFeatureIds& fids ); QgsFeatureRequest& setFilterFids( const QgsFeatureIds& fids );
const QgsFeatureIds& filterFids() const; const QgsFeatureIds& filterFids() const;
//! Set filter expression. {@see QgsExpression} /** Set the filter expression. {@see QgsExpression}
* @param expression expression string
* @see filterExpression
* @see setExpressionContext
*/
QgsFeatureRequest& setFilterExpression( const QString& expression ); QgsFeatureRequest& setFilterExpression( const QString& expression );
/** Returns the filter expression if set.
* @see setFilterExpression
* @see expressionContext
*/
QgsExpression* filterExpression() const; QgsExpression* filterExpression() const;
/** Modifies the existing filter expression to add an additional expression filter. The
* filter expressions are combined using AND, so only features matching both
* the existing expression and the additional expression will be returned.
* @note added in QGIS 2.14
*/
QgsFeatureRequest& combineFilterExpression( const QString& expression );
/** Returns the expression context used to evaluate filter expressions. /** Returns the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12 * @note added in QGIS 2.12
* @see setExpressionContext * @see setExpressionContext

View File

@ -288,10 +288,12 @@ class QgsMapRenderer : QObject
*/ */
bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent /In,Out/, QgsRectangle& r2 /Out/ ); bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent /In,Out/, QgsRectangle& r2 /Out/ );
/** Set a feature filter provider to filter the features /** Set a feature filter provider to filter the features shown in the map.
* @param ffp the feature filter provider * @param ffp the feature filter provider
* @note added in QGIS 2.14
*/ */
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp ); void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
signals: signals:
//! @deprecated in 2.4 - not emitted anymore //! @deprecated in 2.4 - not emitted anymore

View File

@ -140,4 +140,18 @@ class QgsRenderContext
/** Sets pointer to original (unsegmentized) geometry /** Sets pointer to original (unsegmentized) geometry
@geometry the geometry*/ @geometry the geometry*/
void setGeometry( const QgsAbstractGeometryV2* geometry ); void setGeometry( const QgsAbstractGeometryV2* geometry );
/** Set a filter feature provider used for additional filtering of rendered features.
* @param ffp the filter feature provider
* @note added in QGIS 2.14
* @see featureFilterProvider()
*/
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
/** Get the filter feature provider used for additional filtering of rendered features.
* @return the filter feature provider
* @note added in QGIS 2.14
* @see setFeatureFilterProvider()
*/
const QgsFeatureFilterProvider* featureFilterProvider() const;
}; };

View File

@ -26,21 +26,25 @@ class QgsFeatureRequest;
/** \ingroup core /** \ingroup core
* Interface used by class that will filter the features of a layer. * \class QgsFeatureFilterProvider
* The only method `filterFeatures` fill the `QgsFeatureRequest` to get only the * Abstract interface for use by classes that filter the features of a layer.
* wanted features. * A QgsFeatureFilterProvider provides a method for modifying a QgsFeatureRequest in place to apply
* additional filters to the request.
* \note added in QGIS 2.14
**/ **/
class CORE_EXPORT QgsFeatureFilterProvider class CORE_EXPORT QgsFeatureFilterProvider
{ {
public: public:
/** Constructor */ /** Constructor */
QgsFeatureFilterProvider() {}; QgsFeatureFilterProvider() {}
/** Destructor */ /** Destructor */
virtual ~QgsFeatureFilterProvider() {}; virtual ~QgsFeatureFilterProvider() {}
/** Add some filter to the feature request to don't have the unauthorized (unauthorised) features /** Add additional filters to the feature request to further restrict the features returned by the request.
* Derived classes must implement this method.
* @param layer the layer to filter * @param layer the layer to filter
* @param featureRequest the feature request to update * @param featureRequest the feature request to update
*/ */

View File

@ -117,6 +117,19 @@ QgsFeatureRequest& QgsFeatureRequest::setFilterExpression( const QString& expres
return *this; return *this;
} }
QgsFeatureRequest&QgsFeatureRequest::combineFilterExpression( const QString& expression )
{
if ( mFilterExpression )
{
setFilterExpression( QString( "(%1) AND (%2)" ).arg( mFilterExpression->expression(), expression ) );
}
else
{
setFilterExpression( expression );
}
return *this;
}
QgsFeatureRequest &QgsFeatureRequest::setExpressionContext( const QgsExpressionContext &context ) QgsFeatureRequest &QgsFeatureRequest::setExpressionContext( const QgsExpressionContext &context )
{ {
mExpressionContext = context; mExpressionContext = context;

View File

@ -144,6 +144,13 @@ class CORE_EXPORT QgsFeatureRequest
*/ */
QgsExpression* filterExpression() const { return mFilterExpression; } QgsExpression* filterExpression() const { return mFilterExpression; }
/** Modifies the existing filter expression to add an additional expression filter. The
* filter expressions are combined using AND, so only features matching both
* the existing expression and the additional expression will be returned.
* @note added in QGIS 2.14
*/
QgsFeatureRequest& combineFilterExpression( const QString& expression );
/** Returns the expression context used to evaluate filter expressions. /** Returns the expression context used to evaluate filter expressions.
* @note added in QGIS 2.12 * @note added in QGIS 2.12
* @see setExpressionContext * @see setExpressionContext

View File

@ -335,8 +335,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject
*/ */
bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 ); bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
/** Set a feature filter provider to filter the features /** Set a feature filter provider to filter the features shown in the map.
* @param ffp the feature filter provider * @param ffp the feature filter provider
* @note added in QGIS 2.14
*/ */
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp ) void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp )
{ {

View File

@ -21,6 +21,7 @@
#include "qgsmapsettings.h" #include "qgsmapsettings.h"
#include "qgsexpression.h" #include "qgsexpression.h"
#include "qgsvectorlayer.h" #include "qgsvectorlayer.h"
#include "qgsfeaturefilterprovider.h"
QgsRenderContext::QgsRenderContext() QgsRenderContext::QgsRenderContext()
: mFlags( DrawEditingInfo | UseAdvancedEffects | DrawSelection | UseRenderingOptimization ) : mFlags( DrawEditingInfo | UseAdvancedEffects | DrawSelection | UseRenderingOptimization )
@ -39,13 +40,10 @@ QgsRenderContext::QgsRenderContext()
} }
QgsRenderContext::~QgsRenderContext() QgsRenderContext::~QgsRenderContext()
{
if ( mFeatureFilterProvider )
{ {
delete mFeatureFilterProvider; delete mFeatureFilterProvider;
mFeatureFilterProvider = 0; mFeatureFilterProvider = 0;
} }
}
void QgsRenderContext::setFlags( const QgsRenderContext::Flags& flags ) void QgsRenderContext::setFlags( const QgsRenderContext::Flags& flags )
{ {
@ -150,12 +148,10 @@ void QgsRenderContext::setUseRenderingOptimization( bool enabled )
} }
void QgsRenderContext::setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp ) void QgsRenderContext::setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp )
{
if ( mFeatureFilterProvider )
{ {
delete mFeatureFilterProvider; delete mFeatureFilterProvider;
mFeatureFilterProvider = 0; mFeatureFilterProvider = 0;
}
if ( ffp ) if ( ffp )
{ {
mFeatureFilterProvider = ffp->clone(); mFeatureFilterProvider = ffp->clone();

View File

@ -25,7 +25,6 @@
#include "qgsrectangle.h" #include "qgsrectangle.h"
#include "qgsvectorsimplifymethod.h" #include "qgsvectorsimplifymethod.h"
#include "qgsexpressioncontext.h" #include "qgsexpressioncontext.h"
#include "qgsfeaturefilterprovider.h"
class QPainter; class QPainter;
@ -33,8 +32,7 @@ class QgsAbstractGeometryV2;
class QgsLabelingEngineInterface; class QgsLabelingEngineInterface;
class QgsLabelingEngineV2; class QgsLabelingEngineV2;
class QgsMapSettings; class QgsMapSettings;
class QgsExpression; class QgsFeatureFilterProvider;
class QgsVectorLayer;
/** \ingroup core /** \ingroup core
@ -199,17 +197,19 @@ class CORE_EXPORT QgsRenderContext
/** Sets pointer to original (unsegmentized) geometry*/ /** Sets pointer to original (unsegmentized) geometry*/
void setGeometry( const QgsAbstractGeometryV2* geometry ) { mGeometry = geometry; } void setGeometry( const QgsAbstractGeometryV2* geometry ) { mGeometry = geometry; }
/** Set a filter feature provider used to filter the features /** Set a filter feature provider used for additional filtering of rendered features.
* @param ffp the filter feature provider * @param ffp the filter feature provider
* @note not available in Python bindings * @note added in QGIS 2.14
* @see featureFilterProvider()
*/ */
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp ); void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
/** Get the filter feature provider used to filter the features /** Get the filter feature provider used for additional filtering of rendered features.
* @return the filter feature provider * @return the filter feature provider
* @note not available in Python bindings * @note added in QGIS 2.14
* @see setFeatureFilterProvider()
*/ */
const QgsFeatureFilterProvider* featureFilterProvider() { return mFeatureFilterProvider; } const QgsFeatureFilterProvider* featureFilterProvider() const { return mFeatureFilterProvider; }
private: private:

View File

@ -32,6 +32,7 @@
#include "qgsvectorlayerlabeling.h" #include "qgsvectorlayerlabeling.h"
#include "qgsvectorlayerlabelprovider.h" #include "qgsvectorlayerlabelprovider.h"
#include "qgspainteffect.h" #include "qgspainteffect.h"
#include "qgsfeaturefilterprovider.h"
#include <QSettings> #include <QSettings>
#include <QPicture> #include <QPicture>
@ -151,25 +152,17 @@ bool QgsVectorLayerRenderer::render()
QgsFeatureRequest featureRequest = QgsFeatureRequest() QgsFeatureRequest featureRequest = QgsFeatureRequest()
.setFilterRect( requestExtent ) .setFilterRect( requestExtent )
.setSubsetOfAttributes( mAttrNames, mFields ); .setSubsetOfAttributes( mAttrNames, mFields )
.setExpressionContext( mContext.expressionContext() );
const QgsFeatureFilterProvider* featureFilterProvider = mContext.featureFilterProvider(); const QgsFeatureFilterProvider* featureFilterProvider = mContext.featureFilterProvider();
if ( featureFilterProvider ) if ( featureFilterProvider )
{ {
featureFilterProvider->filterFeatures( mLayer, featureRequest ); featureFilterProvider->filterFeatures( mLayer, featureRequest );
} }
if ( !rendererFilter.isNull() ) if ( !rendererFilter.isEmpty() && rendererFilter != "TRUE" )
{ {
featureRequest.setExpressionContext( mContext.expressionContext() ); featureRequest.combineFilterExpression( rendererFilter );
if ( !featureRequest.filterExpression() )
{
featureRequest.setFilterExpression( rendererFilter );
}
else
{
featureRequest.setFilterExpression( QString( "(%s) AND (%s)" )
.arg( rendererFilter, featureRequest.filterExpression()->expression() ) );
}
} }
// enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine. // enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine.