Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Add file filter handling for vector tile layers to QgsProviderMetadata
And move QgsProviderMetadata.FilterType to Qgis
  • Loading branch information
nyalldawson committed Apr 2, 2023
1 parent 84036c7 commit fd11e0b
Show file tree
Hide file tree
Showing 32 changed files with 264 additions and 95 deletions.
28 changes: 28 additions & 0 deletions python/core/auto_additions/qgis.py
Expand Up @@ -979,6 +979,34 @@
Qgis.LabelMultiLineAlignment.__doc__ = 'Text alignment for multi-line labels.\n\n.. note::\n\n Prior to QGIS 3.26 this was available as :py:class:`QgsPalLayerSettings`.MultiLineAlign\n\n.. versionadded:: 3.26\n\n' + '* ``MultiLeft``: ' + Qgis.LabelMultiLineAlignment.Left.__doc__ + '\n' + '* ``MultiCenter``: ' + Qgis.LabelMultiLineAlignment.Center.__doc__ + '\n' + '* ``MultiRight``: ' + Qgis.LabelMultiLineAlignment.Right.__doc__ + '\n' + '* ``MultiFollowPlacement``: ' + Qgis.LabelMultiLineAlignment.FollowPlacement.__doc__ + '\n' + '* ``MultiJustify``: ' + Qgis.LabelMultiLineAlignment.Justify.__doc__
# --
Qgis.LabelMultiLineAlignment.baseClass = Qgis
QgsProviderMetadata.FilterType = Qgis.FileFilterType
# monkey patching scoped based enum
QgsProviderMetadata.FilterVector = Qgis.FileFilterType.Vector
QgsProviderMetadata.FilterType.FilterVector = Qgis.FileFilterType.Vector
QgsProviderMetadata.FilterVector.is_monkey_patched = True
QgsProviderMetadata.FilterVector.__doc__ = "Vector layers"
QgsProviderMetadata.FilterRaster = Qgis.FileFilterType.Raster
QgsProviderMetadata.FilterType.FilterRaster = Qgis.FileFilterType.Raster
QgsProviderMetadata.FilterRaster.is_monkey_patched = True
QgsProviderMetadata.FilterRaster.__doc__ = "Raster layers"
QgsProviderMetadata.FilterMesh = Qgis.FileFilterType.Mesh
QgsProviderMetadata.FilterType.FilterMesh = Qgis.FileFilterType.Mesh
QgsProviderMetadata.FilterMesh.is_monkey_patched = True
QgsProviderMetadata.FilterMesh.__doc__ = "Mesh layers"
QgsProviderMetadata.FilterMeshDataset = Qgis.FileFilterType.MeshDataset
QgsProviderMetadata.FilterType.FilterMeshDataset = Qgis.FileFilterType.MeshDataset
QgsProviderMetadata.FilterMeshDataset.is_monkey_patched = True
QgsProviderMetadata.FilterMeshDataset.__doc__ = "Mesh datasets"
QgsProviderMetadata.FilterPointCloud = Qgis.FileFilterType.PointCloud
QgsProviderMetadata.FilterType.FilterPointCloud = Qgis.FileFilterType.PointCloud
QgsProviderMetadata.FilterPointCloud.is_monkey_patched = True
QgsProviderMetadata.FilterPointCloud.__doc__ = "Point clouds (since QGIS 3.18)"
QgsProviderMetadata.VectorTile = Qgis.FileFilterType.VectorTile
QgsProviderMetadata.VectorTile.is_monkey_patched = True
QgsProviderMetadata.VectorTile.__doc__ = "Vector tile layers (since QGIS 3.32)"
Qgis.FileFilterType.__doc__ = 'Type of file filters\n\nPrior to QGIS 3.32 this was available as :py:class:`QgsProviderMetadata`.FilterType\n\n.. versionadded:: 3.32\n\n' + '* ``FilterVector``: ' + Qgis.FileFilterType.Vector.__doc__ + '\n' + '* ``FilterRaster``: ' + Qgis.FileFilterType.Raster.__doc__ + '\n' + '* ``FilterMesh``: ' + Qgis.FileFilterType.Mesh.__doc__ + '\n' + '* ``FilterMeshDataset``: ' + Qgis.FileFilterType.MeshDataset.__doc__ + '\n' + '* ``FilterPointCloud``: ' + Qgis.FileFilterType.PointCloud.__doc__ + '\n' + '* ``VectorTile``: ' + Qgis.FileFilterType.VectorTile.__doc__
# --
Qgis.FileFilterType.baseClass = Qgis
# monkey patching scoped based enum
Qgis.SublayerQueryFlag.FastScan.__doc__ = "Indicates that the provider must scan for sublayers using the fastest possible approach -- e.g. by first checking that a uri has an extension which is known to be readable by the provider"
Qgis.SublayerQueryFlag.ResolveGeometryType.__doc__ = "Attempt to resolve the geometry type for vector sublayers"
Expand Down
8 changes: 0 additions & 8 deletions python/core/auto_additions/qgsprovidermetadata.py
Expand Up @@ -2,11 +2,3 @@
QgsMeshDriverMetadata.MeshDriverCapability.baseClass = QgsMeshDriverMetadata
QgsMeshDriverMetadata.MeshDriverCapabilities.baseClass = QgsMeshDriverMetadata
MeshDriverCapabilities = QgsMeshDriverMetadata # dirty hack since SIP seems to introduce the flags in module
# monkey patching scoped based enum
QgsProviderMetadata.FilterType.FilterVector.__doc__ = "Vector layers"
QgsProviderMetadata.FilterType.FilterRaster.__doc__ = "Raster layers"
QgsProviderMetadata.FilterType.FilterMesh.__doc__ = "Mesh layers"
QgsProviderMetadata.FilterType.FilterMeshDataset.__doc__ = "Mesh datasets"
QgsProviderMetadata.FilterType.FilterPointCloud.__doc__ = "Point clouds (since QGIS 3.18)"
QgsProviderMetadata.FilterType.__doc__ = 'Type of file filters\n\n.. versionadded:: 3.10\n\n' + '* ``FilterVector``: ' + QgsProviderMetadata.FilterType.FilterVector.__doc__ + '\n' + '* ``FilterRaster``: ' + QgsProviderMetadata.FilterType.FilterRaster.__doc__ + '\n' + '* ``FilterMesh``: ' + QgsProviderMetadata.FilterType.FilterMesh.__doc__ + '\n' + '* ``FilterMeshDataset``: ' + QgsProviderMetadata.FilterType.FilterMeshDataset.__doc__ + '\n' + '* ``FilterPointCloud``: ' + QgsProviderMetadata.FilterType.FilterPointCloud.__doc__
# --
11 changes: 1 addition & 10 deletions python/core/auto_generated/providers/qgsprovidermetadata.sip.in
Expand Up @@ -275,16 +275,7 @@ Cleanup the provider
.. versionadded:: 3.10
%End

enum class FilterType
{
FilterVector,
FilterRaster,
FilterMesh,
FilterMeshDataset,
FilterPointCloud,
};

virtual QString filters( FilterType type );
virtual QString filters( Qgis::FileFilterType type );
%Docstring
Builds the list of file filter strings (supported formats)

Expand Down
26 changes: 26 additions & 0 deletions python/core/auto_generated/providers/qgsproviderregistry.sip.in
Expand Up @@ -617,6 +617,8 @@ supported by all data providers.
.. seealso:: :py:func:`fileMeshFilters`

.. seealso:: :py:func:`filePointCloudFilters`

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

QString fileRasterFilters() const;
Expand All @@ -635,6 +637,8 @@ supported by all data providers.
.. seealso:: :py:func:`fileMeshFilters`

.. seealso:: :py:func:`filePointCloudFilters`

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

QString fileMeshFilters() const;
Expand All @@ -652,6 +656,8 @@ supported by all data providers.

.. seealso:: :py:func:`filePointCloudFilters`

.. seealso:: :py:func:`fileVectorTileFilters`

.. versionadded:: 3.6
%End

Expand Down Expand Up @@ -680,7 +686,27 @@ supported by all data providers.

.. seealso:: :py:func:`fileVectorFilters`

.. seealso:: :py:func:`fileVectorTileFilters`

.. versionadded:: 3.18
%End

QString fileVectorTileFilters() const;
%Docstring
Returns a file filter string for supported vector tile files.

Returns a string suitable for a QFileDialog of vector tile file formats
supported by all data providers.

.. seealso:: :py:func:`fileMeshFilters`

.. seealso:: :py:func:`fileRasterFilters`

.. seealso:: :py:func:`fileVectorFilters`

.. seealso:: :py:func:`filePointCloudFilters`

.. versionadded:: 3.32
%End

QString databaseDrivers() const;
Expand Down
10 changes: 10 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -542,6 +542,16 @@ The development version
Justify,
};

enum class FileFilterType
{
Vector,
Raster,
Mesh,
MeshDataset,
PointCloud,
VectorTile,
};

enum class SublayerQueryFlag
{
FastScan,
Expand Down
11 changes: 6 additions & 5 deletions src/app/qgshandlebadlayers.cpp
Expand Up @@ -270,28 +270,29 @@ void QgsHandleBadLayers::browseClicked()
const QString provider = mLayerList->item( row, 0 )->data( static_cast< int >( CustomRoles::Provider ) ).toString();

QString fileFilter;
QgsProviderMetadata *metadata = QgsProviderRegistry::instance()->providerMetadata( provider );

switch ( layerType )
{
case Qgis::LayerType::Vector:
memoryQualifier = QStringLiteral( "lastVectorFileFilter" );
fileFilter = QgsProviderRegistry::instance()->providerMetadata( provider )->filters( QgsProviderMetadata::FilterType::FilterVector );
fileFilter = metadata->filters( Qgis::FileFilterType::Vector );
break;
case Qgis::LayerType::Raster:
memoryQualifier = QStringLiteral( "lastRasterFileFilter" );
fileFilter = QgsProviderRegistry::instance()->providerMetadata( provider )->filters( QgsProviderMetadata::FilterType::FilterRaster );
fileFilter = metadata->filters( Qgis::FileFilterType::Raster );
break;
case Qgis::LayerType::Mesh:
memoryQualifier = QStringLiteral( "lastMeshFileFilter" );
fileFilter = QgsProviderRegistry::instance()->fileMeshFilters();
break;
case Qgis::LayerType::VectorTile:
memoryQualifier = QStringLiteral( "lastVectorTileFileFilter" );
// not quite right -- but currently there's no generic method to get vector tile filters...
fileFilter = QgsProviderRegistry::instance()->fileVectorFilters();
fileFilter = metadata ? metadata->filters( Qgis::FileFilterType::VectorTile ) : QObject::tr( "All files (*.*)" );
break;
case Qgis::LayerType::PointCloud:
memoryQualifier = QStringLiteral( "lastPointCloudFileFilter" );
fileFilter = QgsProviderRegistry::instance()->providerMetadata( provider )->filters( QgsProviderMetadata::FilterType::FilterPointCloud );
fileFilter = metadata->filters( Qgis::FileFilterType::PointCloud );
break;

case Qgis::LayerType::Annotation:
Expand Down
1 change: 1 addition & 0 deletions src/core/mesh/qgsmesheditor.cpp
Expand Up @@ -22,6 +22,7 @@
#include "qgsgeometryengine.h"
#include "qgsmeshadvancedediting.h"
#include "qgsgeometryutils.h"
#include "qgspolygon.h"

#include <poly2tri.h>

Expand Down
15 changes: 7 additions & 8 deletions src/core/providers/copc/qgscopcprovider.cpp
Expand Up @@ -16,8 +16,6 @@
***************************************************************************/

#include "qgis.h"
#include "qgslogger.h"
#include "qgsproviderregistry.h"
#include "qgscopcprovider.h"
#include "qgscopcpointcloudindex.h"
#include "qgsremotecopcpointcloudindex.h"
Expand Down Expand Up @@ -204,17 +202,18 @@ QVariantMap QgsCopcProviderMetadata::decodeUri( const QString &uri ) const
return uriComponents;
}

QString QgsCopcProviderMetadata::filters( QgsProviderMetadata::FilterType type )
QString QgsCopcProviderMetadata::filters( Qgis::FileFilterType type )
{
switch ( type )
{
case QgsProviderMetadata::FilterType::FilterVector:
case QgsProviderMetadata::FilterType::FilterRaster:
case QgsProviderMetadata::FilterType::FilterMesh:
case QgsProviderMetadata::FilterType::FilterMeshDataset:
case Qgis::FileFilterType::Vector:
case Qgis::FileFilterType::Raster:
case Qgis::FileFilterType::Mesh:
case Qgis::FileFilterType::MeshDataset:
case Qgis::FileFilterType::VectorTile:
return QString();

case QgsProviderMetadata::FilterType::FilterPointCloud:
case Qgis::FileFilterType::PointCloud:
return QObject::tr( "COPC Point Clouds" ) + QStringLiteral( " (*.copc.laz *.COPC.LAZ)" );
}
return QString();
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/copc/qgscopcprovider.h
Expand Up @@ -74,7 +74,7 @@ class QgsCopcProviderMetadata : public QgsProviderMetadata
QList< Qgis::LayerType > validLayerTypesForUri( const QString &uri ) const override;
QString encodeUri( const QVariantMap &parts ) const override;
QVariantMap decodeUri( const QString &uri ) const override;
QString filters( FilterType type ) override;
QString filters( Qgis::FileFilterType type ) override;
ProviderCapabilities providerCapabilities() const override;
QList< Qgis::LayerType > supportedLayerTypes() const override;
};
Expand Down
13 changes: 7 additions & 6 deletions src/core/providers/ept/qgseptprovider.cpp
Expand Up @@ -209,17 +209,18 @@ QVariantMap QgsEptProviderMetadata::decodeUri( const QString &uri ) const
return uriComponents;
}

QString QgsEptProviderMetadata::filters( QgsProviderMetadata::FilterType type )
QString QgsEptProviderMetadata::filters( Qgis::FileFilterType type )
{
switch ( type )
{
case QgsProviderMetadata::FilterType::FilterVector:
case QgsProviderMetadata::FilterType::FilterRaster:
case QgsProviderMetadata::FilterType::FilterMesh:
case QgsProviderMetadata::FilterType::FilterMeshDataset:
case Qgis::FileFilterType::Vector:
case Qgis::FileFilterType::Raster:
case Qgis::FileFilterType::Mesh:
case Qgis::FileFilterType::MeshDataset:
case Qgis::FileFilterType::VectorTile:
return QString();

case QgsProviderMetadata::FilterType::FilterPointCloud:
case Qgis::FileFilterType::PointCloud:
return QObject::tr( "Entwine Point Clouds" ) + QStringLiteral( " (ept.json EPT.JSON)" );
}
return QString();
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/ept/qgseptprovider.h
Expand Up @@ -71,7 +71,7 @@ class QgsEptProviderMetadata : public QgsProviderMetadata
bool uriIsBlocklisted( const QString &uri ) const override;
QString encodeUri( const QVariantMap &parts ) const override;
QVariantMap decodeUri( const QString &uri ) const override;
QString filters( FilterType type ) override;
QString filters( Qgis::FileFilterType type ) override;
ProviderCapabilities providerCapabilities() const override;
QList< Qgis::LayerType > supportedLayerTypes() const override;
};
Expand Down
13 changes: 7 additions & 6 deletions src/core/providers/gdal/qgsgdalprovider.cpp
Expand Up @@ -3966,11 +3966,11 @@ bool QgsGdalProvider::remove()
* that contains this list that is suitable for use in a
* QFileDialog::getOpenFileNames() call.
*/
QString QgsGdalProviderMetadata::filters( FilterType type )
QString QgsGdalProviderMetadata::filters( Qgis::FileFilterType type )
{
switch ( type )
{
case QgsProviderMetadata::FilterType::FilterRaster:
case Qgis::FileFilterType::Raster:
{
QString fileFiltersString;
QStringList exts;
Expand All @@ -3979,10 +3979,11 @@ QString QgsGdalProviderMetadata::filters( FilterType type )
return fileFiltersString;
}

case QgsProviderMetadata::FilterType::FilterVector:
case QgsProviderMetadata::FilterType::FilterMesh:
case QgsProviderMetadata::FilterType::FilterMeshDataset:
case QgsProviderMetadata::FilterType::FilterPointCloud:
case Qgis::FileFilterType::Vector:
case Qgis::FileFilterType::Mesh:
case Qgis::FileFilterType::MeshDataset:
case Qgis::FileFilterType::PointCloud:
case Qgis::FileFilterType::VectorTile:
return QString();
}
return QString();
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/gdal/qgsgdalprovider.h
Expand Up @@ -394,7 +394,7 @@ class QgsGdalProviderMetadata final: public QgsProviderMetadata
double *geoTransform,
const QgsCoordinateReferenceSystem &crs,
const QStringList &createOptions ) override;
QString filters( FilterType type ) override;
QString filters( Qgis::FileFilterType type ) override;
QList<QPair<QString, QString> > pyramidResamplingMethods() override;
QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const override;
ProviderCapabilities providerCapabilities() const override;
Expand Down
13 changes: 7 additions & 6 deletions src/core/providers/ogr/qgsogrprovidermetadata.cpp
Expand Up @@ -1141,17 +1141,18 @@ QIcon QgsOgrProviderMetadata::icon() const
return QgsApplication::getThemeIcon( QStringLiteral( "mIconVector.svg" ) );
}

QString QgsOgrProviderMetadata::filters( FilterType type )
QString QgsOgrProviderMetadata::filters( Qgis::FileFilterType type )
{
switch ( type )
{
case QgsProviderMetadata::FilterType::FilterVector:
case Qgis::FileFilterType::Vector:
return QgsOgrProviderUtils::fileVectorFilters();

case QgsProviderMetadata::FilterType::FilterRaster:
case QgsProviderMetadata::FilterType::FilterMesh:
case QgsProviderMetadata::FilterType::FilterMeshDataset:
case QgsProviderMetadata::FilterType::FilterPointCloud:
case Qgis::FileFilterType::Raster:
case Qgis::FileFilterType::Mesh:
case Qgis::FileFilterType::MeshDataset:
case Qgis::FileFilterType::PointCloud:
case Qgis::FileFilterType::VectorTile:
return QString();
}
return QString();
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/ogr/qgsogrprovidermetadata.h
Expand Up @@ -43,7 +43,7 @@ class QgsOgrProviderMetadata final: public QgsProviderMetadata
QString encodeUri( const QVariantMap &parts ) const override;
QString absoluteToRelativeUri( const QString &uri, const QgsReadWriteContext &context ) const override;
QString relativeToAbsoluteUri( const QString &uri, const QgsReadWriteContext &context ) const override;
QString filters( FilterType type ) override;
QString filters( Qgis::FileFilterType type ) override;
QgsProviderMetadata::ProviderMetadataCapabilities capabilities() const override;
ProviderCapabilities providerCapabilities() const override;
bool uriIsBlocklisted( const QString &uri ) const override;
Expand Down
2 changes: 1 addition & 1 deletion src/core/providers/qgsprovidermetadata.cpp
Expand Up @@ -97,7 +97,7 @@ void QgsProviderMetadata::cleanupProvider()

}

QString QgsProviderMetadata::filters( FilterType )
QString QgsProviderMetadata::filters( Qgis::FileFilterType )
{
return QString();
}
Expand Down
17 changes: 1 addition & 16 deletions src/core/providers/qgsprovidermetadata.h
Expand Up @@ -32,9 +32,7 @@
#include "qgis_core.h"
#include <functional>
#include "qgsabstractproviderconnection.h"
#include "qgsabstractlayermetadataprovider.h"
#include "qgsfields.h"
#include "qgsexception.h"

class QgsDataItem;
class QgsDataItemProvider;
Expand Down Expand Up @@ -342,27 +340,14 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
*/
virtual void cleanupProvider();

/**
* Type of file filters
* \since QGIS 3.10
*/
enum class FilterType
{
FilterVector = 1, //!< Vector layers
FilterRaster, //!< Raster layers
FilterMesh, //!< Mesh layers
FilterMeshDataset, //!< Mesh datasets
FilterPointCloud, //!< Point clouds (since QGIS 3.18)
};

/**
* Builds the list of file filter strings (supported formats)
*
* Suitable for use in a QFileDialog::getOpenFileNames() call.
*
* \since QGIS 3.10
*/
virtual QString filters( FilterType type );
virtual QString filters( Qgis::FileFilterType type );

/**
* Builds the list of available mesh drivers metadata
Expand Down

0 comments on commit fd11e0b

Please sign in to comment.