Skip to content

Commit 323f265

Browse files
committed
Misc cleanups following c9f0d83
1 parent e3489e0 commit 323f265

11 files changed

+95
-46
lines changed
+10-7
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
1-
/**
2-
* Interface used by class that will filter the features of a layer.
3-
* The only method `filterFeatures` fill the `QgsFeatureRequest` to get only the
4-
* wanted features.
1+
/** \ingroup core
2+
* \class QgsFeatureFilterProvider
3+
* Abstract interface for use by classes that filter the features of a layer.
4+
* A QgsFeatureFilterProvider provides a method for modifying a QgsFeatureRequest in place to apply
5+
* additional filters to the request.
6+
* \note added in QGIS 2.14
57
**/
68
class QgsFeatureFilterProvider
79
{
@@ -10,15 +12,16 @@ class QgsFeatureFilterProvider
1012
%End
1113

1214
public:
13-
/** Add some filter to the feature request to don't have the unauthorized (unauthorised) features
15+
16+
/** Add additional filters to the feature request to further restrict the features returned by the request.
17+
* Derived classes must implement this method.
1418
* @param layer the layer to filter
1519
* @param featureRequest the feature request to update
16-
* @note not available in Python bindings
1720
*/
1821
virtual void filterFeatures( const QgsVectorLayer* layer, QgsFeatureRequest& featureRequest ) const = 0;
1922

2023
/** Create a clone of the feature filter provider
2124
* @return a new clone
2225
*/
23-
virtual QgsFeatureFilterProvider* clone() const = 0;
26+
virtual QgsFeatureFilterProvider* clone() const = 0 /Factory/;
2427
};

python/core/qgsfeaturerequest.sip

+17-1
Original file line numberDiff line numberDiff line change
@@ -50,10 +50,26 @@ class QgsFeatureRequest
5050
QgsFeatureRequest& setFilterFids( const QgsFeatureIds& fids );
5151
const QgsFeatureIds& filterFids() const;
5252

53-
//! Set filter expression. {@see QgsExpression}
53+
/** Set the filter expression. {@see QgsExpression}
54+
* @param expression expression string
55+
* @see filterExpression
56+
* @see setExpressionContext
57+
*/
5458
QgsFeatureRequest& setFilterExpression( const QString& expression );
59+
60+
/** Returns the filter expression if set.
61+
* @see setFilterExpression
62+
* @see expressionContext
63+
*/
5564
QgsExpression* filterExpression() const;
5665

66+
/** Modifies the existing filter expression to add an additional expression filter. The
67+
* filter expressions are combined using AND, so only features matching both
68+
* the existing expression and the additional expression will be returned.
69+
* @note added in QGIS 2.14
70+
*/
71+
QgsFeatureRequest& combineFilterExpression( const QString& expression );
72+
5773
/** Returns the expression context used to evaluate filter expressions.
5874
* @note added in QGIS 2.12
5975
* @see setExpressionContext

python/core/qgsmaprenderer.sip

+3-1
Original file line numberDiff line numberDiff line change
@@ -288,10 +288,12 @@ class QgsMapRenderer : QObject
288288
*/
289289
bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent /In,Out/, QgsRectangle& r2 /Out/ );
290290

291-
/** Set a feature filter provider to filter the features
291+
/** Set a feature filter provider to filter the features shown in the map.
292292
* @param ffp the feature filter provider
293+
* @note added in QGIS 2.14
293294
*/
294295
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
296+
295297
signals:
296298

297299
//! @deprecated in 2.4 - not emitted anymore

python/core/qgsrendercontext.sip

+14
Original file line numberDiff line numberDiff line change
@@ -140,4 +140,18 @@ class QgsRenderContext
140140
/** Sets pointer to original (unsegmentized) geometry
141141
@geometry the geometry*/
142142
void setGeometry( const QgsAbstractGeometryV2* geometry );
143+
144+
/** Set a filter feature provider used for additional filtering of rendered features.
145+
* @param ffp the filter feature provider
146+
* @note added in QGIS 2.14
147+
* @see featureFilterProvider()
148+
*/
149+
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
150+
151+
/** Get the filter feature provider used for additional filtering of rendered features.
152+
* @return the filter feature provider
153+
* @note added in QGIS 2.14
154+
* @see setFeatureFilterProvider()
155+
*/
156+
const QgsFeatureFilterProvider* featureFilterProvider() const;
143157
};

src/core/qgsfeaturefilterprovider.h

+10-6
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,25 @@ class QgsFeatureRequest;
2626

2727

2828
/** \ingroup core
29-
* Interface used by class that will filter the features of a layer.
30-
* The only method `filterFeatures` fill the `QgsFeatureRequest` to get only the
31-
* wanted features.
29+
* \class QgsFeatureFilterProvider
30+
* Abstract interface for use by classes that filter the features of a layer.
31+
* A QgsFeatureFilterProvider provides a method for modifying a QgsFeatureRequest in place to apply
32+
* additional filters to the request.
33+
* \note added in QGIS 2.14
3234
**/
35+
3336
class CORE_EXPORT QgsFeatureFilterProvider
3437
{
3538
public:
3639

3740
/** Constructor */
38-
QgsFeatureFilterProvider() {};
41+
QgsFeatureFilterProvider() {}
3942

4043
/** Destructor */
41-
virtual ~QgsFeatureFilterProvider() {};
44+
virtual ~QgsFeatureFilterProvider() {}
4245

43-
/** Add some filter to the feature request to don't have the unauthorized (unauthorised) features
46+
/** Add additional filters to the feature request to further restrict the features returned by the request.
47+
* Derived classes must implement this method.
4448
* @param layer the layer to filter
4549
* @param featureRequest the feature request to update
4650
*/

src/core/qgsfeaturerequest.cpp

+13
Original file line numberDiff line numberDiff line change
@@ -117,6 +117,19 @@ QgsFeatureRequest& QgsFeatureRequest::setFilterExpression( const QString& expres
117117
return *this;
118118
}
119119

120+
QgsFeatureRequest&QgsFeatureRequest::combineFilterExpression( const QString& expression )
121+
{
122+
if ( mFilterExpression )
123+
{
124+
setFilterExpression( QString( "(%1) AND (%2)" ).arg( mFilterExpression->expression(), expression ) );
125+
}
126+
else
127+
{
128+
setFilterExpression( expression );
129+
}
130+
return *this;
131+
}
132+
120133
QgsFeatureRequest &QgsFeatureRequest::setExpressionContext( const QgsExpressionContext &context )
121134
{
122135
mExpressionContext = context;

src/core/qgsfeaturerequest.h

+7
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,13 @@ class CORE_EXPORT QgsFeatureRequest
144144
*/
145145
QgsExpression* filterExpression() const { return mFilterExpression; }
146146

147+
/** Modifies the existing filter expression to add an additional expression filter. The
148+
* filter expressions are combined using AND, so only features matching both
149+
* the existing expression and the additional expression will be returned.
150+
* @note added in QGIS 2.14
151+
*/
152+
QgsFeatureRequest& combineFilterExpression( const QString& expression );
153+
147154
/** Returns the expression context used to evaluate filter expressions.
148155
* @note added in QGIS 2.12
149156
* @see setExpressionContext

src/core/qgsmaprenderer.h

+2-1
Original file line numberDiff line numberDiff line change
@@ -335,8 +335,9 @@ class CORE_EXPORT QgsMapRenderer : public QObject
335335
*/
336336
bool splitLayersExtent( QgsMapLayer* layer, QgsRectangle& extent, QgsRectangle& r2 );
337337

338-
/** Set a feature filter provider to filter the features
338+
/** Set a feature filter provider to filter the features shown in the map.
339339
* @param ffp the feature filter provider
340+
* @note added in QGIS 2.14
340341
*/
341342
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp )
342343
{

src/core/qgsrendercontext.cpp

+6-10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "qgsmapsettings.h"
2222
#include "qgsexpression.h"
2323
#include "qgsvectorlayer.h"
24+
#include "qgsfeaturefilterprovider.h"
2425

2526
QgsRenderContext::QgsRenderContext()
2627
: mFlags( DrawEditingInfo | UseAdvancedEffects | DrawSelection | UseRenderingOptimization )
@@ -40,11 +41,8 @@ QgsRenderContext::QgsRenderContext()
4041

4142
QgsRenderContext::~QgsRenderContext()
4243
{
43-
if ( mFeatureFilterProvider )
44-
{
45-
delete mFeatureFilterProvider;
46-
mFeatureFilterProvider = 0;
47-
}
44+
delete mFeatureFilterProvider;
45+
mFeatureFilterProvider = 0;
4846
}
4947

5048
void QgsRenderContext::setFlags( const QgsRenderContext::Flags& flags )
@@ -151,11 +149,9 @@ void QgsRenderContext::setUseRenderingOptimization( bool enabled )
151149

152150
void QgsRenderContext::setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp )
153151
{
154-
if ( mFeatureFilterProvider )
155-
{
156-
delete mFeatureFilterProvider;
157-
mFeatureFilterProvider = 0;
158-
}
152+
delete mFeatureFilterProvider;
153+
mFeatureFilterProvider = 0;
154+
159155
if ( ffp )
160156
{
161157
mFeatureFilterProvider = ffp->clone();

src/core/qgsrendercontext.h

+8-8
Original file line numberDiff line numberDiff line change
@@ -25,16 +25,14 @@
2525
#include "qgsrectangle.h"
2626
#include "qgsvectorsimplifymethod.h"
2727
#include "qgsexpressioncontext.h"
28-
#include "qgsfeaturefilterprovider.h"
2928

3029
class QPainter;
3130

3231
class QgsAbstractGeometryV2;
3332
class QgsLabelingEngineInterface;
3433
class QgsLabelingEngineV2;
3534
class QgsMapSettings;
36-
class QgsExpression;
37-
class QgsVectorLayer;
35+
class QgsFeatureFilterProvider;
3836

3937

4038
/** \ingroup core
@@ -199,17 +197,19 @@ class CORE_EXPORT QgsRenderContext
199197
/** Sets pointer to original (unsegmentized) geometry*/
200198
void setGeometry( const QgsAbstractGeometryV2* geometry ) { mGeometry = geometry; }
201199

202-
/** Set a filter feature provider used to filter the features
200+
/** Set a filter feature provider used for additional filtering of rendered features.
203201
* @param ffp the filter feature provider
204-
* @note not available in Python bindings
202+
* @note added in QGIS 2.14
203+
* @see featureFilterProvider()
205204
*/
206205
void setFeatureFilterProvider( const QgsFeatureFilterProvider* ffp );
207206

208-
/** Get the filter feature provider used to filter the features
207+
/** Get the filter feature provider used for additional filtering of rendered features.
209208
* @return the filter feature provider
210-
* @note not available in Python bindings
209+
* @note added in QGIS 2.14
210+
* @see setFeatureFilterProvider()
211211
*/
212-
const QgsFeatureFilterProvider* featureFilterProvider() { return mFeatureFilterProvider; }
212+
const QgsFeatureFilterProvider* featureFilterProvider() const { return mFeatureFilterProvider; }
213213

214214
private:
215215

src/core/qgsvectorlayerrenderer.cpp

+5-12
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@
3232
#include "qgsvectorlayerlabeling.h"
3333
#include "qgsvectorlayerlabelprovider.h"
3434
#include "qgspainteffect.h"
35+
#include "qgsfeaturefilterprovider.h"
3536

3637
#include <QSettings>
3738
#include <QPicture>
@@ -151,25 +152,17 @@ bool QgsVectorLayerRenderer::render()
151152

152153
QgsFeatureRequest featureRequest = QgsFeatureRequest()
153154
.setFilterRect( requestExtent )
154-
.setSubsetOfAttributes( mAttrNames, mFields );
155+
.setSubsetOfAttributes( mAttrNames, mFields )
156+
.setExpressionContext( mContext.expressionContext() );
155157

156158
const QgsFeatureFilterProvider* featureFilterProvider = mContext.featureFilterProvider();
157159
if ( featureFilterProvider )
158160
{
159161
featureFilterProvider->filterFeatures( mLayer, featureRequest );
160162
}
161-
if ( !rendererFilter.isNull() )
163+
if ( !rendererFilter.isEmpty() && rendererFilter != "TRUE" )
162164
{
163-
featureRequest.setExpressionContext( mContext.expressionContext() );
164-
if ( !featureRequest.filterExpression() )
165-
{
166-
featureRequest.setFilterExpression( rendererFilter );
167-
}
168-
else
169-
{
170-
featureRequest.setFilterExpression( QString( "(%s) AND (%s)" )
171-
.arg( rendererFilter, featureRequest.filterExpression()->expression() ) );
172-
}
165+
featureRequest.combineFilterExpression( rendererFilter );
173166
}
174167

175168
// enable the simplification of the geometries (Using the current map2pixel context) before send it to renderer engine.

0 commit comments

Comments
 (0)