From b919198e465e3556425bd51758e22b7407bf1e0e Mon Sep 17 00:00:00 2001 From: Martin Dobias Date: Wed, 31 Aug 2016 18:37:46 +0800 Subject: [PATCH] Fix loading of XYZ tile layer data item provider --- src/core/qgsdataitemproviderregistry.cpp | 13 +++++++++++++ src/providers/wms/qgswmsdataitems.cpp | 16 +++++++--------- src/providers/wms/qgswmsdataitems.h | 13 +++++++++++++ 3 files changed, 33 insertions(+), 9 deletions(-) diff --git a/src/core/qgsdataitemproviderregistry.cpp b/src/core/qgsdataitemproviderregistry.cpp index 8e7e51645513..8608cd1c987b 100644 --- a/src/core/qgsdataitemproviderregistry.cpp +++ b/src/core/qgsdataitemproviderregistry.cpp @@ -21,6 +21,8 @@ #include "qgslogger.h" #include "qgsproviderregistry.h" +typedef QList dataItemProviders_t(); + /** * \ingroup core @@ -64,6 +66,17 @@ QgsDataItemProviderRegistry::QgsDataItemProviderRegistry() if ( !library ) continue; + // new / better way of returning data items from providers + + dataItemProviders_t* dataItemProvidersFn = reinterpret_cast< dataItemProviders_t * >( cast_to_fptr( library->resolve( "dataItemProviders" ) ) ); + if ( dataItemProvidersFn ) + { + // the function is a factory - we keep ownership of the returned providers + mProviders << dataItemProvidersFn(); + } + + // legacy support - using dataItem() and dataCapabilities() methods + dataCapabilities_t * dataCapabilities = reinterpret_cast< dataCapabilities_t * >( cast_to_fptr( library->resolve( "dataCapabilities" ) ) ); if ( !dataCapabilities ) { diff --git a/src/providers/wms/qgswmsdataitems.cpp b/src/providers/wms/qgswmsdataitems.cpp index a0a1e2860b3b..e28ac7a8859f 100644 --- a/src/providers/wms/qgswmsdataitems.cpp +++ b/src/providers/wms/qgswmsdataitems.cpp @@ -420,10 +420,6 @@ void QgsWMSRootItem::newConnection() QGISEXTERN void registerGui( QMainWindow *mainWindow ) { QgsTileScaleWidget::showTileScale( mainWindow ); - - // with dataItem(...) at provider level we can only have one root item, - // so we have a data item provider for XYZ tile layers - QgsDataItemProviderRegistry::instance()->addProvider( new QgsXyzTileDataItemProvider ); } QGISEXTERN QgsWMSSourceSelect * selectWidget( QWidget * parent, Qt::WindowFlags fl ) @@ -431,12 +427,8 @@ QGISEXTERN QgsWMSSourceSelect * selectWidget( QWidget * parent, Qt::WindowFlags return new QgsWMSSourceSelect( parent, fl ); } -QGISEXTERN int dataCapabilities() -{ - return QgsDataProvider::Net; -} -QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) +QgsDataItem* QgsWmsDataItemProvider::createDataItem( const QString& thePath, QgsDataItem *parentItem ) { QgsDebugMsg( "thePath = " + thePath ); if ( thePath.isEmpty() ) @@ -458,6 +450,12 @@ QGISEXTERN QgsDataItem * dataItem( QString thePath, QgsDataItem* parentItem ) return nullptr; } +QGISEXTERN QList dataItemProviders() +{ + return QList() + << new QgsWmsDataItemProvider + << new QgsXyzTileDataItemProvider; +} // --------------------------------------------------------------------------- diff --git a/src/providers/wms/qgswmsdataitems.h b/src/providers/wms/qgswmsdataitems.h index ca7fa3683191..d6dc4b8f7bbf 100644 --- a/src/providers/wms/qgswmsdataitems.h +++ b/src/providers/wms/qgswmsdataitems.h @@ -106,6 +106,19 @@ class QgsWMSRootItem : public QgsDataCollectionItem void newConnection(); }; + +//! Provider for WMS root data item +class QgsWmsDataItemProvider : public QgsDataItemProvider +{ + public: + virtual QString name() override { return "WMS"; } + + virtual int capabilities() override { return QgsDataProvider::Net; } + + virtual QgsDataItem* createDataItem( const QString& path, QgsDataItem* parentItem ) override; +}; + + //! Root item for XYZ tile layers class QgsXyzTileRootItem : public QgsDataCollectionItem {