Skip to content

Commit

Permalink
[gdal][ui] Fix opening of gdal rasters within ZIP containers in the d…
Browse files Browse the repository at this point in the history
…ata source manager dialog
  • Loading branch information
nirvn committed Feb 28, 2021
1 parent ef33cef commit a5f001e
Show file tree
Hide file tree
Showing 6 changed files with 47 additions and 20 deletions.
9 changes: 9 additions & 0 deletions python/gui/auto_generated/qgsabstractdatasourcewidget.sip.in
Expand Up @@ -85,6 +85,15 @@ Emitted when a DB layer has been selected for addition
void addRasterLayer( const QString &rasterLayerPath, const QString &baseName, const QString &providerKey );
%Docstring
Emitted when a raster layer has been selected for addition
%End

void addRasterLayers( const QStringList &layersList );
%Docstring
Emitted when one or more GDAL supported layers are selected for addition

:param layersList: list of layers protocol URIs

.. versionadded:: 3.20
%End

void addVectorLayer( const QString &uri, const QString &layerName, const QString &providerKey = QString() );
Expand Down
21 changes: 10 additions & 11 deletions src/app/qgisapp.cpp
Expand Up @@ -2434,6 +2434,7 @@ void QgisApp::dataSourceManager( const QString &pageName )
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::connectionsChanged, this, &QgisApp::connectionsChanged );
connect( mDataSourceManagerDialog, SIGNAL( addRasterLayer( QString const &, QString const &, QString const & ) ),
this, SLOT( addRasterLayer( QString const &, QString const &, QString const & ) ) );
connect( mDataSourceManagerDialog, &QgsDataSourceManagerDialog::addRasterLayers, this, [ = ]( const QStringList & layersList ) { addRasterLayers( layersList ); } );
connect( mDataSourceManagerDialog, SIGNAL( addVectorLayer( QString const &, QString const &, QString const & ) ),
this, SLOT( addVectorLayer( QString const &, QString const &, QString const & ) ) );
connect( mDataSourceManagerDialog, SIGNAL( addVectorLayers( QStringList const &, QString const &, QString const & ) ),
Expand Down Expand Up @@ -15585,38 +15586,36 @@ bool QgisApp::addRasterLayers( QStringList const &fileNameQStringList, bool guiW
// be ogr layers. We'll set returnValue to false if one or more layers fail
// to load.
bool returnValue = true;
for ( QStringList::ConstIterator myIterator = fileNameQStringList.begin();
myIterator != fileNameQStringList.end();
++myIterator )
for ( const QString &src : fileNameQStringList )
{
QString errMsg;
bool ok = false;

// if needed prompt for zipitem layers
QString vsiPrefix = QgsZipItem::vsiPrefix( *myIterator );
if ( ! myIterator->startsWith( QLatin1String( "/vsi" ), Qt::CaseInsensitive ) &&
QString vsiPrefix = QgsZipItem::vsiPrefix( src );
if ( ( !src.startsWith( QLatin1String( "/vsi" ), Qt::CaseInsensitive ) || src.endsWith( QLatin1String( ".zip" ) ) || src.endsWith( QLatin1String( ".tar" ) ) ) &&
( vsiPrefix == QLatin1String( "/vsizip/" ) || vsiPrefix == QLatin1String( "/vsitar/" ) ) )
{
if ( askUserForZipItemLayers( *myIterator ) )
if ( askUserForZipItemLayers( src ) )
continue;
}

if ( QgsRasterLayer::isValidRasterFileName( *myIterator, errMsg ) )
if ( QgsRasterLayer::isValidRasterFileName( src, errMsg ) )
{
QFileInfo myFileInfo( *myIterator );
QFileInfo myFileInfo( src );

// set the layer name to the file base name...
QString layerName = myFileInfo.completeBaseName();

// ...unless provided explicitly
const QVariantMap uriDetails = QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "gdal" ), *myIterator );
const QVariantMap uriDetails = QgsProviderRegistry::instance()->decodeUri( QStringLiteral( "gdal" ), src );
if ( !uriDetails[ QStringLiteral( "layerName" ) ].toString().isEmpty() )
{
layerName = uriDetails[ QStringLiteral( "layerName" ) ].toString();
}

// try to create the layer
QgsRasterLayer *layer = addRasterLayerPrivate( *myIterator, layerName,
QgsRasterLayer *layer = addRasterLayerPrivate( src, layerName,
QString(), guiWarning, true );
if ( layer && layer->isValid() )
{
Expand All @@ -15641,7 +15640,7 @@ bool QgisApp::addRasterLayers( QStringList const &fileNameQStringList, bool guiW
// loaded afterwards (see main.cpp)
if ( guiWarning )
{
QString msg = tr( "%1 is not a supported raster data source" ).arg( *myIterator );
QString msg = tr( "%1 is not a supported raster data source" ).arg( src );
if ( !errMsg.isEmpty() )
msg += '\n' + errMsg;

Expand Down
8 changes: 1 addition & 7 deletions src/gui/providers/gdal/qgsgdalsourceselect.cpp
Expand Up @@ -168,13 +168,7 @@ void QgsGdalSourceSelect::addButtonClicked()
return;
}

for ( const QString &dataSource : mDataSources )
{
if ( QFile::exists( dataSource ) )
emit addRasterLayer( dataSource, QFileInfo( dataSource ).completeBaseName(), QStringLiteral( "gdal" ) );
else
emit addRasterLayer( dataSource, dataSource, QStringLiteral( "gdal" ) );
}
emit addRasterLayers( mDataSources );
}

void QgsGdalSourceSelect::computeDataSources()
Expand Down
7 changes: 7 additions & 0 deletions src/gui/qgsabstractdatasourcewidget.h
Expand Up @@ -100,6 +100,13 @@ class GUI_EXPORT QgsAbstractDataSourceWidget : public QDialog
//! Emitted when a raster layer has been selected for addition
void addRasterLayer( const QString &rasterLayerPath, const QString &baseName, const QString &providerKey );

/**
* Emitted when one or more GDAL supported layers are selected for addition
* \param layersList list of layers protocol URIs
* \since 3.20
*/
void addRasterLayers( const QStringList &layersList );

/**
* Emitted when a vector layer has been selected for addition.
*
Expand Down
7 changes: 7 additions & 0 deletions src/gui/qgsdatasourcemanagerdialog.cpp
Expand Up @@ -136,6 +136,11 @@ void QgsDataSourceManagerDialog::rasterLayerAdded( const QString &uri, const QSt
emit addRasterLayer( uri, baseName, providerKey );
}

void QgsDataSourceManagerDialog::rasterLayersAdded( const QStringList &layersList )
{
emit addRasterLayers( layersList );
}

void QgsDataSourceManagerDialog::vectorLayerAdded( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey )
{
emit addVectorLayer( vectorLayerPath, baseName, providerKey );
Expand Down Expand Up @@ -188,6 +193,8 @@ void QgsDataSourceManagerDialog::makeConnections( QgsAbstractDataSourceWidget *d
{
addRasterLayer( uri, baseName, providerKey );
} );
connect( dlg, &QgsAbstractDataSourceWidget::addRasterLayers,
this, &QgsDataSourceManagerDialog::rasterLayersAdded );
// Mesh
connect( dlg, &QgsAbstractDataSourceWidget::addMeshLayer, this, &QgsDataSourceManagerDialog::addMeshLayer );
// Vector tile
Expand Down
15 changes: 13 additions & 2 deletions src/gui/qgsdatasourcemanagerdialog.h
Expand Up @@ -77,10 +77,14 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva

// TODO: use this with an internal source select dialog instead of forwarding the whole raster selection to app

//! A raster layer was added: for signal forwarding to QgisApp
void rasterLayerAdded( QString const &uri, QString const &baseName, QString const &providerKey );

/**
* A raster layer was added: for signal forwarding to QgisApp
* One or more raster layer were added: for signal forwarding to QgisApp
* \since QGIS 3.20
*/
void rasterLayerAdded( QString const &uri, QString const &baseName, QString const &providerKey );
void rasterLayersAdded( const QStringList &layersList );
//! A vector layer was added: for signal forwarding to QgisApp
void vectorLayerAdded( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey );
//! One or more vector layer were added: for signal forwarding to QgisApp
Expand All @@ -103,10 +107,17 @@ class GUI_EXPORT QgsDataSourceManagerDialog : public QgsOptionsDialogBase, priva
void showEvent( QShowEvent *event ) override;

signals:

/**
* Emitted when a one or more layer were selected for addition: for signal forwarding to QgisApp
* \since QGIS 3.20
*/
void addRasterLayers( const QStringList &layersList );
//! Emitted when a raster layer was selected for addition: for signal forwarding to QgisApp
void addRasterLayer( const QString &uri, const QString &baseName, const QString &providerKey );
//! Emitted when the user wants to select a raster layer: for signal forwarding to QgisApp
void addRasterLayer();

//! Emitted when a vector layer was selected for addition: for signal forwarding to QgisApp
void addVectorLayer( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey );

Expand Down

0 comments on commit a5f001e

Please sign in to comment.