Update canvas on short timeout after elevation slider is dragged

Avoids sending many requests to redraw the canvas while the
slider is dragged rapidly
This commit is contained in:
Nyall Dawson 2024-05-14 13:34:34 +10:00 committed by Martin Dobias
parent bc9635d2e9
commit a74f68fd91
2 changed files with 22 additions and 1 deletions

View File

@ -86,7 +86,12 @@ QgsCanvasElevationControllerBridge::QgsCanvasElevationControllerBridge( QgsEleva
, mController( controller )
, mCanvas( canvas )
{
connect( mController, &QgsElevationControllerWidget::rangeChanged, mCanvas, &QgsMapCanvas::setZRange );
// canvas updates are applied after a short timeout, to avoid sending too many rapid redraw requests
// while the controller slider is being dragged
mUpdateCanvasTimer = new QTimer( this );
mUpdateCanvasTimer->setSingleShot( true );
connect( mController, &QgsElevationControllerWidget::rangeChanged, this, &QgsCanvasElevationControllerBridge::controllerZRangeChanged );
connect( mUpdateCanvasTimer, &QTimer::timeout, this, &QgsCanvasElevationControllerBridge::setCanvasZRange );
mCanvas->addOverlayWidget( mController, Qt::Edge::LeftEdge );
@ -142,3 +147,16 @@ void QgsCanvasElevationControllerBridge::updateSignificantElevations()
mController->setSignificantElevations( QgsElevationUtils::significantZValuesForLayers( _qgis_listQPointerToRaw( mCanvasLayers ) ) );
}
void QgsCanvasElevationControllerBridge::controllerZRangeChanged( const QgsDoubleRange & )
{
mUpdateCanvasTimer->start( 100 );
}
void QgsCanvasElevationControllerBridge::setCanvasZRange()
{
if ( !mCanvas )
return;
mCanvas->setZRange( mController->range() );
}

View File

@ -38,8 +38,11 @@ class QgsCanvasElevationControllerBridge : public QObject
void canvasLayersChanged();
void updateSignificantElevations();
void controllerZRangeChanged( const QgsDoubleRange &range );
void setCanvasZRange();
private:
QTimer *mUpdateCanvasTimer = nullptr;
QgsElevationControllerWidget *mController = nullptr;
QPointer< QgsMapCanvas> mCanvas;
QgsWeakMapLayerPointerList mCanvasLayers;