From a74f68fd919a40d2f47cbfe5d7bf0724817f1005 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 14 May 2024 13:34:34 +1000 Subject: [PATCH] Update canvas on short timeout after elevation slider is dragged Avoids sending many requests to redraw the canvas while the slider is dragged rapidly --- src/app/canvas/qgsappcanvasfiltering.cpp | 20 +++++++++++++++++++- src/app/canvas/qgsappcanvasfiltering.h | 3 +++ 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/src/app/canvas/qgsappcanvasfiltering.cpp b/src/app/canvas/qgsappcanvasfiltering.cpp index ad065142dd5e..2b9e7cd68726 100644 --- a/src/app/canvas/qgsappcanvasfiltering.cpp +++ b/src/app/canvas/qgsappcanvasfiltering.cpp @@ -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() ); +} diff --git a/src/app/canvas/qgsappcanvasfiltering.h b/src/app/canvas/qgsappcanvasfiltering.h index 5123e6c6e40d..a1e779e5915d 100644 --- a/src/app/canvas/qgsappcanvasfiltering.h +++ b/src/app/canvas/qgsappcanvasfiltering.h @@ -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;