Add option to hide non-spatial formats from driver lists

And hide non-spatial formats from geometry checker available formats
This commit is contained in:
Nyall Dawson 2017-11-06 07:49:31 +10:00
parent fe0566000e
commit 8499d7fcef
5 changed files with 41 additions and 2 deletions

View File

@ -147,6 +147,7 @@ Some formats require a compulsory encoding, typically UTF-8. If no compulsory en
enum VectorFormatOption enum VectorFormatOption
{ {
SortRecommended, SortRecommended,
SkipNonSpatialFormats,
}; };
typedef QFlags<QgsVectorFileWriter::VectorFormatOption> VectorFormatOptions; typedef QFlags<QgsVectorFileWriter::VectorFormatOption> VectorFormatOptions;

View File

@ -2699,6 +2699,14 @@ QList< QgsVectorFileWriter::FilterFormatDetails > QgsVectorFileWriter::supported
QString drvName = OGR_Dr_GetName( drv ); QString drvName = OGR_Dr_GetName( drv );
if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 ) if ( OGR_Dr_TestCapability( drv, "CreateDataSource" ) != 0 )
{ {
if ( options & SkipNonSpatialFormats )
{
// skip non-spatial formats
// TODO - use GDAL metadata to determine this, when support exists in GDAL
if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) )
continue;
}
QString filterString = filterForDriver( drvName ); QString filterString = filterForDriver( drvName );
if ( filterString.isEmpty() ) if ( filterString.isEmpty() )
continue; continue;
@ -2780,6 +2788,15 @@ QList< QgsVectorFileWriter::DriverDetails > QgsVectorFileWriter::ogrDriverList(
if ( drv ) if ( drv )
{ {
QString drvName = OGR_Dr_GetName( drv ); QString drvName = OGR_Dr_GetName( drv );
if ( options & SkipNonSpatialFormats )
{
// skip non-spatial formats
// TODO - use GDAL metadata to determine this, when support exists in GDAL
if ( drvName == QStringLiteral( "ODS" ) || drvName == QStringLiteral( "XLSX" ) || drvName == QStringLiteral( "XLS" ) )
continue;
}
if ( drvName == QLatin1String( "ESRI Shapefile" ) ) if ( drvName == QLatin1String( "ESRI Shapefile" ) )
{ {
writableDrivers << QStringLiteral( "DBF file" ); writableDrivers << QStringLiteral( "DBF file" );

View File

@ -191,6 +191,7 @@ class CORE_EXPORT QgsVectorFileWriter : public QgsFeatureSink
enum VectorFormatOption enum VectorFormatOption
{ {
SortRecommended = 1 << 1, //!< Use recommended sort order, with extremely commonly used formats listed first SortRecommended = 1 << 1, //!< Use recommended sort order, with extremely commonly used formats listed first
SkipNonSpatialFormats = 1 << 2, //!< Filter out any formats which do not have spatial support (e.g. those which cannot save geometries)
}; };
Q_DECLARE_FLAGS( VectorFormatOptions, VectorFormatOption ) Q_DECLARE_FLAGS( VectorFormatOptions, VectorFormatOption )

View File

@ -54,7 +54,7 @@ QgsGeometryCheckerSetupTab::QgsGeometryCheckerSetupTab( QgisInterface *iface, QD
mAbortButton = new QPushButton( tr( "Abort" ) ); mAbortButton = new QPushButton( tr( "Abort" ) );
mRunButton->setEnabled( false ); mRunButton->setEnabled( false );
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats(); const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats );
for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap ) for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap )
{ {
QString driverName = filter.driverName; QString driverName = filter.driverName;
@ -216,7 +216,7 @@ void QgsGeometryCheckerSetupTab::validateInput()
void QgsGeometryCheckerSetupTab::selectOutputDirectory() void QgsGeometryCheckerSetupTab::selectOutputDirectory()
{ {
QString filterString = QgsVectorFileWriter::filterForDriver( QStringLiteral( "GPKG" ) ); QString filterString = QgsVectorFileWriter::filterForDriver( QStringLiteral( "GPKG" ) );
const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats(); const auto filterFormatMap = QgsVectorFileWriter::supportedFiltersAndFormats( QgsVectorFileWriter::SortRecommended | QgsVectorFileWriter::SkipNonSpatialFormats );
for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap ) for ( const QgsVectorFileWriter::FilterFormatDetails &filter : filterFormatMap )
{ {
QString driverName = filter.driverName; QString driverName = filter.driverName;

View File

@ -730,12 +730,18 @@ class TestQgsVectorFileWriter(unittest.TestCase):
self.assertEqual(formats[0].driverName, 'GPKG') self.assertEqual(formats[0].driverName, 'GPKG')
self.assertEqual(formats[1].filterString, 'ESRI Shapefile (*.shp *.SHP)') self.assertEqual(formats[1].filterString, 'ESRI Shapefile (*.shp *.SHP)')
self.assertEqual(formats[1].driverName, 'ESRI Shapefile') self.assertEqual(formats[1].driverName, 'ESRI Shapefile')
self.assertTrue('ODS' in [f.driverName for f in formats])
# alphabetical sorting # alphabetical sorting
formats2 = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.VectorFormatOptions()) formats2 = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.VectorFormatOptions())
self.assertTrue(formats2[0].driverName < formats2[1].driverName) self.assertTrue(formats2[0].driverName < formats2[1].driverName)
self.assertCountEqual([f.driverName for f in formats], [f.driverName for f in formats2]) self.assertCountEqual([f.driverName for f in formats], [f.driverName for f in formats2])
self.assertNotEqual(formats2[0].driverName, 'GeoPackage') self.assertNotEqual(formats2[0].driverName, 'GeoPackage')
# skip non-spatial
formats = QgsVectorFileWriter.supportedFiltersAndFormats(QgsVectorFileWriter.SkipNonSpatialFormats)
self.assertFalse('ODS' in [f.driverName for f in formats])
def testOgrDriverList(self): def testOgrDriverList(self):
# test with drivers in recommended order # test with drivers in recommended order
drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended) drivers = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SortRecommended)
@ -743,18 +749,24 @@ class TestQgsVectorFileWriter(unittest.TestCase):
self.assertEqual(drivers[0].driverName, 'GPKG') self.assertEqual(drivers[0].driverName, 'GPKG')
self.assertEqual(drivers[1].longName, 'ESRI Shapefile') self.assertEqual(drivers[1].longName, 'ESRI Shapefile')
self.assertEqual(drivers[1].driverName, 'ESRI Shapefile') self.assertEqual(drivers[1].driverName, 'ESRI Shapefile')
self.assertTrue('ODS' in [f.driverName for f in drivers])
# alphabetical sorting # alphabetical sorting
drivers2 = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.VectorFormatOptions()) drivers2 = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.VectorFormatOptions())
self.assertTrue(drivers2[0].longName < drivers2[1].longName) self.assertTrue(drivers2[0].longName < drivers2[1].longName)
self.assertCountEqual([d.driverName for d in drivers], [d.driverName for d in drivers2]) self.assertCountEqual([d.driverName for d in drivers], [d.driverName for d in drivers2])
self.assertNotEqual(drivers2[0].driverName, 'GPKG') self.assertNotEqual(drivers2[0].driverName, 'GPKG')
# skip non-spatial
formats = QgsVectorFileWriter.ogrDriverList(QgsVectorFileWriter.SkipNonSpatialFormats)
self.assertFalse('ODS' in [f.driverName for f in formats])
def testSupportedFormatExtensions(self): def testSupportedFormatExtensions(self):
formats = QgsVectorFileWriter.supportedFormatExtensions() formats = QgsVectorFileWriter.supportedFormatExtensions()
self.assertTrue('gpkg' in formats) self.assertTrue('gpkg' in formats)
self.assertFalse('exe' in formats) self.assertFalse('exe' in formats)
self.assertEqual(formats[0], 'gpkg') self.assertEqual(formats[0], 'gpkg')
self.assertEqual(formats[1], 'shp') self.assertEqual(formats[1], 'shp')
self.assertTrue('ods' in formats)
# alphabetical sorting # alphabetical sorting
formats2 = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.VectorFormatOptions()) formats2 = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.VectorFormatOptions())
@ -762,16 +774,24 @@ class TestQgsVectorFileWriter(unittest.TestCase):
self.assertCountEqual(formats, formats2) self.assertCountEqual(formats, formats2)
self.assertNotEqual(formats2[0], 'gpkg') self.assertNotEqual(formats2[0], 'gpkg')
formats = QgsVectorFileWriter.supportedFormatExtensions(QgsVectorFileWriter.SkipNonSpatialFormats)
self.assertFalse('ods' in formats)
def testFileFilterString(self): def testFileFilterString(self):
formats = QgsVectorFileWriter.fileFilterString() formats = QgsVectorFileWriter.fileFilterString()
self.assertTrue('gpkg' in formats) self.assertTrue('gpkg' in formats)
self.assertTrue('shp' in formats) self.assertTrue('shp' in formats)
self.assertTrue(formats.index('gpkg') < formats.index('shp')) self.assertTrue(formats.index('gpkg') < formats.index('shp'))
self.assertTrue('ods' in formats)
# alphabetical sorting # alphabetical sorting
formats2 = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.VectorFormatOptions()) formats2 = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.VectorFormatOptions())
self.assertNotEqual(formats.index('gpkg'), formats2.index('gpkg')) self.assertNotEqual(formats.index('gpkg'), formats2.index('gpkg'))
# hide non spatial
formats = QgsVectorFileWriter.fileFilterString(QgsVectorFileWriter.SkipNonSpatialFormats)
self.assertFalse('ods' in formats)
def testDriverForExtension(self): def testDriverForExtension(self):
self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile') self.assertEqual(QgsVectorFileWriter.driverForExtension('shp'), 'ESRI Shapefile')
self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile') self.assertEqual(QgsVectorFileWriter.driverForExtension('SHP'), 'ESRI Shapefile')