From 7c6afc0761b6973a06bcb0a0e9c6fdb1fc6769b0 Mon Sep 17 00:00:00 2001 From: Nyall Dawson Date: Fri, 25 Jun 2021 16:07:44 +1000 Subject: [PATCH] Create QgsProviderSublayerTask for retrieving sublayer details in a thread This can sometimes take a looooong time, so it's worth doing in the background --- .../providers/qgsprovidersublayertask.sip.in | 53 +++++++++++++++ python/core/core_auto.sip | 1 + src/core/CMakeLists.txt | 2 + .../providers/qgsprovidersublayertask.cpp | 50 ++++++++++++++ src/core/providers/qgsprovidersublayertask.h | 66 +++++++++++++++++++ 5 files changed, 172 insertions(+) create mode 100644 python/core/auto_generated/providers/qgsprovidersublayertask.sip.in create mode 100644 src/core/providers/qgsprovidersublayertask.cpp create mode 100644 src/core/providers/qgsprovidersublayertask.h diff --git a/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in b/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in new file mode 100644 index 00000000000..41b8c440640 --- /dev/null +++ b/python/core/auto_generated/providers/qgsprovidersublayertask.sip.in @@ -0,0 +1,53 @@ +/************************************************************************ + * This file has been generated automatically from * + * * + * src/core/providers/qgsprovidersublayertask.h * + * * + * Do not edit manually ! Edit header and run scripts/sipify.pl again * + ************************************************************************/ + + + + + +class QgsProviderSublayerTask : QgsTask +{ +%Docstring(signature="appended") + +A :py:class:`QgsTask` which retrieves sublayer details for a URI. + +.. versionadded:: 3.22 +%End + +%TypeHeaderCode +#include "qgsprovidersublayertask.h" +%End + public: + + QgsProviderSublayerTask( const QString &uri ); +%Docstring +Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the +specified ``uri``. +%End + + ~QgsProviderSublayerTask(); + + QList results() const; +%Docstring +Return the sublayer details as calculated by the task. +%End + + virtual bool run(); + + virtual void cancel(); + + +}; + +/************************************************************************ + * This file has been generated automatically from * + * * + * src/core/providers/qgsprovidersublayertask.h * + * * + * Do not edit manually ! Edit header and run scripts/sipify.pl again * + ************************************************************************/ diff --git a/python/core/core_auto.sip b/python/core/core_auto.sip index 4788b78b8f2..bd61733ace4 100644 --- a/python/core/core_auto.sip +++ b/python/core/core_auto.sip @@ -515,6 +515,7 @@ %Include auto_generated/providers/qgsprovidermetadata.sip %Include auto_generated/providers/qgsproviderregistry.sip %Include auto_generated/providers/qgsprovidersublayerdetails.sip +%Include auto_generated/providers/qgsprovidersublayertask.sip %Include auto_generated/providers/arcgis/qgsarcgisportalutils.sip %Include auto_generated/providers/arcgis/qgsarcgisrestutils.sip %Include auto_generated/providers/memory/qgsmemoryproviderutils.sip diff --git a/src/core/CMakeLists.txt b/src/core/CMakeLists.txt index 11db3b4c6a1..2c1fe405338 100644 --- a/src/core/CMakeLists.txt +++ b/src/core/CMakeLists.txt @@ -233,6 +233,7 @@ set(QGIS_CORE_SRCS providers/qgsprovidermetadata.cpp providers/qgsproviderregistry.cpp providers/qgsprovidersublayerdetails.cpp + providers/qgsprovidersublayertask.cpp providers/arcgis/qgsarcgisportalutils.cpp providers/arcgis/qgsarcgisrestquery.cpp @@ -1522,6 +1523,7 @@ set(QGIS_CORE_HDRS providers/qgsprovidermetadata.h providers/qgsproviderregistry.h providers/qgsprovidersublayerdetails.h + providers/qgsprovidersublayertask.h providers/arcgis/qgsarcgisportalutils.h providers/arcgis/qgsarcgisrestquery.h diff --git a/src/core/providers/qgsprovidersublayertask.cpp b/src/core/providers/qgsprovidersublayertask.cpp new file mode 100644 index 00000000000..2f5410dab75 --- /dev/null +++ b/src/core/providers/qgsprovidersublayertask.cpp @@ -0,0 +1,50 @@ +/*************************************************************************** + qgsprovidersublayertask.cpp + ---------------------- + begin : June 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 "qgsprovidersublayertask.h" +#include "qgsfeedback.h" +#include "qgsproviderregistry.h" +#include "qgsprovidersublayerdetails.h" + +QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri ) + : QgsTask( tr( "Retrieving layers" ), QgsTask::CanCancel | QgsTask::CancelWithoutPrompt ) + , mUri( uri ) +{ +} + +QList QgsProviderSublayerTask::results() const +{ + return mResults; +} + +QgsProviderSublayerTask::~QgsProviderSublayerTask() = default; + +bool QgsProviderSublayerTask::run() +{ + mFeedback = std::make_unique< QgsFeedback >(); + + mResults = QgsProviderRegistry::instance()->querySublayers( mUri, Qgis::SublayerQueryFlag::ResolveGeometryType | Qgis::SublayerQueryFlag::CountFeatures, mFeedback.get() ); + return true; +} + +void QgsProviderSublayerTask::cancel() +{ + if ( mFeedback ) + mFeedback->cancel(); + + QgsTask::cancel(); +} diff --git a/src/core/providers/qgsprovidersublayertask.h b/src/core/providers/qgsprovidersublayertask.h new file mode 100644 index 00000000000..1ba3f10ba2a --- /dev/null +++ b/src/core/providers/qgsprovidersublayertask.h @@ -0,0 +1,66 @@ +/*************************************************************************** + qgsprovidersublayertask.h + ---------------------- + begin : June 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. * + * * + ***************************************************************************/ + +#ifndef QGSPROVIDERSUBLAYERTASKTASK_H +#define QGSPROVIDERSUBLAYERTASKTASK_H + +#include "qgstaskmanager.h" +#include + +class QgsFeedback; +class QgsProviderSublayerDetails; + +/** + * \ingroup core + * + * \brief A QgsTask which retrieves sublayer details for a URI. + * + * \since QGIS 3.22 + */ +class CORE_EXPORT QgsProviderSublayerTask : public QgsTask +{ + Q_OBJECT + + public: + + /** + * Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the + * specified \a uri. + */ + QgsProviderSublayerTask( const QString &uri ); + + ~QgsProviderSublayerTask() override; + + /** + * Return the sublayer details as calculated by the task. + */ + QList results() const; + + bool run() override; + void cancel() override; + + private: + + QString mUri; + + std::unique_ptr< QgsFeedback > mFeedback; + + QList mResults; + +}; + +#endif // QGSPROVIDERSUBLAYERTASKTASK_H