From 69debff405f44dc2eb8bc043745752c20e9fc263 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Tue, 22 Jun 2021 12:12:38 +1000 Subject: [PATCH] Add convenience method to directly convert QgsProviderSublayerDetails object to a QgsMapLayer --- .../qgsprovidersublayerdetails.sip.in | 18 +++++++++++++ src/core/CMakeLists.txt | 1 + .../providers/qgsprovidersublayerdetails.cpp | 27 +++++++++++++++++++ .../providers/qgsprovidersublayerdetails.h | 22 +++++++++++++++ .../python/test_qgsprovidersublayerdetails.py | 22 ++++++++++++++- 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/core/providers/qgsprovidersublayerdetails.cpp diff --git a/python/core/auto_generated/providers/qgsprovidersublayerdetails.sip.in b/python/core/auto_generated/providers/qgsprovidersublayerdetails.sip.in index 1d73ae5ed62c..6fa6add874d0 100644 --- a/python/core/auto_generated/providers/qgsprovidersublayerdetails.sip.in +++ b/python/core/auto_generated/providers/qgsprovidersublayerdetails.sip.in @@ -73,6 +73,24 @@ Returns the layer's URI. Sets the layer's ``uri``. .. seealso:: :py:func:`uri` +%End + + struct LayerOptions + { + + explicit LayerOptions( const QgsCoordinateTransformContext &transformContext ); +%Docstring +Constructor for LayerOptions with ``transformContext``. +%End + + QgsCoordinateTransformContext transformContext; + }; + + QgsMapLayer *toLayer( const LayerOptions &options ) const /Factory/; +%Docstring +Creates a new :py:class:`QgsMapLayer` object associated with the sublayer. + +Caller takes ownership of the returned layer. %End QString name() const; diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 65051e96252b..47442035a9cb 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -215,6 +215,7 @@ set(QGIS_CORE_SRCS providers/qgsdataprovider.cpp providers/qgsprovidermetadata.cpp providers/qgsproviderregistry.cpp + providers/qgsprovidersublayerdetails.cpp providers/arcgis/qgsarcgisportalutils.cpp providers/arcgis/qgsarcgisrestquery.cpp diff --git a/src/core/providers/qgsprovidersublayerdetails.cpp b/src/core/providers/qgsprovidersublayerdetails.cpp new file mode 100644 index 000000000000..fc64be72e8a7 --- /dev/null +++ b/src/core/providers/qgsprovidersublayerdetails.cpp @@ -0,0 +1,27 @@ +/*************************************************************************** + qgsprovidersublayerdetails.cpp + ---------------------------- + begin : May 2021 + copyright : (C) 2021 by Nyall Dawson + email : nyall dot dawson at gmail dot com + ***************************************************************************/ +/*************************************************************************** + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + ***************************************************************************/ + +#include "qgsprovidersublayerdetails.h" +#include "qgsmaplayerfactory.h" + +QgsProviderSublayerDetails::LayerOptions::LayerOptions( const QgsCoordinateTransformContext &transformContext ) + : transformContext( transformContext ) +{} + +QgsMapLayer *QgsProviderSublayerDetails::toLayer( const LayerOptions &options ) const +{ + return QgsMapLayerFactory::createLayer( mUri, mName, mType, mProviderKey, options.transformContext ); +} diff --git a/src/core/providers/qgsprovidersublayerdetails.h b/src/core/providers/qgsprovidersublayerdetails.h index bd6f8b5b0eac..2fb9d65c9923 100644 --- a/src/core/providers/qgsprovidersublayerdetails.h +++ b/src/core/providers/qgsprovidersublayerdetails.h @@ -19,6 +19,7 @@ #include "qgis_core.h" #include "qgis.h" #include "qgswkbtypes.h" +#include "qgscoordinatetransformcontext.h" #include #include @@ -86,6 +87,27 @@ class CORE_EXPORT QgsProviderSublayerDetails */ void setUri( const QString &uri ) { mUri = uri; } + /** + * Setting options for loading layers. + */ + struct LayerOptions + { + + /** + * Constructor for LayerOptions with \a transformContext. + */ + explicit LayerOptions( const QgsCoordinateTransformContext &transformContext ); + + QgsCoordinateTransformContext transformContext; + }; + + /** + * Creates a new QgsMapLayer object associated with the sublayer. + * + * Caller takes ownership of the returned layer. + */ + QgsMapLayer *toLayer( const LayerOptions &options ) const SIP_FACTORY; + /** * Returns the layer's name. * diff --git a/tests/src/python/test_qgsprovidersublayerdetails.py b/tests/src/python/test_qgsprovidersublayerdetails.py index 354142348c1e..3879320054a8 100644 --- a/tests/src/python/test_qgsprovidersublayerdetails.py +++ b/tests/src/python/test_qgsprovidersublayerdetails.py @@ -11,15 +11,19 @@ __copyright__ = 'Copyright 2020, The QGIS Project' import qgis # NOQA +import os from qgis.core import ( QgsProviderRegistry, QgsMapLayerType, QgsWkbTypes, QgsProviderSublayerDetails, - Qgis + Qgis, + QgsCoordinateTransformContext, + QgsVectorLayer ) from qgis.testing import start_app, unittest +from utilities import unitTestDataPath # Convenience instances in case you may need them # to find the srs.db @@ -65,6 +69,22 @@ def testGettersSetters(self): d.setLayerNumber(13) self.assertEqual(d.layerNumber(), 13) + def test_to_layer(self): + """ + Test converting sub layer details to a layer + """ + details = QgsProviderSublayerDetails() + details.setUri(os.path.join(unitTestDataPath(), 'lines.shp')) + details.setName('my sub layer') + details.setType(QgsMapLayerType.VectorLayer) + details.setProviderKey('ogr') + + options = QgsProviderSublayerDetails.LayerOptions(QgsCoordinateTransformContext()) + ml = details.toLayer(options) + self.assertTrue(ml.isValid()) + self.assertIsInstance(ml, QgsVectorLayer) + self.assertEqual(ml.name(), 'my sub layer') + if __name__ == '__main__': unittest.main()