Skip to content

Commit

Permalink
Rework QgsBabelSimpleImportFormat to avoid storing using keys
Browse files Browse the repository at this point in the history
based on the format description, and instead use the (constant)
format name instead
  • Loading branch information
nyalldawson committed Aug 2, 2021
1 parent 4b17ef2 commit 3ee1f2b
Show file tree
Hide file tree
Showing 9 changed files with 218 additions and 165 deletions.
11 changes: 9 additions & 2 deletions python/core/auto_generated/gps/qgsbabelformat.sip.in
Expand Up @@ -93,14 +93,21 @@ A babel format capable of converting input files to GPX files.
%End
public:

QgsBabelSimpleImportFormat( const QString &format, Qgis::BabelFormatCapabilities capabilities );
QgsBabelSimpleImportFormat( const QString &format, const QString &description, Qgis::BabelFormatCapabilities capabilities );
%Docstring
Constructor for QgsBabelSimpleImportFormat.

The ``format`` argument specifies a babel identifier for the input format.
The ``format`` argument specifies the babel identifier for the input format.

The ``description`` argument specified a descriptive name for the format.

The ``capabilities`` argument must reflect whether the format is capable of handling
waypoints, routes and/or tracks.
%End

QString description() const;
%Docstring
Returns the friendly description for the format.
%End

virtual QStringList importCommand( const QString &babel,
Expand Down
11 changes: 10 additions & 1 deletion python/core/auto_generated/gps/qgsbabelformatregistry.sip.in
Expand Up @@ -40,11 +40,20 @@ devices previously configured and stored in QSettings.
Returns a list of the names of all registered import formats.
%End

QgsAbstractBabelFormat *importFormat( const QString &name );
QgsBabelSimpleImportFormat *importFormat( const QString &name );
%Docstring
Returns a registered import format by ``name``.

.. seealso:: :py:func:`importFormatNames`

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

QgsBabelSimpleImportFormat *importFormatByDescription( const QString &description );
%Docstring
Returns a registered import format by ``description``.

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

QStringList deviceNames() const;
Expand Down
2 changes: 1 addition & 1 deletion scripts/dump_babel_formats.py
Expand Up @@ -82,7 +82,7 @@ def process_lines(lines):
if read_tracks:
capabilities.append('Qgis::BabelFormatCapability::Tracks')
format_out[
description] = f"""mImporters[QStringLiteral( "{description}" )] = new QgsBabelSimpleImportFormat( QStringLiteral( "{name}" ), {' | '.join(capabilities)} );"""
name] = f"""mImporters[QStringLiteral( "{name}" )] = new QgsBabelSimpleImportFormat( QStringLiteral( "{name}" ), QStringLiteral( "{description}" ), {' | '.join(capabilities)} );"""

for format_name in sorted(format_out.keys(), key=lambda x: x.lower()):
print(format_out[format_name])
Expand Down
7 changes: 4 additions & 3 deletions src/core/gps/qgsbabelformat.cpp
Expand Up @@ -63,9 +63,10 @@ Qgis::BabelFormatCapabilities QgsAbstractBabelFormat::capabilities() const
// QgsSimpleBabelFormat
//

QgsBabelSimpleImportFormat::QgsBabelSimpleImportFormat( const QString &format,
QgsBabelSimpleImportFormat::QgsBabelSimpleImportFormat( const QString &format, const QString &description,
Qgis::BabelFormatCapabilities capabilities )
: mFormat( format )
: QgsAbstractBabelFormat( format )
, mDescription( description )
{
mCapabilities = capabilities;
mCapabilities |= Qgis::BabelFormatCapability::Import;
Expand All @@ -80,7 +81,7 @@ QStringList QgsBabelSimpleImportFormat::importCommand( const QString &babel,
return { QStringLiteral( "\"%1\"" ).arg( babel ),
featureTypeToArgument( featureType ),
QStringLiteral( "-i" ),
mFormat,
name(),
QStringLiteral( "-o" ),
QStringLiteral( "gpx" ),
QStringLiteral( "\"%1\"" ).arg( input ),
Expand Down
13 changes: 10 additions & 3 deletions src/core/gps/qgsbabelformat.h
Expand Up @@ -109,19 +109,26 @@ class CORE_EXPORT QgsBabelSimpleImportFormat : public QgsAbstractBabelFormat
/**
* Constructor for QgsBabelSimpleImportFormat.
*
* The \a format argument specifies a babel identifier for the input format.
* The \a format argument specifies the babel identifier for the input format.
* The \a description argument specified a descriptive name for the format.
*
* The \a capabilities argument must reflect whether the format is capable of handling
* waypoints, routes and/or tracks.
*/
QgsBabelSimpleImportFormat( const QString &format, Qgis::BabelFormatCapabilities capabilities );
QgsBabelSimpleImportFormat( const QString &format, const QString &description, Qgis::BabelFormatCapabilities capabilities );

/**
* Returns the friendly description for the format.
*/
QString description() const { return mDescription; }

QStringList importCommand( const QString &babel,
Qgis::GpsFeatureType featureType,
const QString &input,
const QString &output ) const override;
private:
QString mFormat;
QString mDescription;
};

#endif
296 changes: 153 additions & 143 deletions src/core/gps/qgsbabelformatregistry.cpp

Large diffs are not rendered by default.

16 changes: 12 additions & 4 deletions src/core/gps/qgsbabelformatregistry.h
Expand Up @@ -19,7 +19,7 @@
#include "qgis_core.h"
#include "qgis.h"

class QgsAbstractBabelFormat;
class QgsBabelSimpleImportFormat;
class QgsBabelGpsDeviceFormat;

/**
Expand Down Expand Up @@ -58,9 +58,17 @@ class CORE_EXPORT QgsBabelFormatRegistry
/**
* Returns a registered import format by \a name.
*
* \see importFormatNames().
* \see importFormatNames()
* \see importFormatByDescription()
*/
QgsAbstractBabelFormat *importFormat( const QString &name );
QgsBabelSimpleImportFormat *importFormat( const QString &name );

/**
* Returns a registered import format by \a description.
*
* \see importFormat()
*/
QgsBabelSimpleImportFormat *importFormatByDescription( const QString &description );

/**
* Returns a list of the names of all registered devices.
Expand Down Expand Up @@ -93,7 +101,7 @@ class CORE_EXPORT QgsBabelFormatRegistry
#endif

//! Importers for external GPS data file formats
QMap< QString, QgsAbstractBabelFormat *> mImporters;
QMap< QString, QgsBabelSimpleImportFormat *> mImporters;
//! Upload/downloaders for GPS devices
QMap< QString, QgsBabelGpsDeviceFormat *> mDevices;
};
Expand Down
8 changes: 6 additions & 2 deletions src/plugins/gps_importer/qgsgpsplugingui.cpp
Expand Up @@ -203,7 +203,7 @@ void QgsGpsPluginGui::pbnIMPInput_clicked()

mImpFormat = myFileType.left( myFileType.length() - 6 );

const QgsAbstractBabelFormat *format = QgsApplication::gpsBabelFormatRegistry()->importFormat( mImpFormat );
const QgsAbstractBabelFormat *format = QgsApplication::gpsBabelFormatRegistry()->importFormatByDescription( mImpFormat );
if ( !format )
{
QgsLogger::warning( "Unknown file format selected: " +
Expand Down Expand Up @@ -288,7 +288,11 @@ void QgsGpsPluginGui::populateIMPBabelFormats()

const QStringList importers = QgsApplication::gpsBabelFormatRegistry()->importFormatNames();
for ( const QString &format : importers )
mBabelFilter.append( format ).append( " (*.*);;" );
{
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
int u = -1, d = -1;
const QStringList devices = QgsApplication::gpsBabelFormatRegistry()->deviceNames();
Expand Down
19 changes: 13 additions & 6 deletions tests/src/python/test_qgsbabelgpsformat.py
Expand Up @@ -39,10 +39,12 @@ def test_simple_format(self):
"""
Test QgsBabelSimpleImportFormat
"""
f = QgsBabelSimpleImportFormat('shapefile', Qgis.BabelFormatCapability.Waypoints)
f = QgsBabelSimpleImportFormat('shapefile', 'ESRI Shapefile', Qgis.BabelFormatCapability.Waypoints)
self.assertEqual(f.name(), 'shapefile')
self.assertEqual(f.description(), 'ESRI Shapefile')
self.assertEqual(f.capabilities(), Qgis.BabelFormatCapabilities(
Qgis.BabelFormatCapability.Waypoints | Qgis.BabelFormatCapability.Import))
f = QgsBabelSimpleImportFormat('shapefile', Qgis.BabelFormatCapabilities(
f = QgsBabelSimpleImportFormat('shapefile', 'ESRI Shapefile', Qgis.BabelFormatCapabilities(
Qgis.BabelFormatCapability.Waypoints | Qgis.BabelFormatCapability.Tracks))
self.assertEqual(f.capabilities(), Qgis.BabelFormatCapabilities(
Qgis.BabelFormatCapability.Waypoints | Qgis.BabelFormatCapability.Tracks | Qgis.BabelFormatCapability.Import))
Expand Down Expand Up @@ -168,12 +170,17 @@ def test_registry(self):
self.assertIsNotNone(QgsApplication.gpsBabelFormatRegistry())

registry = QgsBabelFormatRegistry()
self.assertIn('Garmin Mapsource', registry.importFormatNames())
self.assertIn('DNA', registry.importFormatNames())
self.assertIn('garmin_poi', registry.importFormatNames())
self.assertIn('dna', registry.importFormatNames())

self.assertIsNone(registry.importFormat('aaaaaa'))
self.assertIsNotNone(registry.importFormat('CoPilot Flight Planner'))
self.assertEqual(registry.importFormat('CoPilot Flight Planner').capabilities(), Qgis.BabelFormatCapabilities(Qgis.BabelFormatCapability.Waypoints | Qgis.BabelFormatCapability.Import))
self.assertIsNotNone(registry.importFormat('dna'))
self.assertEqual(registry.importFormat('dna').name(), 'dna')
self.assertEqual(registry.importFormat('dna').description(), 'Navitrak DNA marker format')

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')

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

0 comments on commit 3ee1f2b

Please sign in to comment.