@@ -4623,14 +4623,20 @@ static void setupVectorLayer( const QString &vectorLayerPath,
4623
4623
}
4624
4624
}
4625
4625
4626
+
4626
4627
bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType )
4628
+ {
4629
+ return addVectorLayersPrivate( layerQStringList, enc, dataSourceType );
4630
+ }
4631
+
4632
+ bool QgisApp::addVectorLayersPrivate( const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType, const bool guiWarning )
4627
4633
{
4628
4634
bool wasfrozen = mMapCanvas->isFrozen();
4629
4635
QList<QgsMapLayer *> layersToAdd;
4630
4636
QList<QgsMapLayer *> addedLayers;
4631
4637
QgsSettings settings;
4632
4638
4633
- Q_FOREACH ( QString src, layerQStringList )
4639
+ for ( QString src : layerQStringList )
4634
4640
{
4635
4641
src = src.trimmed();
4636
4642
QString baseName;
@@ -4730,8 +4736,11 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
4730
4736
}
4731
4737
else
4732
4738
{
4733
- QString msg = tr( "%1 doesn't have any layers." ).arg( src );
4734
- visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
4739
+ if ( guiWarning )
4740
+ {
4741
+ QString msg = tr( "%1 doesn't have any layers." ).arg( src );
4742
+ visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
4743
+ }
4735
4744
delete layer;
4736
4745
}
4737
4746
}
@@ -4745,9 +4754,9 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
4745
4754
QMessageBox::question( this, tr( "Invalid Data Source" ),
4746
4755
tr( "Download with \"Protocol\" source type has failed, do you want to try the \"File\" source type?" ) ) == QMessageBox::Yes )
4747
4756
{
4748
- return addVectorLayers ( QStringList() << src.replace( QLatin1String( "/vsicurl/" ), " " ), enc, dataSourceType );
4757
+ return addVectorLayersPrivate ( QStringList() << src.replace( QLatin1String( "/vsicurl/" ), " " ), enc, dataSourceType, guiWarning );
4749
4758
}
4750
- else
4759
+ else if ( guiWarning )
4751
4760
{
4752
4761
visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
4753
4762
}
@@ -4777,10 +4786,6 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
4777
4786
freezeCanvases( false );
4778
4787
refreshMapCanvas();
4779
4788
}
4780
- // Let render() do its own cursor management
4781
- // QApplication::restoreOverrideCursor();
4782
-
4783
- // statusBar()->showMessage( mMapCanvas->extent().toString( 2 ) );
4784
4789
4785
4790
return true;
4786
4791
}
@@ -4954,23 +4959,24 @@ bool QgisApp::askUserForZipItemLayers( const QString &path )
4954
4959
}
4955
4960
4956
4961
// present a dialog to choose GDAL raster sublayers
4957
- void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
4962
+ QList< QgsMapLayer * > QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
4958
4963
{
4964
+ QList< QgsMapLayer * > result;
4959
4965
if ( !layer )
4960
- return;
4966
+ return result ;
4961
4967
4962
4968
QStringList sublayers = layer->subLayers();
4963
4969
QgsDebugMsg( QStringLiteral( "raster has %1 sublayers" ).arg( layer->subLayers().size() ) );
4964
4970
4965
4971
if ( sublayers.empty() )
4966
- return;
4972
+ return result ;
4967
4973
4968
4974
// if promptLayers=Load all, load all sublayers without prompting
4969
4975
QgsSettings settings;
4970
4976
if ( settings.value( QStringLiteral( "qgis/promptForRasterSublayers" ), 1 ).toInt() == 3 )
4971
4977
{
4972
- loadGDALSublayers( layer->source(), sublayers );
4973
- return;
4978
+ result.append( loadGDALSublayers( layer->source(), sublayers ) );
4979
+ return result ;
4974
4980
}
4975
4981
4976
4982
// We initialize a selection dialog and display it.
@@ -5061,13 +5067,15 @@ void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
5061
5067
{
5062
5068
addRasterLayer( rlayer );
5063
5069
}
5070
+ result << rlayer;
5064
5071
}
5065
5072
}
5066
5073
5067
5074
// Respect if user don't want the new group of layers visible.
5068
5075
if ( addToGroup && ! newLayersVisible )
5069
5076
group->setItemVisibilityCheckedRecursive( newLayersVisible );
5070
5077
}
5078
+ return result;
5071
5079
}
5072
5080
5073
5081
// should the GDAL sublayers dialog should be presented to the user?
@@ -5089,8 +5097,9 @@ bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
5089
5097
5090
5098
// This method will load with GDAL the layers in parameter.
5091
5099
// It is normally triggered by the sublayer selection dialog.
5092
- void QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
5100
+ QList< QgsMapLayer * > QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
5093
5101
{
5102
+ QList< QgsMapLayer * > result;
5094
5103
QString path, name;
5095
5104
QgsRasterLayer *subLayer = nullptr;
5096
5105
QgsSettings settings;
@@ -5110,6 +5119,7 @@ void QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
5110
5119
if ( subLayer )
5111
5120
{
5112
5121
if ( subLayer->isValid() )
5122
+ {
5113
5123
if ( addToGroup )
5114
5124
{
5115
5125
QgsProject::instance()->addMapLayer( subLayer, false );
@@ -5119,11 +5129,14 @@ void QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
5119
5129
{
5120
5130
addRasterLayer( subLayer );
5121
5131
}
5132
+ result << subLayer;
5133
+ }
5122
5134
else
5123
5135
delete subLayer;
5124
5136
}
5125
5137
5126
5138
}
5139
+ return result;
5127
5140
}
5128
5141
5129
5142
// This method is the method that does the real job. If the layer given in
@@ -5340,12 +5353,12 @@ void QgisApp::addVirtualLayer()
5340
5353
this, SLOT( replaceSelectedVectorLayer( QString, QString, QString, QString ) ) );
5341
5354
dts->exec();
5342
5355
delete dts;
5343
- } // QgisApp::addVirtualLayer()
5356
+ }
5344
5357
5345
5358
void QgisApp::addSelectedVectorLayer( const QString &uri, const QString &layerName, const QString &provider )
5346
5359
{
5347
5360
addVectorLayer( uri, layerName, provider );
5348
- } // QgisApp:addSelectedVectorLayer
5361
+ }
5349
5362
5350
5363
void QgisApp::replaceSelectedVectorLayer( const QString &oldId, const QString &uri, const QString &layerName, const QString &provider )
5351
5364
{
@@ -6462,24 +6475,17 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )
6462
6475
else
6463
6476
ok = addRasterLayer( fileName, fileInfo.completeBaseName() );
6464
6477
}
6465
- // TODO - should we really call isValidRasterFileName() before addRasterLayer()
6466
- // this results in 2 calls to GDALOpen()
6467
- // I think (Radim) that it is better to test only first if valid,
6468
- // addRasterLayer() is really trying to add layer and gives error if fails
6469
- //
6470
- // if ( addRasterLayer( fileName, fileInfo.completeBaseName() ) )
6471
- // {
6472
- // ok = true );
6473
- // }
6474
- else // nope - try to load it as a shape/ogr
6478
+
6479
+ // try as a vector
6480
+ if ( !ok )
6475
6481
{
6476
6482
if ( allowInteractive )
6477
6483
{
6478
- ok = addVectorLayers ( QStringList( fileName ), QStringLiteral( "System" ), QStringLiteral( "file" ) );
6484
+ ok = addVectorLayersPrivate ( QStringList( fileName ), QStringLiteral( "System" ), QStringLiteral( "file" ), false );
6479
6485
}
6480
6486
else
6481
6487
{
6482
- ok = addVectorLayer ( fileName, fileInfo.completeBaseName(), QStringLiteral( "ogr" ) );
6488
+ ok = addVectorLayerPrivate ( fileName, fileInfo.completeBaseName(), QStringLiteral( "ogr" ), false );
6483
6489
}
6484
6490
}
6485
6491
@@ -6495,6 +6501,9 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )
6495
6501
{
6496
6502
// we have no idea what this file is...
6497
6503
QgsMessageLog::logMessage( tr( "Unable to load %1" ).arg( fileName ) );
6504
+
6505
+ const QString msg = tr( "%1 is not a valid or recognized data source." ).arg( fileName );
6506
+ visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
6498
6507
}
6499
6508
6500
6509
return ok;
@@ -11020,6 +11029,11 @@ void QgisApp::showLayoutManager()
11020
11029
}
11021
11030
11022
11031
QgsVectorLayer *QgisApp::addVectorLayer( const QString &vectorLayerPath, const QString &name, const QString &providerKey )
11032
+ {
11033
+ return addVectorLayerPrivate( vectorLayerPath, name, providerKey );
11034
+ }
11035
+
11036
+ QgsVectorLayer *QgisApp::addVectorLayerPrivate( const QString &vectorLayerPath, const QString &name, const QString &providerKey, const bool guiWarning )
11023
11037
{
11024
11038
bool wasfrozen = mMapCanvas->isFrozen();
11025
11039
QgsSettings settings;
@@ -11094,9 +11108,12 @@ QgsVectorLayer *QgisApp::addVectorLayer( const QString &vectorLayerPath, const Q
11094
11108
}
11095
11109
else
11096
11110
{
11097
- QString message = layer->dataProvider()->error().message( QgsErrorMessage::Text );
11098
- QString msg = tr( "The layer %1 is not a valid layer and can not be added to the map. Reason: %2" ).arg( vectorLayerPath, message );
11099
- visibleMessageBar()->pushMessage( tr( "Layer is not valid" ), msg, Qgis::Critical, messageTimeout() );
11111
+ if ( guiWarning )
11112
+ {
11113
+ QString message = layer->dataProvider()->error().message( QgsErrorMessage::Text );
11114
+ QString msg = tr( "The layer %1 is not a valid layer and can not be added to the map. Reason: %2" ).arg( vectorLayerPath, message );
11115
+ visibleMessageBar()->pushMessage( tr( "Layer is not valid" ), msg, Qgis::Critical, messageTimeout() );
11116
+ }
11100
11117
11101
11118
delete layer;
11102
11119
freezeCanvases( false );
@@ -11116,9 +11133,7 @@ QgsVectorLayer *QgisApp::addVectorLayer( const QString &vectorLayerPath, const Q
11116
11133
11117
11134
return layer;
11118
11135
11119
- } // QgisApp::addVectorLayer
11120
-
11121
-
11136
+ }
11122
11137
11123
11138
void QgisApp::addMapLayer( QgsMapLayer *mapLayer )
11124
11139
{
@@ -13203,13 +13218,13 @@ QgsRasterLayer *QgisApp::addRasterLayerPrivate(
13203
13218
13204
13219
if ( shouldAskUserForGDALSublayers( layer ) )
13205
13220
{
13206
- askUserForGDALSublayers( layer );
13221
+ QList< QgsMapLayer * > subLayers = askUserForGDALSublayers( layer );
13207
13222
ok = true;
13208
13223
13209
13224
// The first layer loaded is not useful in that case. The user can select it in
13210
13225
// the list if he wants to load it.
13211
13226
delete layer;
13212
- layer = nullptr;
13227
+ layer = !subLayers.isEmpty() ? qobject_cast< QgsRasterLayer * >( subLayers.at( 0 ) ) : nullptr;
13213
13228
}
13214
13229
}
13215
13230
else
0 commit comments