Skip to content

Commit

Permalink
Fix preferred fields storage
Browse files Browse the repository at this point in the history
  • Loading branch information
elpaso committed Jun 24, 2019
1 parent 5c6223c commit 538e294
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 23 deletions.
6 changes: 4 additions & 2 deletions src/app/gps/qgsgpsinformationwidget.cpp
Expand Up @@ -311,7 +311,7 @@ QgsGpsInformationWidget::QgsGpsInformationWidget( QgsMapCanvas *mapCanvas, QWidg
mCbxLeapSeconds->setEnabled( enabled );
mLeapSeconds->setEnabled( enabled );
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mMapCanvas->currentLayer() );
if ( vlayer )
if ( vlayer && ! mPopulatingFields )
{
mPreferredTimestampFields[ vlayer->id() ] = mCboTimestampField->currentText();
}
Expand Down Expand Up @@ -1396,6 +1396,7 @@ void QgsGpsInformationWidget::timestampFormatChanged( int index )

void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *mapLayer )
{
mPopulatingFields = true;
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( mapLayer );
mGboxTimestamp->setEnabled( false );
mCboTimestampField->clear();
Expand All @@ -1415,7 +1416,7 @@ void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *map
if ( mCboTimestampField->count() > 1 )
{
mGboxTimestamp->setEnabled( true );
// Set default if stored
// Set preferred if stored
if ( mPreferredTimestampFields.contains( vlayer->id( ) ) )
{
int idx { mCboTimestampField->findText( mPreferredTimestampFields[ vlayer->id( ) ] ) };
Expand All @@ -1435,6 +1436,7 @@ void QgsGpsInformationWidget::updateTimestampDestinationFields( QgsMapLayer *map
}
}
}
mPopulatingFields = false;
}

void QgsGpsInformationWidget::switchAcquisition()
Expand Down
3 changes: 2 additions & 1 deletion src/app/gps/qgsgpsinformationwidget.h
Expand Up @@ -131,7 +131,8 @@ class APP_EXPORT QgsGpsInformationWidget: public QWidget, private Ui::QgsGpsInfo
unsigned int mDistanceThreshold = 0;
//! Temporary storage of preferred fields
QMap<QString, QString> mPreferredTimestampFields;

//! Flag when updating fields
bool mPopulatingFields = false;
friend class TestQgsGpsInformationWidget;
};

Expand Down
56 changes: 36 additions & 20 deletions tests/src/app/testqgsgpsinformationwidget.cpp
Expand Up @@ -65,27 +65,30 @@ void TestQgsGpsInformationWidget::testTimestamp()
{

//create a temporary layer
std::unique_ptr< QgsVectorLayer> tempLayer( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );
std::unique_ptr< QgsVectorLayer> tempLayerString( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=stringf:string&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );
std::unique_ptr< QgsVectorLayer> tempLayerDateTime( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=datetimef:datetime&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );
QgsVectorLayer *tempLayer( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );
QgsVectorLayer *tempLayerString( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=stringf:string&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );
QgsVectorLayer *tempLayerDateTime( new QgsVectorLayer( QStringLiteral( "Point?crs=epsg:4326&field=datetimef:datetime&field=intf:int" ),
QStringLiteral( "vl" ),
QStringLiteral( "memory" ) ) );

QgsProject::instance()->addMapLayers( { tempLayer, tempLayerString, tempLayerDateTime } );

QVERIFY( tempLayer->isValid() );
QgsMapCanvas *canvas = mQgisApp->mapCanvas();
QgsGpsInformationWidget widget( canvas );
canvas->setCurrentLayer( tempLayer.get() );
canvas->setCurrentLayer( tempLayer );
QVERIFY( ! widget.mGboxTimestamp->isEnabled() );

canvas->setCurrentLayer( tempLayerString.get() );
canvas->setCurrentLayer( tempLayerString );
QVERIFY( widget.mGboxTimestamp->isEnabled() );
QVERIFY( widget.mCboTimestampField->findText( QStringLiteral( "stringf" ) ) != -1 );
QVERIFY( widget.mCboTimestampField->findText( QStringLiteral( "intf" ) ) == -1 );

canvas->setCurrentLayer( tempLayerDateTime.get() );
canvas->setCurrentLayer( tempLayerDateTime );
QVERIFY( widget.mGboxTimestamp->isEnabled() );
QVERIFY( widget.mCboTimestampField->findText( QStringLiteral( "datetimef" ) ) != -1 );
QVERIFY( widget.mCboTimestampField->findText( QStringLiteral( "intf" ) ) == -1 );
Expand All @@ -98,11 +101,11 @@ void TestQgsGpsInformationWidget::testTimestamp()
widget.mCboTimestampFormat->setCurrentIndex( widget.mCboTimestampFormat->findData( Qt::TimeSpec::TimeZone ) );
QVERIFY( widget.mCboTimeZones->isEnabled() );

canvas->setCurrentLayer( tempLayer.get() );
canvas->setCurrentLayer( tempLayer );
QVERIFY( ! widget.mGboxTimestamp->isEnabled() );

// Test timestamp conversions
canvas->setCurrentLayer( tempLayerDateTime.get() );
canvas->setCurrentLayer( tempLayerDateTime );
// 2019/06/19 12:27:34.543[UTC]
widget.mLastNmeaTime = { 119, 5, 19, 12, 27, 34, 543 };
QDateTime dateTime( QDate( 2019, 6, 19 ), QTime( 12, 27, 34, 543 ) );
Expand All @@ -116,30 +119,43 @@ void TestQgsGpsInformationWidget::testTimestamp()
QVERIFY( fieldIdx != -1 );
// UTC
widget.mCboTimestampFormat->setCurrentIndex( widget.mCboTimestampFormat->findData( Qt::TimeSpec::UTC ) );
QVariant dt { widget.timestamp( tempLayerDateTime.get(), fieldIdx ) };
QVariant dt { widget.timestamp( tempLayerDateTime, fieldIdx ) };
QCOMPARE( dt.toDateTime(), dateTime );
QVERIFY( widget.mPreferredTimestampFields.contains( tempLayerDateTime->id() ) );
QCOMPARE( widget.mPreferredTimestampFields[ tempLayerDateTime->id() ], QStringLiteral( "datetimef" ) );

// Test string
canvas->setCurrentLayer( tempLayerString.get() );
// Test store preferred fields
canvas->setCurrentLayer( tempLayerString );
fieldIdx = tempLayerString->fields().indexOf( QStringLiteral( "stringf" ) );
QVERIFY( fieldIdx != -1 );
widget.mCboTimestampField->setCurrentIndex( widget.mCboTimestampField->findText( QStringLiteral( "stringf" ) ) );
canvas->setCurrentLayer( tempLayerDateTime );
QVERIFY( widget.mPreferredTimestampFields.contains( tempLayerDateTime->id() ) );
QCOMPARE( widget.mPreferredTimestampFields[ tempLayerString->id() ], QStringLiteral( "stringf" ) );
QVERIFY( widget.mPreferredTimestampFields.contains( tempLayerDateTime->id() ) );
QCOMPARE( widget.mPreferredTimestampFields[ tempLayerDateTime->id() ], QStringLiteral( "datetimef" ) );

// Test string
canvas->setCurrentLayer( tempLayerString );
// UTC
widget.mCboTimestampFormat->setCurrentIndex( widget.mCboTimestampFormat->findData( Qt::TimeSpec::UTC ) );
dt = widget.timestamp( tempLayerString.get(), fieldIdx );
dt = widget.timestamp( tempLayerString, fieldIdx );
QCOMPARE( dt.toString(), dateTime.toString( Qt::DateFormat::ISODate ) );
// Local Time (not very robust because we cannot change the system timezone and it may be GMT)
widget.mCboTimestampFormat->setCurrentIndex( widget.mCboTimestampFormat->findData( Qt::TimeSpec::LocalTime ) );
dt = widget.timestamp( tempLayerString.get(), fieldIdx );
dt = widget.timestamp( tempLayerString, fieldIdx );
QDateTime localTime( dateTime.toLocalTime() );
QCOMPARE( dt.toString(), localTime.toString( Qt::DateFormat::ISODate ) );
// Timezone
widget.mCboTimestampFormat->setCurrentIndex( widget.mCboTimestampFormat->findData( Qt::TimeSpec::TimeZone ) );
widget.mCboTimeZones->setCurrentIndex( widget.mCboTimeZones->findText( QStringLiteral( "Asia/Colombo" ) ) ) ;
QDateTime tzTime( dateTime.toTimeZone( QTimeZone( QStringLiteral( "Asia/Colombo" ).toUtf8() ) ) );
dt = widget.timestamp( tempLayerString.get(), fieldIdx );
dt = widget.timestamp( tempLayerString, fieldIdx );
QCOMPARE( dt.toString(), tzTime.toString( Qt::DateFormat::ISODate ) );

// Test that preferred field is stored
canvas->setCurrentLayer( tempLayerDateTime );
QCOMPARE( widget.mCboTimestampField->currentText(), QStringLiteral( "datetimef" ) );
}

QGSTEST_MAIN( TestQgsGpsInformationWidget )
Expand Down

0 comments on commit 538e294

Please sign in to comment.