Skip to content

Commit 73fa58a

Browse files
committed
Fix more incorrect 'invalid data source' errors when loading mesh layers
1 parent a1d8d9a commit 73fa58a

File tree

2 files changed

+60
-40
lines changed

2 files changed

+60
-40
lines changed

src/app/qgisapp.cpp

+52-37
Original file line numberDiff line numberDiff line change
@@ -4623,14 +4623,20 @@ static void setupVectorLayer( const QString &vectorLayerPath,
46234623
}
46244624
}
46254625

4626+
46264627
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 )
46274633
{
46284634
bool wasfrozen = mMapCanvas->isFrozen();
46294635
QList<QgsMapLayer *> layersToAdd;
46304636
QList<QgsMapLayer *> addedLayers;
46314637
QgsSettings settings;
46324638

4633-
Q_FOREACH ( QString src, layerQStringList )
4639+
for ( QString src : layerQStringList )
46344640
{
46354641
src = src.trimmed();
46364642
QString baseName;
@@ -4730,8 +4736,11 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
47304736
}
47314737
else
47324738
{
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+
}
47354744
delete layer;
47364745
}
47374746
}
@@ -4745,9 +4754,9 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
47454754
QMessageBox::question( this, tr( "Invalid Data Source" ),
47464755
tr( "Download with \"Protocol\" source type has failed, do you want to try the \"File\" source type?" ) ) == QMessageBox::Yes )
47474756
{
4748-
return addVectorLayers( QStringList() << src.replace( QLatin1String( "/vsicurl/" ), " " ), enc, dataSourceType );
4757+
return addVectorLayersPrivate( QStringList() << src.replace( QLatin1String( "/vsicurl/" ), " " ), enc, dataSourceType, guiWarning );
47494758
}
4750-
else
4759+
else if ( guiWarning )
47514760
{
47524761
visibleMessageBar()->pushMessage( tr( "Invalid Data Source" ), msg, Qgis::Critical, messageTimeout() );
47534762
}
@@ -4777,10 +4786,6 @@ bool QgisApp::addVectorLayers( const QStringList &layerQStringList, const QStrin
47774786
freezeCanvases( false );
47784787
refreshMapCanvas();
47794788
}
4780-
// Let render() do its own cursor management
4781-
// QApplication::restoreOverrideCursor();
4782-
4783-
// statusBar()->showMessage( mMapCanvas->extent().toString( 2 ) );
47844789

47854790
return true;
47864791
}
@@ -4954,23 +4959,24 @@ bool QgisApp::askUserForZipItemLayers( const QString &path )
49544959
}
49554960

49564961
// present a dialog to choose GDAL raster sublayers
4957-
void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
4962+
QList< QgsMapLayer * > QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
49584963
{
4964+
QList< QgsMapLayer * > result;
49594965
if ( !layer )
4960-
return;
4966+
return result;
49614967

49624968
QStringList sublayers = layer->subLayers();
49634969
QgsDebugMsg( QStringLiteral( "raster has %1 sublayers" ).arg( layer->subLayers().size() ) );
49644970

49654971
if ( sublayers.empty() )
4966-
return;
4972+
return result;
49674973

49684974
// if promptLayers=Load all, load all sublayers without prompting
49694975
QgsSettings settings;
49704976
if ( settings.value( QStringLiteral( "qgis/promptForRasterSublayers" ), 1 ).toInt() == 3 )
49714977
{
4972-
loadGDALSublayers( layer->source(), sublayers );
4973-
return;
4978+
result.append( loadGDALSublayers( layer->source(), sublayers ) );
4979+
return result;
49744980
}
49754981

49764982
// We initialize a selection dialog and display it.
@@ -5061,13 +5067,15 @@ void QgisApp::askUserForGDALSublayers( QgsRasterLayer *layer )
50615067
{
50625068
addRasterLayer( rlayer );
50635069
}
5070+
result << rlayer;
50645071
}
50655072
}
50665073

50675074
// Respect if user don't want the new group of layers visible.
50685075
if ( addToGroup && ! newLayersVisible )
50695076
group->setItemVisibilityCheckedRecursive( newLayersVisible );
50705077
}
5078+
return result;
50715079
}
50725080

50735081
// should the GDAL sublayers dialog should be presented to the user?
@@ -5089,8 +5097,9 @@ bool QgisApp::shouldAskUserForGDALSublayers( QgsRasterLayer *layer )
50895097

50905098
// This method will load with GDAL the layers in parameter.
50915099
// 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 )
50935101
{
5102+
QList< QgsMapLayer * > result;
50945103
QString path, name;
50955104
QgsRasterLayer *subLayer = nullptr;
50965105
QgsSettings settings;
@@ -5110,6 +5119,7 @@ void QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
51105119
if ( subLayer )
51115120
{
51125121
if ( subLayer->isValid() )
5122+
{
51135123
if ( addToGroup )
51145124
{
51155125
QgsProject::instance()->addMapLayer( subLayer, false );
@@ -5119,11 +5129,14 @@ void QgisApp::loadGDALSublayers( const QString &uri, const QStringList &list )
51195129
{
51205130
addRasterLayer( subLayer );
51215131
}
5132+
result << subLayer;
5133+
}
51225134
else
51235135
delete subLayer;
51245136
}
51255137

51265138
}
5139+
return result;
51275140
}
51285141

51295142
// This method is the method that does the real job. If the layer given in
@@ -5340,12 +5353,12 @@ void QgisApp::addVirtualLayer()
53405353
this, SLOT( replaceSelectedVectorLayer( QString, QString, QString, QString ) ) );
53415354
dts->exec();
53425355
delete dts;
5343-
} // QgisApp::addVirtualLayer()
5356+
}
53445357

53455358
void QgisApp::addSelectedVectorLayer( const QString &uri, const QString &layerName, const QString &provider )
53465359
{
53475360
addVectorLayer( uri, layerName, provider );
5348-
} // QgisApp:addSelectedVectorLayer
5361+
}
53495362

53505363
void QgisApp::replaceSelectedVectorLayer( const QString &oldId, const QString &uri, const QString &layerName, const QString &provider )
53515364
{
@@ -6462,24 +6475,17 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )
64626475
else
64636476
ok = addRasterLayer( fileName, fileInfo.completeBaseName() );
64646477
}
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 )
64756481
{
64766482
if ( allowInteractive )
64776483
{
6478-
ok = addVectorLayers( QStringList( fileName ), QStringLiteral( "System" ), QStringLiteral( "file" ) );
6484+
ok = addVectorLayersPrivate( QStringList( fileName ), QStringLiteral( "System" ), QStringLiteral( "file" ), false );
64796485
}
64806486
else
64816487
{
6482-
ok = addVectorLayer( fileName, fileInfo.completeBaseName(), QStringLiteral( "ogr" ) );
6488+
ok = addVectorLayerPrivate( fileName, fileInfo.completeBaseName(), QStringLiteral( "ogr" ), false );
64836489
}
64846490
}
64856491

@@ -6495,6 +6501,9 @@ bool QgisApp::openLayer( const QString &fileName, bool allowInteractive )
64956501
{
64966502
// we have no idea what this file is...
64976503
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() );
64986507
}
64996508

65006509
return ok;
@@ -11020,6 +11029,11 @@ void QgisApp::showLayoutManager()
1102011029
}
1102111030

1102211031
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 )
1102311037
{
1102411038
bool wasfrozen = mMapCanvas->isFrozen();
1102511039
QgsSettings settings;
@@ -11094,9 +11108,12 @@ QgsVectorLayer *QgisApp::addVectorLayer( const QString &vectorLayerPath, const Q
1109411108
}
1109511109
else
1109611110
{
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+
}
1110011117

1110111118
delete layer;
1110211119
freezeCanvases( false );
@@ -11116,9 +11133,7 @@ QgsVectorLayer *QgisApp::addVectorLayer( const QString &vectorLayerPath, const Q
1111611133

1111711134
return layer;
1111811135

11119-
} // QgisApp::addVectorLayer
11120-
11121-
11136+
}
1112211137

1112311138
void QgisApp::addMapLayer( QgsMapLayer *mapLayer )
1112411139
{
@@ -13203,13 +13218,13 @@ QgsRasterLayer *QgisApp::addRasterLayerPrivate(
1320313218

1320413219
if ( shouldAskUserForGDALSublayers( layer ) )
1320513220
{
13206-
askUserForGDALSublayers( layer );
13221+
QList< QgsMapLayer * > subLayers = askUserForGDALSublayers( layer );
1320713222
ok = true;
1320813223

1320913224
// The first layer loaded is not useful in that case. The user can select it in
1321013225
// the list if he wants to load it.
1321113226
delete layer;
13212-
layer = nullptr;
13227+
layer = !subLayers.isEmpty() ? qobject_cast< QgsRasterLayer * >( subLayers.at( 0 ) ) : nullptr;
1321313228
}
1321413229
}
1321513230
else

src/app/qgisapp.h

+8-3
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
865865

866866
//! copies features to internal clipboard
867867
void copyFeatures( QgsFeatureStore &featureStore );
868-
void loadGDALSublayers( const QString &uri, const QStringList &list );
868+
QList<QgsMapLayer *> loadGDALSublayers( const QString &uri, const QStringList &list );
869869

870870
//! Deletes the selected attributes for the currently selected vector layer
871871
void deleteSelected( QgsMapLayer *layer = nullptr, QWidget *parent = nullptr, bool checkFeaturesVisible = false );
@@ -1776,9 +1776,10 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
17761776
bool askUserForZipItemLayers( const QString &path );
17771777

17781778
/**
1779-
* This method will open a dialog so the user can select GDAL sublayers to load
1779+
* This method will open a dialog so the user can select GDAL sublayers to load,
1780+
* and then returns a list of these layers.
17801781
*/
1781-
void askUserForGDALSublayers( QgsRasterLayer *layer );
1782+
QList< QgsMapLayer * > askUserForGDALSublayers( QgsRasterLayer *layer );
17821783

17831784
/**
17841785
* This method will verify if a GDAL layer contains sublayers
@@ -1806,6 +1807,10 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
18061807
QgsMeshLayer *addMeshLayerPrivate( const QString &uri, const QString &baseName,
18071808
const QString &providerKey, bool guiWarning = true );
18081809

1810+
bool addVectorLayersPrivate( const QStringList &layerQStringList, const QString &enc, const QString &dataSourceType, bool guiWarning = true );
1811+
QgsVectorLayer *addVectorLayerPrivate( const QString &vectorLayerPath, const QString &baseName, const QString &providerKey, bool guiWarning = true );
1812+
1813+
18091814
/**
18101815
* Add the current project to the recently opened/saved projects list
18111816
* pass settings by reference since creating more than one

0 commit comments

Comments
 (0)