mirror of
https://github.com/qgis/QGIS.git
synced 2025-10-09 00:08:52 -04:00
QgsProviderSublayerTask: make it possible to restrict it to a particular provider
Avoids the 'ERROR: Status 2: File pagingEnabled='false' preferCoordinatesForWfsT11='false' restrictToRequestBBOX='1' srsname='EPSG:25832' typename='dvg:nw_dvg1_bld' url='https://www.wfs.nrw.de/geobasis/wfs_nw_dvg' version='auto' could not be found' type of message in the scenario described by https://github.com/qgis/QGIS/pull/51144#issuecomment-1345507627
This commit is contained in:
parent
494e6365c6
commit
8866b0cdad
@ -398,7 +398,7 @@ The optional ``feedback`` argument can be used to provide cancellation support f
|
|||||||
|
|
||||||
virtual QString suggestGroupNameForUri( const QString &uri ) const;
|
virtual QString suggestGroupNameForUri( const QString &uri ) const;
|
||||||
%Docstring
|
%Docstring
|
||||||
Returns a name that can be used as a group name for sublayers got from
|
Returns a name that can be used as a group name for sublayers retrieved from
|
||||||
the specified ``uri``.
|
the specified ``uri``.
|
||||||
|
|
||||||
The default implementation returns an empty string.
|
The default implementation returns an empty string.
|
||||||
|
@ -39,6 +39,14 @@ possible, regardless of how expensive this may be.
|
|||||||
%Docstring
|
%Docstring
|
||||||
Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
|
Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
|
||||||
specified ``uri``.
|
specified ``uri``.
|
||||||
|
%End
|
||||||
|
|
||||||
|
QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables = false );
|
||||||
|
%Docstring
|
||||||
|
Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
|
||||||
|
specified ``uri``, restricted to a particular provider.
|
||||||
|
|
||||||
|
.. versionadded:: 3.30
|
||||||
%End
|
%End
|
||||||
|
|
||||||
~QgsProviderSublayerTask();
|
~QgsProviderSublayerTask();
|
||||||
|
@ -324,7 +324,7 @@ QList< QgsMapLayer * > QgsAppLayerHandling::addOgrVectorLayers( const QStringLis
|
|||||||
case SublayerHandling::AskUser:
|
case SublayerHandling::AskUser:
|
||||||
{
|
{
|
||||||
// prompt user for sublayers
|
// prompt user for sublayers
|
||||||
QgsProviderSublayersDialog dlg( uri, path, sublayers, {QgsMapLayerType::VectorLayer}, QgisApp::instance() );
|
QgsProviderSublayersDialog dlg( uri, QString(), path, sublayers, {QgsMapLayerType::VectorLayer}, QgisApp::instance() );
|
||||||
|
|
||||||
if ( dlg.exec() )
|
if ( dlg.exec() )
|
||||||
sublayers = dlg.selectedLayers();
|
sublayers = dlg.selectedLayers();
|
||||||
@ -534,7 +534,7 @@ bool QgsAppLayerHandling::askUserForZipItemLayers( const QString &path, const QL
|
|||||||
case SublayerHandling::AskUser:
|
case SublayerHandling::AskUser:
|
||||||
{
|
{
|
||||||
// prompt user for sublayers
|
// prompt user for sublayers
|
||||||
QgsProviderSublayersDialog dlg( path, path, sublayers, acceptableTypes, QgisApp::instance() );
|
QgsProviderSublayersDialog dlg( path, QString(), path, sublayers, acceptableTypes, QgisApp::instance() );
|
||||||
|
|
||||||
if ( dlg.exec() )
|
if ( dlg.exec() )
|
||||||
sublayers = dlg.selectedLayers();
|
sublayers = dlg.selectedLayers();
|
||||||
@ -936,7 +936,7 @@ QList< QgsMapLayer * > QgsAppLayerHandling::openLayer( const QString &fileName,
|
|||||||
case SublayerHandling::AskUser:
|
case SublayerHandling::AskUser:
|
||||||
{
|
{
|
||||||
// prompt user for sublayers
|
// prompt user for sublayers
|
||||||
QgsProviderSublayersDialog dlg( fileName, fileName, sublayers, {}, QgisApp::instance() );
|
QgsProviderSublayersDialog dlg( fileName, QString(), fileName, sublayers, {}, QgisApp::instance() );
|
||||||
dlg.setNonLayerItems( nonLayerItems );
|
dlg.setNonLayerItems( nonLayerItems );
|
||||||
|
|
||||||
if ( dlg.exec() )
|
if ( dlg.exec() )
|
||||||
@ -1373,7 +1373,7 @@ T *QgsAppLayerHandling::addLayerPrivate( QgsMapLayerType type, const QString &ur
|
|||||||
{
|
{
|
||||||
case SublayerHandling::AskUser:
|
case SublayerHandling::AskUser:
|
||||||
{
|
{
|
||||||
QgsProviderSublayersDialog dlg( updatedUri, path, sublayers, {type}, QgisApp::instance() );
|
QgsProviderSublayersDialog dlg( updatedUri, providerKey, path, sublayers, {type}, QgisApp::instance() );
|
||||||
QString groupName = providerMetadata->suggestGroupNameForUri( uri );
|
QString groupName = providerMetadata->suggestGroupNameForUri( uri );
|
||||||
if ( !groupName.isEmpty() )
|
if ( !groupName.isEmpty() )
|
||||||
dlg.setGroupName( groupName );
|
dlg.setGroupName( groupName );
|
||||||
|
@ -458,7 +458,7 @@ class CORE_EXPORT QgsProviderMetadata : public QObject
|
|||||||
virtual QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const;
|
virtual QList< QgsProviderSublayerDetails > querySublayers( const QString &uri, Qgis::SublayerQueryFlags flags = Qgis::SublayerQueryFlags(), QgsFeedback *feedback = nullptr ) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a name that can be used as a group name for sublayers got from
|
* Returns a name that can be used as a group name for sublayers retrieved from
|
||||||
* the specified \a uri.
|
* the specified \a uri.
|
||||||
*
|
*
|
||||||
* The default implementation returns an empty string.
|
* The default implementation returns an empty string.
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
|
|
||||||
#include "qgsprovidersublayertask.h"
|
#include "qgsprovidersublayertask.h"
|
||||||
#include "qgsfeedback.h"
|
#include "qgsfeedback.h"
|
||||||
|
#include "qgsprovidermetadata.h"
|
||||||
#include "qgsproviderregistry.h"
|
#include "qgsproviderregistry.h"
|
||||||
#include "qgsprovidersublayerdetails.h"
|
#include "qgsprovidersublayerdetails.h"
|
||||||
#include "qgsreadwritelocker.h"
|
#include "qgsreadwritelocker.h"
|
||||||
@ -28,6 +29,14 @@ QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri, bool inclu
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QgsProviderSublayerTask::QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables )
|
||||||
|
: QgsTask( tr( "Retrieving layers" ), QgsTask::CanCancel | QgsTask::CancelWithoutPrompt | QgsTask::Silent )
|
||||||
|
, mUri( uri )
|
||||||
|
, mProviderKey( providerKey )
|
||||||
|
, mIncludeSystemTables( includeSystemTables )
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
QList<QgsProviderSublayerDetails> QgsProviderSublayerTask::results() const
|
QList<QgsProviderSublayerDetails> QgsProviderSublayerTask::results() const
|
||||||
{
|
{
|
||||||
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Read );
|
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Read );
|
||||||
@ -44,7 +53,15 @@ bool QgsProviderSublayerTask::run()
|
|||||||
if ( mIncludeSystemTables )
|
if ( mIncludeSystemTables )
|
||||||
flags |= Qgis::SublayerQueryFlag::IncludeSystemTables;
|
flags |= Qgis::SublayerQueryFlag::IncludeSystemTables;
|
||||||
|
|
||||||
const QList<QgsProviderSublayerDetails> res = QgsProviderRegistry::instance()->querySublayers( mUri, flags, mFeedback.get() );
|
QList<QgsProviderSublayerDetails> res;
|
||||||
|
if ( mProviderKey.isEmpty() )
|
||||||
|
res = QgsProviderRegistry::instance()->querySublayers( mUri, flags, mFeedback.get() );
|
||||||
|
else
|
||||||
|
{
|
||||||
|
QgsProviderMetadata *provider = QgsProviderRegistry::instance()->providerMetadata( mProviderKey );
|
||||||
|
if ( provider )
|
||||||
|
res = provider->querySublayers( mUri, flags, mFeedback.get() );
|
||||||
|
}
|
||||||
|
|
||||||
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Write );
|
const QgsReadWriteLocker locker( mLock, QgsReadWriteLocker::Write );
|
||||||
mResults = res;
|
mResults = res;
|
||||||
|
@ -55,6 +55,14 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask
|
|||||||
*/
|
*/
|
||||||
QgsProviderSublayerTask( const QString &uri, bool includeSystemTables = false );
|
QgsProviderSublayerTask( const QString &uri, bool includeSystemTables = false );
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Constructor for QgsProviderSublayerTask, which retrieves sublayer details for the
|
||||||
|
* specified \a uri, restricted to a particular provider.
|
||||||
|
*
|
||||||
|
* \since QGIS 3.30
|
||||||
|
*/
|
||||||
|
QgsProviderSublayerTask( const QString &uri, const QString &providerKey, bool includeSystemTables = false );
|
||||||
|
|
||||||
~QgsProviderSublayerTask() override;
|
~QgsProviderSublayerTask() override;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -72,6 +80,8 @@ class CORE_EXPORT QgsProviderSublayerTask : public QgsTask
|
|||||||
|
|
||||||
QString mUri;
|
QString mUri;
|
||||||
|
|
||||||
|
QString mProviderKey;
|
||||||
|
|
||||||
bool mIncludeSystemTables = false;
|
bool mIncludeSystemTables = false;
|
||||||
|
|
||||||
std::unique_ptr< QgsFeedback > mFeedback;
|
std::unique_ptr< QgsFeedback > mFeedback;
|
||||||
|
@ -111,7 +111,7 @@ void QgsProviderSublayerDialogModel::setGeometryTypesResolved( bool resolved )
|
|||||||
emit dataChanged( index( 0, 0 ), index( rowCount( QModelIndex() ), columnCount() ) );
|
emit dataChanged( index( 0, 0 ), index( rowCount( QModelIndex() ), columnCount() ) );
|
||||||
}
|
}
|
||||||
|
|
||||||
QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, const QString &filePathIn, const QList<QgsProviderSublayerDetails> initialDetails, const QList<QgsMapLayerType> &acceptableTypes, QWidget *parent, Qt::WindowFlags fl )
|
QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, const QString &providerKey, const QString &filePathIn, const QList<QgsProviderSublayerDetails> initialDetails, const QList<QgsMapLayerType> &acceptableTypes, QWidget *parent, Qt::WindowFlags fl )
|
||||||
: QDialog( parent, fl )
|
: QDialog( parent, fl )
|
||||||
{
|
{
|
||||||
setupUi( this );
|
setupUi( this );
|
||||||
@ -177,7 +177,7 @@ QgsProviderSublayersDialog::QgsProviderSublayersDialog( const QString &uri, cons
|
|||||||
if ( QgsProviderUtils::sublayerDetailsAreIncomplete( initialDetails ) )
|
if ( QgsProviderUtils::sublayerDetailsAreIncomplete( initialDetails ) )
|
||||||
{
|
{
|
||||||
// initial details are incomplete, so fire up a task in the background to fully populate the model...
|
// initial details are incomplete, so fire up a task in the background to fully populate the model...
|
||||||
mTask = new QgsProviderSublayerTask( uri, true );
|
mTask = new QgsProviderSublayerTask( uri, providerKey, true );
|
||||||
connect( mTask.data(), &QgsProviderSublayerTask::taskCompleted, this, [ = ]
|
connect( mTask.data(), &QgsProviderSublayerTask::taskCompleted, this, [ = ]
|
||||||
{
|
{
|
||||||
QList< QgsProviderSublayerDetails > res = mTask->results();
|
QList< QgsProviderSublayerDetails > res = mTask->results();
|
||||||
|
@ -78,6 +78,7 @@ class GUI_EXPORT QgsProviderSublayersDialog : public QDialog, private Ui::QgsPro
|
|||||||
* Constructor.
|
* Constructor.
|
||||||
*/
|
*/
|
||||||
QgsProviderSublayersDialog( const QString &uri,
|
QgsProviderSublayersDialog( const QString &uri,
|
||||||
|
const QString &providerKey,
|
||||||
const QString &filePath,
|
const QString &filePath,
|
||||||
const QList< QgsProviderSublayerDetails> initialDetails = QList< QgsProviderSublayerDetails>(),
|
const QList< QgsProviderSublayerDetails> initialDetails = QList< QgsProviderSublayerDetails>(),
|
||||||
const QList< QgsMapLayerType > &acceptableTypes = QList< QgsMapLayerType >(),
|
const QList< QgsMapLayerType > &acceptableTypes = QList< QgsMapLayerType >(),
|
||||||
|
Loading…
x
Reference in New Issue
Block a user