From 429ffde9670f997004eab8a7a05afedcb1abe648 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Wed, 7 Oct 2020 16:02:12 +1000 Subject: [PATCH] [gps] Ensure that the status bar GPS distance readout only shows in response to a mouse action and doesn't always re-show as a result of a GPS position change Otherwise as soon as the message appears, it will endlessly re-show as the GPS position is constantly changing. Instead ensure that the message starts showing for a maximum of 2 seconds in response to a mouse movement, yet will update during these 2 seconds if the GPS position is updated during this time. --- src/app/gps/qgsgpsinformationwidget.cpp | 25 +++++++++++++++++++------ src/app/gps/qgsgpsinformationwidget.h | 3 ++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/src/app/gps/qgsgpsinformationwidget.cpp b/src/app/gps/qgsgpsinformationwidget.cpp index 30ee14d9df62..266adb5d50f7 100644 --- a/src/app/gps/qgsgpsinformationwidget.cpp +++ b/src/app/gps/qgsgpsinformationwidget.cpp @@ -107,7 +107,7 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg connect( QgsProject::instance()->displaySettings(), &QgsProjectDisplaySettings::bearingFormatChanged, this, [ = ] { mBearingNumericFormat.reset( QgsProject::instance()->displaySettings()->bearingFormat()->clone() ); - updateGpsDistanceStatusMessage(); + updateGpsDistanceStatusMessage( false ); } ); mCanvasToWgs84Transform = QgsCoordinateTransform( mMapCanvas->mapSettings().destinationCrs(), mWgs84CRS, QgsProject::instance() ); @@ -1005,7 +1005,7 @@ void QgsGpsInformationWidget::displayGPSInformation( const QgsGpsInformation &in addVertex(); } - updateGpsDistanceStatusMessage(); + updateGpsDistanceStatusMessage( false ); } if ( !std::isnan( info.direction ) || ( mTravelBearingCheckBox->isChecked() && !mSecondLastGpsPosition.isEmpty() ) ) @@ -1621,7 +1621,7 @@ void QgsGpsInformationWidget::cursorCoordinateChanged( const QgsPointXY &point ) try { mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( point ); - updateGpsDistanceStatusMessage(); + updateGpsDistanceStatusMessage( true ); } catch ( QgsCsException & ) { @@ -1629,11 +1629,24 @@ void QgsGpsInformationWidget::cursorCoordinateChanged( const QgsPointXY &point ) } } -void QgsGpsInformationWidget::updateGpsDistanceStatusMessage() +void QgsGpsInformationWidget::updateGpsDistanceStatusMessage( bool forceDisplay ) { if ( !mNmea ) return; + if ( !forceDisplay ) + { + // if we aren't forcing the display of the message (i.e. in direct response to a mouse cursor movement), + // then only show an updated message when the GPS position changes if the previous forced message occurred < 2 seconds ago. + // otherwise we end up showing infinite messages as the GPS position constantly changes... + if ( mLastForcedStatusUpdate.hasExpired( 2000 ) ) + return; + } + else + { + mLastForcedStatusUpdate.restart(); + } + const double distance = mDistanceCalculator.convertLengthMeasurement( mDistanceCalculator.measureLine( QVector< QgsPointXY >() << mLastCursorPosWgs84 << mLastGpsPosition ), QgsProject::instance()->distanceUnits() ); const double bearing = 180 * mDistanceCalculator.bearing( mLastGpsPosition, mLastCursorPosWgs84 ) / M_PI; @@ -1641,7 +1654,7 @@ void QgsGpsInformationWidget::updateGpsDistanceStatusMessage() const QString distanceString = QgsDistanceArea::formatDistance( distance, distanceDecimalPlaces, QgsProject::instance()->distanceUnits() ); const QString bearingString = mBearingNumericFormat->formatDouble( bearing, QgsNumericFormatContext() ); - QgisApp::instance()->statusBarIface()->showMessage( tr( "%1 (%2) from GPS location" ).arg( distanceString, bearingString ), 2000 ); + QgisApp::instance()->statusBarIface()->showMessage( tr( "%1 (%2) from GPS location" ).arg( distanceString, bearingString ), forceDisplay ? 2000 : 2000 - mLastForcedStatusUpdate.elapsed() ); } void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *mapLayer ) @@ -1686,7 +1699,7 @@ void QgsGpsInformationWidget::tapAndHold( const QgsPointXY &mapPoint, QTapAndHol try { mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( mapPoint ); - updateGpsDistanceStatusMessage(); + updateGpsDistanceStatusMessage( true ); } catch ( QgsCsException & ) { diff --git a/src/app/gps/qgsgpsinformationwidget.h b/src/app/gps/qgsgpsinformationwidget.h index ec53fd18fb48..cdb5bc9e4128 100644 --- a/src/app/gps/qgsgpsinformationwidget.h +++ b/src/app/gps/qgsgpsinformationwidget.h @@ -136,7 +136,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa #endif void createRubberBand(); - void updateGpsDistanceStatusMessage(); + void updateGpsDistanceStatusMessage( bool forceDisplay ); QgsCoordinateReferenceSystem mWgs84CRS; QgsCoordinateTransform mCanvasToWgs84Transform; @@ -170,6 +170,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa std::unique_ptr< QgsBearingNumericFormat > mBearingNumericFormat; QElapsedTimer mLastRotateTimer; + QElapsedTimer mLastForcedStatusUpdate; friend class TestQgsGpsInformationWidget; };