Skip to content

Commit c1b5da4

Browse files
committedFeb 6, 2017
Clear cached map renders if dependent layer is removed
1 parent aa392dc commit c1b5da4

File tree

2 files changed

+31
-2
lines changed

2 files changed

+31
-2
lines changed
 

‎src/core/qgsmaprenderercache.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,7 @@ void QgsMapRendererCache::clearInternal()
4040
if ( layer.data() )
4141
{
4242
disconnect( layer.data(), &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
43+
disconnect( layer.data(), &QgsMapLayer::willBeDeleted, this, &QgsMapRendererCache::layerRequestedRepaint );
4344
}
4445
}
4546
mCachedImages.clear();
@@ -55,6 +56,7 @@ void QgsMapRendererCache::dropUnusedConnections()
5556
if ( layer.data() )
5657
{
5758
disconnect( layer.data(), &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
59+
disconnect( layer.data(), &QgsMapLayer::willBeDeleted, this, &QgsMapRendererCache::layerRequestedRepaint );
5860
}
5961
}
6062

@@ -110,6 +112,7 @@ void QgsMapRendererCache::setCacheImage( const QString& cacheKey, const QImage&
110112
if ( !mConnectedLayers.contains( QgsWeakMapLayerPointer( layer ) ) )
111113
{
112114
connect( layer, &QgsMapLayer::repaintRequested, this, &QgsMapRendererCache::layerRequestedRepaint );
115+
connect( layer, &QgsMapLayer::willBeDeleted, this, &QgsMapRendererCache::layerRequestedRepaint );
113116
mConnectedLayers << layer;
114117
}
115118
}

‎tests/src/python/test_qgsmaprenderercache.py

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -208,9 +208,35 @@ def testDependentLayers(self):
208208
cache.setCacheImage('depends', im, [layer1, layer2])
209209
self.assertEqual(set(cache.dependentLayers('depends')), set([layer1, layer2]))
210210

211-
# try deleting a layer in the meantime..
211+
def testLayerRemoval(self):
212+
"""test that cached image is cleared when a dependent layer is removed"""
213+
cache = QgsMapRendererCache()
214+
layer1 = QgsVectorLayer("Point?field=fldtxt:string",
215+
"layer1", "memory")
216+
layer2 = QgsVectorLayer("Point?field=fldtxt:string",
217+
"layer2", "memory")
218+
im = QImage(200, 200, QImage.Format_RGB32)
219+
cache.setCacheImage('depends', im, [layer1, layer2])
220+
cache.setCacheImage('depends2', im, [layer1])
221+
cache.setCacheImage('depends3', im, [layer2])
222+
cache.setCacheImage('no depends', im, [])
223+
self.assertTrue(cache.hasCacheImage('depends'))
224+
self.assertTrue(cache.hasCacheImage('depends2'))
225+
self.assertTrue(cache.hasCacheImage('depends3'))
226+
self.assertTrue(cache.hasCacheImage('no depends'))
227+
228+
# try deleting a layer
212229
layer2 = None
213-
self.assertEqual(set(cache.dependentLayers('depends')), set([layer1]))
230+
self.assertFalse(cache.hasCacheImage('depends'))
231+
self.assertTrue(cache.hasCacheImage('depends2'))
232+
self.assertFalse(cache.hasCacheImage('depends3'))
233+
self.assertTrue(cache.hasCacheImage('no depends'))
234+
235+
layer1 = None
236+
self.assertFalse(cache.hasCacheImage('depends'))
237+
self.assertFalse(cache.hasCacheImage('depends2'))
238+
self.assertFalse(cache.hasCacheImage('depends3'))
239+
self.assertTrue(cache.hasCacheImage('no depends'))
214240

215241

216242
if __name__ == '__main__':

0 commit comments

Comments
 (0)
Please sign in to comment.