QGIS API Documentation  2.8.2-Wien
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Groups Pages
qgsvectorlayercache.h
Go to the documentation of this file.
1 /***************************************************************************
2  qgsvectorlayercache.h
3  Cache features of a vector layer
4  -------------------
5  begin : January 2013
6  copyright : (C) Matthias Kuhn
7  email : matthias dot kuhn at gmx dot ch
8 
9  ***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 
19 #ifndef QgsVectorLayerCache_H
20 #define QgsVectorLayerCache_H
21 
22 #include <QCache>
23 
24 #include "qgsvectorlayer.h"
25 
28 
38 class CORE_EXPORT QgsVectorLayerCache : public QObject
39 {
40  Q_OBJECT
41 
42  private:
48  class QgsCachedFeature
49  {
50  public:
57  QgsCachedFeature( const QgsFeature& feat, QgsVectorLayerCache* vlCache )
58  : mCache( vlCache )
59  {
60  mFeature = new QgsFeature( feat );
61  }
62 
63  ~QgsCachedFeature()
64  {
65  // That's the reason we need this wrapper:
66  // Inform the cache that this feature has been removed
67  mCache->featureRemoved( mFeature->id() );
68  delete mFeature;
69  }
70 
71  inline const QgsFeature* feature() { return mFeature; }
72 
73  private:
74  QgsFeature* mFeature;
75  QgsVectorLayerCache* mCache;
76 
77  friend class QgsVectorLayerCache;
78  Q_DISABLE_COPY( QgsCachedFeature )
79  };
80 
81  public:
82  QgsVectorLayerCache( QgsVectorLayer* layer, int cacheSize, QObject* parent = NULL );
84 
91  void setCacheSize( int cacheSize );
92 
100  int cacheSize();
101 
107  void setCacheGeometry( bool cacheGeometry );
108 
109 
115  void setCacheSubsetOfAttributes( const QgsAttributeList& attributes );
116 
123  void setCacheAddedAttributes( bool cacheAddedAttributes );
124 
135  void setFullCache( bool fullCache );
136 
145  void addCacheIndex( QgsAbstractCacheIndex *cacheIndex );
146 
157 
163  bool isFidCached( const QgsFeatureId fid );
164 
172  bool featureAtId( QgsFeatureId featureId, QgsFeature &feature, bool skipCache = false );
173 
179  bool removeCachedFeature( QgsFeatureId fid );
180 
185 
186  protected:
195  void requestCompleted( QgsFeatureRequest featureRequest, QgsFeatureIds fids );
196 
204  void featureRemoved( QgsFeatureId fid );
205 
216  bool checkInformationCovered( const QgsFeatureRequest& featureRequest );
217 
218 
219  signals:
220 
230  void progress( int i, bool& cancel );
231 
235  void finished();
236 
242  void cachedLayerDeleted();
243 
248  void attributeValueChanged( const QgsFeatureId& fid, const int& field, const QVariant &value );
249 
257  void featureAdded( QgsFeatureId fid );
258 
259  private slots:
260  void onAttributeValueChanged( QgsFeatureId fid, int field, const QVariant& value );
261  void featureDeleted( QgsFeatureId fid );
262  void onFeatureAdded( QgsFeatureId fid );
263  void attributeAdded( int field );
264  void attributeDeleted( int field );
265  void geometryChanged( QgsFeatureId fid, QgsGeometry& geom );
266  void layerDeleted();
267  void updatedFields();
268 
269  private:
270 
271  inline void cacheFeature( QgsFeature& feat )
272  {
273  QgsCachedFeature* cachedFeature = new QgsCachedFeature( feat, this );
274  mCache.insert( feat.id(), cachedFeature );
275  }
276 
277  QgsVectorLayer* mLayer;
278  QCache< QgsFeatureId, QgsCachedFeature > mCache;
279 
280  bool mCacheGeometry;
281  bool mFullCache;
282  QList<QgsAbstractCacheIndex*> mCacheIndices;
283 
284  QgsAttributeList mCachedAttributes;
285 
288  friend class QgsCachedFeature;
289 };
290 #endif // QgsVectorLayerCache_H