Skip to content

Commit e814e8d

Browse files
committed
Invalidate cached image when layer's data or appearance is modified
1 parent 9164ae9 commit e814e8d

File tree

7 files changed

+47
-5
lines changed

7 files changed

+47
-5
lines changed

python/gui/qgsmapcanvas.sip

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -79,6 +79,10 @@ class QgsMapCanvas : QGraphicsView
7979
//! @note added in 2.1
8080
bool isCachingEnabled() const;
8181

82+
//! Make sure to remove any rendered images from cache (does nothing if cache is not enabled)
83+
//! @note added in 2.1
84+
void clearCache();
85+
8286
//! Set whether the layers are rendered in parallel or sequentially
8387
//! @note added in 2.1
8488
void setParallelRenderingEnabled( bool enabled );

src/app/qgisapp.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5681,6 +5681,8 @@ void QgisApp::refreshMapCanvas()
56815681
{
56825682
//reload cached provider data
56835683
QgsMapLayerRegistry::instance()->reloadAllLayers();
5684+
5685+
mMapCanvas->clearCache();
56845686
//then refresh
56855687
mMapCanvas->refresh();
56865688
}
@@ -6726,7 +6728,7 @@ void QgisApp::adjustBrightnessContrast( int delta, bool updateBrightness )
67266728
brightnessFilter->setContrast( brightnessFilter->contrast() + delta );
67276729
}
67286730

6729-
mMapCanvas->refresh();
6731+
myRasterLayer->triggerRepaint();
67306732
}
67316733

67326734
void QgisApp::helpContents()

src/core/qgsmaplayer.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -407,8 +407,8 @@ class CORE_EXPORT QgsMapLayer : public QObject
407407
*/
408408
void layerCrsChanged();
409409

410-
/** This signal should be connected with the slot QgsMapCanvas::refresh()
411-
* \todo to be removed - GUI dependency
410+
/** By emitting this signal the layer tells that either appearance or content have been changed
411+
* and any view showing the rendered layer should refresh itself.
412412
*/
413413
void repaintRequested();
414414

src/core/qgsvectorlayer.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,8 @@ QgsVectorLayer::QgsVectorLayer( QString vectorLayerPath,
168168

169169
connect( this, SIGNAL( selectionChanged( QgsFeatureIds, QgsFeatureIds, bool ) ), this, SIGNAL( selectionChanged() ) );
170170

171+
connect( this, SIGNAL( selectionChanged( QgsFeatureIds, QgsFeatureIds, bool ) ), this, SIGNAL( repaintRequested() ) );
172+
171173
connect( QgsProject::instance()->relationManager(), SIGNAL( relationsLoaded() ), this, SLOT( onRelationsLoaded() ) );
172174
} // QgsVectorLayer ctor
173175

@@ -888,6 +890,9 @@ bool QgsVectorLayer::setSubsetString( QString subset )
888890
mDataSource = mDataProvider->dataSourceUri();
889891
updateExtents();
890892

893+
if ( res )
894+
emit repaintRequested();
895+
891896
return res;
892897
}
893898

@@ -2325,6 +2330,8 @@ bool QgsVectorLayer::commitChanges()
23252330
updateFields();
23262331
mDataProvider->updateExtents();
23272332

2333+
emit repaintRequested();
2334+
23282335
return success;
23292336
}
23302337

@@ -2366,6 +2373,7 @@ bool QgsVectorLayer::rollBack( bool deleteBuffer )
23662373
mCache->deleteCachedGeometries();
23672374
}
23682375

2376+
emit repaintRequested();
23692377
return true;
23702378
}
23712379

src/core/raster/qgsrasterlayer.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -931,6 +931,8 @@ void QgsRasterLayer::setContrastEnhancement( QgsContrastEnhancement::ContrastEnh
931931
if ( myEnhancements.value( 1 ) ) myMultiBandRenderer->setGreenContrastEnhancement( myEnhancements.value( 1 ) );
932932
if ( myEnhancements.value( 2 ) ) myMultiBandRenderer->setBlueContrastEnhancement( myEnhancements.value( 2 ) );
933933
}
934+
935+
emit repaintRequested();
934936
}
935937

936938
void QgsRasterLayer::setDefaultContrastEnhancement()

src/gui/qgsmapcanvas.cpp

Lines changed: 21 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ void QgsMapCanvas::setLayerSet( QList<QgsMapCanvasLayer> &layers )
370370
// Add check if vector layer when disconnecting from selectionChanged slot
371371
// Ticket #811 - racicot
372372
QgsMapLayer *currentLayer = layer( i );
373-
disconnect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( refresh() ) );
373+
disconnect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( layerRequestedRepaint() ) );
374374
QgsVectorLayer *isVectLyr = qobject_cast<QgsVectorLayer *>( currentLayer );
375375
if ( isVectLyr )
376376
{
@@ -385,7 +385,7 @@ void QgsMapCanvas::setLayerSet( QList<QgsMapCanvasLayer> &layers )
385385
// Add check if vector layer when connecting to selectionChanged slot
386386
// Ticket #811 - racicot
387387
QgsMapLayer *currentLayer = layer( i );
388-
connect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( refresh() ) );
388+
connect( currentLayer, SIGNAL( repaintRequested() ), this, SLOT( layerRequestedRepaint() ) );
389389
QgsVectorLayer *isVectLyr = qobject_cast<QgsVectorLayer *>( currentLayer );
390390
if ( isVectLyr )
391391
{
@@ -509,6 +509,12 @@ bool QgsMapCanvas::isCachingEnabled() const
509509
return mCache != 0;
510510
}
511511

512+
void QgsMapCanvas::clearCache()
513+
{
514+
if ( mCache )
515+
mCache->clear();
516+
}
517+
512518
void QgsMapCanvas::setParallelRenderingEnabled( bool enabled )
513519
{
514520
mUseParallelRendering = enabled;
@@ -640,6 +646,19 @@ void QgsMapCanvas::refreshMap()
640646
mMapUpdateTimer.start();
641647
}
642648

649+
void QgsMapCanvas::layerRequestedRepaint()
650+
{
651+
// make sure to clear the cached image
652+
if ( mCache )
653+
{
654+
QgsMapLayer* layer = qobject_cast<QgsMapLayer*>( sender() );
655+
if ( layer )
656+
mCache->setCacheImage( layer->id(), QImage() );
657+
}
658+
659+
refresh();
660+
}
661+
643662
void QgsMapCanvas::rendererJobFinished()
644663
{
645664
qDebug("CANVAS finish! %d", !mJobCancelled );

src/gui/qgsmapcanvas.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -150,6 +150,10 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
150150
//! @note added in 2.1
151151
bool isCachingEnabled() const;
152152

153+
//! Make sure to remove any rendered images from cache (does nothing if cache is not enabled)
154+
//! @note added in 2.1
155+
void clearCache();
156+
153157
//! Set whether the layers are rendered in parallel or sequentially
154158
//! @note added in 2.1
155159
void setParallelRenderingEnabled( bool enabled );
@@ -367,6 +371,9 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView
367371

368372
void refreshMap();
369373

374+
//! Layer says something has changed that affects its appearance
375+
void layerRequestedRepaint();
376+
370377
signals:
371378
/** Let the owner know how far we are with render operations */
372379
//! @deprecated since 2.1 - already unused in 2.0 anyway

0 commit comments

Comments
 (0)