Skip to content

Commit

Permalink
[gps] Ensure that the status bar GPS distance readout only shows
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
nyalldawson committed Oct 8, 2020
1 parent 9efa05b commit 429ffde
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 7 deletions.
25 changes: 19 additions & 6 deletions src/app/gps/qgsgpsinformationwidget.cpp
Expand Up @@ -107,7 +107,7 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg
connect( QgsProject::instance()->displaySettings(), &QgsProjectDisplaySettings::bearingFormatChanged, this, [ = ] connect( QgsProject::instance()->displaySettings(), &QgsProjectDisplaySettings::bearingFormatChanged, this, [ = ]
{ {
mBearingNumericFormat.reset( QgsProject::instance()->displaySettings()->bearingFormat()->clone() ); mBearingNumericFormat.reset( QgsProject::instance()->displaySettings()->bearingFormat()->clone() );
updateGpsDistanceStatusMessage(); updateGpsDistanceStatusMessage( false );
} ); } );


mCanvasToWgs84Transform = QgsCoordinateTransform( mMapCanvas->mapSettings().destinationCrs(), mWgs84CRS, QgsProject::instance() ); mCanvasToWgs84Transform = QgsCoordinateTransform( mMapCanvas->mapSettings().destinationCrs(), mWgs84CRS, QgsProject::instance() );
Expand Down Expand Up @@ -1005,7 +1005,7 @@ void QgsGpsInformationWidget::displayGPSInformation( const QgsGpsInformation &in
addVertex(); addVertex();
} }


updateGpsDistanceStatusMessage(); updateGpsDistanceStatusMessage( false );
} }


if ( !std::isnan( info.direction ) || ( mTravelBearingCheckBox->isChecked() && !mSecondLastGpsPosition.isEmpty() ) ) if ( !std::isnan( info.direction ) || ( mTravelBearingCheckBox->isChecked() && !mSecondLastGpsPosition.isEmpty() ) )
Expand Down Expand Up @@ -1621,27 +1621,40 @@ void QgsGpsInformationWidget::cursorCoordinateChanged( const QgsPointXY &point )
try try
{ {
mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( point ); mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( point );
updateGpsDistanceStatusMessage(); updateGpsDistanceStatusMessage( true );
} }
catch ( QgsCsException & ) catch ( QgsCsException & )
{ {


} }
} }


void QgsGpsInformationWidget::updateGpsDistanceStatusMessage() void QgsGpsInformationWidget::updateGpsDistanceStatusMessage( bool forceDisplay )
{ {
if ( !mNmea ) if ( !mNmea )
return; 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 ), const double distance = mDistanceCalculator.convertLengthMeasurement( mDistanceCalculator.measureLine( QVector< QgsPointXY >() << mLastCursorPosWgs84 << mLastGpsPosition ),
QgsProject::instance()->distanceUnits() ); QgsProject::instance()->distanceUnits() );
const double bearing = 180 * mDistanceCalculator.bearing( mLastGpsPosition, mLastCursorPosWgs84 ) / M_PI; const double bearing = 180 * mDistanceCalculator.bearing( mLastGpsPosition, mLastCursorPosWgs84 ) / M_PI;
const int distanceDecimalPlaces = QgsSettings().value( QStringLiteral( "qgis/measure/decimalplaces" ), "3" ).toInt(); const int distanceDecimalPlaces = QgsSettings().value( QStringLiteral( "qgis/measure/decimalplaces" ), "3" ).toInt();
const QString distanceString = QgsDistanceArea::formatDistance( distance, distanceDecimalPlaces, QgsProject::instance()->distanceUnits() ); const QString distanceString = QgsDistanceArea::formatDistance( distance, distanceDecimalPlaces, QgsProject::instance()->distanceUnits() );
const QString bearingString = mBearingNumericFormat->formatDouble( bearing, QgsNumericFormatContext() ); 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 ) void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *mapLayer )
Expand Down Expand Up @@ -1686,7 +1699,7 @@ void QgsGpsInformationWidget::tapAndHold( const QgsPointXY &mapPoint, QTapAndHol
try try
{ {
mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( mapPoint ); mLastCursorPosWgs84 = mCanvasToWgs84Transform.transform( mapPoint );
updateGpsDistanceStatusMessage(); updateGpsDistanceStatusMessage( true );
} }
catch ( QgsCsException & ) catch ( QgsCsException & )
{ {
Expand Down
3 changes: 2 additions & 1 deletion src/app/gps/qgsgpsinformationwidget.h
Expand Up @@ -136,7 +136,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
#endif #endif
void createRubberBand(); void createRubberBand();


void updateGpsDistanceStatusMessage(); void updateGpsDistanceStatusMessage( bool forceDisplay );


QgsCoordinateReferenceSystem mWgs84CRS; QgsCoordinateReferenceSystem mWgs84CRS;
QgsCoordinateTransform mCanvasToWgs84Transform; QgsCoordinateTransform mCanvasToWgs84Transform;
Expand Down Expand Up @@ -170,6 +170,7 @@ class APP_EXPORT QgsGpsInformationWidget: public QgsPanelWidget, public QgsMapCa
std::unique_ptr< QgsBearingNumericFormat > mBearingNumericFormat; std::unique_ptr< QgsBearingNumericFormat > mBearingNumericFormat;


QElapsedTimer mLastRotateTimer; QElapsedTimer mLastRotateTimer;
QElapsedTimer mLastForcedStatusUpdate;


friend class TestQgsGpsInformationWidget; friend class TestQgsGpsInformationWidget;
}; };
Expand Down

0 comments on commit 429ffde

Please sign in to comment.