Skip to content

Commit

Permalink
[mdal] When querying sublayers for a uri which includes a specific
Browse files Browse the repository at this point in the history
layer name, don't return all layers

Instead only return this one specific layer. Fixes drag and drop
of specific mesh sublayers from browser to qgis shouldn't ask
users to pick from all dataset layers.
  • Loading branch information
nyalldawson committed Jul 26, 2021
1 parent 215d08f commit 4b732d7
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 6 deletions.
21 changes: 15 additions & 6 deletions src/providers/mdal/qgsmdalprovider.cpp
Expand Up @@ -1077,8 +1077,11 @@ QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const
if ( uri.isEmpty() )
return {};

// get suffix, removing .gz if present
const QFileInfo info( uri );
const QVariantMap uriParts = decodeUri( uri );
const QString path = uriParts.value( QStringLiteral( "path" ), uri ).toString();
const QString layerName = uriParts.value( QStringLiteral( "layerName" ) ).toString();

const QFileInfo info( path );

if ( info.isDir() )
return {};
Expand Down Expand Up @@ -1111,13 +1114,13 @@ QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const
details.setType( QgsMapLayerType::MeshLayer );
details.setProviderKey( QStringLiteral( "mdal" ) );
details.setUri( uri );
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( uri ) );
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( path ) );
// treat all mesh files as potentially being containers (is this correct?)
details.setSkippedContainerScan( true );
return {details};
}

const QStringList meshNames = QString( MDAL_MeshNames( uri.toUtf8() ) ).split( QStringLiteral( ";;" ) );
const QStringList meshNames = QString( MDAL_MeshNames( path.toUtf8() ) ).split( QStringLiteral( ";;" ) );

QList<QgsProviderSublayerDetails> res;
res.reserve( meshNames.size() );
Expand All @@ -1127,18 +1130,24 @@ QList<QgsProviderSublayerDetails> QgsMdalProviderMetadata::querySublayers( const
if ( layerUri.isEmpty() )
continue;

const QVariantMap layerUriParts = decodeUri( layerUri );
//if an explicit layer name was included in the original uri, we only keep that layer in the results
if ( !layerName.isEmpty() && layerUriParts.value( QStringLiteral( "layerName" ) ).toString() != layerName )
continue;

QgsProviderSublayerDetails details;
details.setUri( layerUri );
details.setProviderKey( QStringLiteral( "mdal" ) );
details.setType( QgsMapLayerType::MeshLayer );
details.setLayerNumber( layerIndex );
details.setDriverName( layerUriParts.value( QStringLiteral( "driver" ) ).toString() );

// strip the driver name and path from the MDAL uri to get the layer name
details.setName( layerUri.mid( layerUri.indexOf( uri ) + uri.length() + 2 ) );
details.setName( layerUriParts.value( QStringLiteral( "layerName" ) ).toString() );
if ( details.name().isEmpty() )
{
// use file name as layer name if no layer name available from mdal
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( uri ) );
details.setName( QgsProviderUtils::suggestLayerNameFromFilePath( path ) );
}

res << details;
Expand Down
26 changes: 26 additions & 0 deletions tests/src/core/testqgsmeshlayer.cpp
Expand Up @@ -1610,6 +1610,7 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayers()
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "quad_and_triangle" ) );
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "2DM:\"%1/quad_and_triangle.2dm\"" ).arg( mDataDir ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).driverName(), QString() );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );

// make sure result is valid to load layer from
Expand All @@ -1625,6 +1626,7 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayers()
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "2DM:\"%1/quad_and_triangle.2dm\"" ).arg( mDataDir ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QCOMPARE( res.at( 0 ).driverName(), QString() );
ml.reset( qgis::down_cast< QgsMeshLayer * >( res.at( 0 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );

Expand All @@ -1636,15 +1638,39 @@ void TestQgsMeshLayer::testMdalProviderQuerySublayers()
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh1d" ).arg( mDataDir ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QCOMPARE( res.at( 0 ).driverName(), QStringLiteral( "Ugrid" ) );
ml.reset( qgis::down_cast< QgsMeshLayer * >( res.at( 0 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );
QCOMPARE( res.at( 1 ).layerNumber(), 1 );
QCOMPARE( res.at( 1 ).name(), QStringLiteral( "mesh2d" ) );
QCOMPARE( res.at( 1 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh2d" ).arg( mDataDir ) );
QCOMPARE( res.at( 1 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 1 ).type(), QgsMapLayerType::MeshLayer );
QCOMPARE( res.at( 1 ).driverName(), QStringLiteral( "Ugrid" ) );
ml.reset( qgis::down_cast< QgsMeshLayer * >( res.at( 1 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );

// mesh with two layers, but uri is for one of these layers only
res = mdalMetadata->querySublayers( QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh1d" ).arg( mDataDir ) );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "mesh1d" ) );
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh1d" ).arg( mDataDir ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QCOMPARE( res.at( 0 ).driverName(), QStringLiteral( "Ugrid" ) );
ml.reset( qgis::down_cast< QgsMeshLayer * >( res.at( 0 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );
res = mdalMetadata->querySublayers( QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh2d" ).arg( mDataDir ) );
QCOMPARE( res.count(), 1 );
QCOMPARE( res.at( 0 ).layerNumber(), 0 );
QCOMPARE( res.at( 0 ).name(), QStringLiteral( "mesh2d" ) );
QCOMPARE( res.at( 0 ).uri(), QStringLiteral( "Ugrid:\"%1/manzese_1d2d_small_map.nc\":mesh2d" ).arg( mDataDir ) );
QCOMPARE( res.at( 0 ).providerKey(), QStringLiteral( "mdal" ) );
QCOMPARE( res.at( 0 ).type(), QgsMapLayerType::MeshLayer );
QCOMPARE( res.at( 0 ).driverName(), QStringLiteral( "Ugrid" ) );
ml.reset( qgis::down_cast< QgsMeshLayer * >( res.at( 0 ).toLayer( options ) ) );
QVERIFY( ml->isValid() );
}

void TestQgsMeshLayer::testMdalProviderQuerySublayersFastScan()
Expand Down

0 comments on commit 4b732d7

Please sign in to comment.