Skip to content

Commit

Permalink
Make QgsBabelFormatRegistry responsible for generating a file
Browse files Browse the repository at this point in the history
filter string for all import formats
  • Loading branch information
nyalldawson committed Aug 2, 2021
1 parent ebd7d0c commit 377f1d4
Show file tree
Hide file tree
Showing 5 changed files with 57 additions and 8 deletions.
5 changes: 5 additions & 0 deletions python/core/auto_generated/gps/qgsbabelformatregistry.sip.in
Expand Up @@ -54,6 +54,11 @@ Returns a registered import format by ``name``.
Returns a registered import format by ``description``.

.. seealso:: :py:func:`importFormat`
%End

QString importFileFilter() const;
%Docstring
Returns a file filter string representing all registered import formats.
%End

QStringList deviceNames() const;
Expand Down
39 changes: 39 additions & 0 deletions src/core/gps/qgsbabelformatregistry.cpp
Expand Up @@ -20,6 +20,7 @@
#include "qgsbabelgpsdevice.h"
#include "qgssettings.h"
#include <QString>
#include <QRegularExpression>

QgsBabelFormatRegistry::QgsBabelFormatRegistry()
{
Expand Down Expand Up @@ -194,10 +195,48 @@ QgsBabelSimpleImportFormat *QgsBabelFormatRegistry::importFormatByDescription( c
{
if ( it.value()->description().compare( description, Qt::CaseInsensitive ) == 0 )
return it.value();

// also need to test square bracket variant, see logic in importFileFilter()
const QString descriptionSquareBrackets = it.value()->description().replace( '(', '[' ).replace( ')', ']' );
if ( descriptionSquareBrackets.compare( description, Qt::CaseInsensitive ) == 0 )
return it.value();
}
return nullptr;
}

QString QgsBabelFormatRegistry::importFileFilter() const
{
QStringList res;
QMap< QString, QString > descriptionToString;
for ( auto it = mImporters.constBegin(); it != mImporters.constEnd(); ++it )
{
const QStringList extensions = it.value()->extensions();
QString fileFilter;
if ( !extensions.empty() )
{
fileFilter = '(';
for ( const QString &extension : extensions )
fileFilter.append( QStringLiteral( "*.%1" ).arg( extension ) );
fileFilter.append( ')' );
}
else
{
fileFilter = QStringLiteral( "(*.*)" );
}

// we have to replace round brackets from the format description, or they are treated as the filter component!
const QString description = it.value()->description().replace( '(', '[' ).replace( ')', ']' );

descriptionToString.insert( description.toLower(), QStringLiteral( "%1 %2" ).arg( description, fileFilter ) );
}

// build the list in a sorted order of lowercase description
for ( auto it = descriptionToString.constBegin(); it != descriptionToString.constEnd(); ++it )
res << it.value();

return res.join( QStringLiteral( ";;" ) );
}

QStringList QgsBabelFormatRegistry::deviceNames() const
{
return mDevices.keys();
Expand Down
5 changes: 5 additions & 0 deletions src/core/gps/qgsbabelformatregistry.h
Expand Up @@ -70,6 +70,11 @@ class CORE_EXPORT QgsBabelFormatRegistry
*/
QgsBabelSimpleImportFormat *importFormatByDescription( const QString &description );

/**
* Returns a file filter string representing all registered import formats.
*/
QString importFileFilter() const;

/**
* Returns a list of the names of all registered devices.
*/
Expand Down
10 changes: 2 additions & 8 deletions src/plugins/gps_importer/qgsgpsplugingui.cpp
Expand Up @@ -286,14 +286,8 @@ void QgsGpsPluginGui::populateIMPBabelFormats()
QString lastDLDevice = settings.value( QStringLiteral( "Plugin-GPS/lastdldevice" ), "" ).toString();
QString lastULDevice = settings.value( QStringLiteral( "Plugin-GPS/lastuldevice" ), "" ).toString();

const QStringList importers = QgsApplication::gpsBabelFormatRegistry()->importFormatNames();
for ( const QString &format : importers )
{
const QgsBabelSimpleImportFormat *importFormat = qgis::down_cast< QgsBabelSimpleImportFormat * >( QgsApplication::gpsBabelFormatRegistry()->importFormat( format ) );
if ( importFormat )
mBabelFilter.append( importFormat->description() ).append( " (*.*);;" );
}
mBabelFilter.chop( 2 ); // Remove the trailing ;;, which otherwise leads to an empty filetype
mBabelFilter = QgsApplication::gpsBabelFormatRegistry()->importFileFilter();

int u = -1, d = -1;
const QStringList devices = QgsApplication::gpsBabelFormatRegistry()->deviceNames();
for ( const QString &device : devices )
Expand Down
6 changes: 6 additions & 0 deletions tests/src/python/test_qgsbabelgpsformat.py
Expand Up @@ -183,6 +183,12 @@ def test_registry(self):
self.assertIsNone(registry.importFormatByDescription('aaaaaa'))
self.assertEqual(registry.importFormatByDescription('Navitrak DNA marker format').name(), 'dna')
self.assertEqual(registry.importFormatByDescription('navitrak dna marker format').name(), 'dna')
self.assertEqual(registry.importFormatByDescription('PocketFMS flightplan (.xml)').name(), 'pocketfms_fp')
# see explanation in QgsBabelFormatRegistry::importFileFilter()!
self.assertEqual(registry.importFormatByDescription('PocketFMS flightplan [.xml]').name(), 'pocketfms_fp')

self.assertIn(';;ESRI shapefile (*.shp);;', registry.importFileFilter())
self.assertIn(';;PocketFMS flightplan [.xml] (*.xml);;', registry.importFileFilter())

# should have only one device by default
self.assertEqual(registry.deviceNames(), ['Garmin serial'])
Expand Down

0 comments on commit 377f1d4

Please sign in to comment.