diff --git a/python/core/qgsmaprenderercache.sip b/python/core/qgsmaprenderercache.sip index f500f145017..b2031ad3d13 100644 --- a/python/core/qgsmaprenderercache.sip +++ b/python/core/qgsmaprenderercache.sip @@ -18,6 +18,8 @@ class QgsMapRendererCache : QObject QImage cacheImage( const QString& cacheKey ) const; + QList< QgsMapLayer* > dependentLayers( const QString& cacheKey ) const; + void clearCacheImage( const QString& cacheKey ); }; diff --git a/src/core/qgsmaprenderercache.cpp b/src/core/qgsmaprenderercache.cpp index face569fc25..43c35846531 100644 --- a/src/core/qgsmaprenderercache.cpp +++ b/src/core/qgsmaprenderercache.cpp @@ -129,6 +129,15 @@ QImage QgsMapRendererCache::cacheImage( const QString& cacheKey ) const return mCachedImages.value( cacheKey ).cachedImage; } +QList< QgsMapLayer* > QgsMapRendererCache::dependentLayers( const QString& cacheKey ) const +{ + if ( mCachedImages.contains( cacheKey ) ) + { + return _qgis_listQPointerToRaw( mCachedImages.value( cacheKey ).dependentLayers ); + } + return QList< QgsMapLayer* >(); +} + void QgsMapRendererCache::layerRequestedRepaint() { QgsMapLayer* layer = qobject_cast( sender() ); diff --git a/src/core/qgsmaprenderercache.h b/src/core/qgsmaprenderercache.h index f500d16cd82..320a807792b 100644 --- a/src/core/qgsmaprenderercache.h +++ b/src/core/qgsmaprenderercache.h @@ -84,6 +84,12 @@ class CORE_EXPORT QgsMapRendererCache : public QObject */ QImage cacheImage( const QString& cacheKey ) const; + /** + * Returns a list of map layers on which an image in the cache depends. + * @note added in QGIS 3.0 + */ + QList< QgsMapLayer* > dependentLayers( const QString& cacheKey ) const; + /** * Removes an image from the cache with matching \a cacheKey. * @see clear() diff --git a/tests/src/python/test_qgsmaprenderercache.py b/tests/src/python/test_qgsmaprenderercache.py index 8729090a2ab..3c72c74cd7f 100644 --- a/tests/src/python/test_qgsmaprenderercache.py +++ b/tests/src/python/test_qgsmaprenderercache.py @@ -192,6 +192,26 @@ class TestQgsMapRendererCache(unittest.TestCase): self.assertFalse(cache.cacheImage('nolayer').isNull()) self.assertEqual(cache.cacheImage('nolayer'), im1) + def testDependentLayers(self): + # bad layer tests + cache = QgsMapRendererCache() + self.assertEqual(cache.dependentLayers('not a layer'), []) + + layer1 = QgsVectorLayer("Point?field=fldtxt:string", + "layer1", "memory") + layer2 = QgsVectorLayer("Point?field=fldtxt:string", + "layer2", "memory") + + im = QImage(200, 200, QImage.Format_RGB32) + cache.setCacheImage('no depends', im, []) + self.assertEqual(cache.dependentLayers('no depends'), []) + cache.setCacheImage('depends', im, [layer1, layer2]) + self.assertEqual(set(cache.dependentLayers('depends')), set([layer1, layer2])) + + # try deleting a layer in the meantime.. + layer2 = None + self.assertEqual(set(cache.dependentLayers('depends')), set([layer1])) + if __name__ == '__main__': unittest.main()