Skip to content

Commit e6a71ab

Browse files
committed
Allow direct map layer parameter/default values were appropriate
1 parent b75a174 commit e6a71ab

File tree

2 files changed

+134
-7
lines changed

2 files changed

+134
-7
lines changed

src/core/processing/qgsprocessingparameters.cpp

+77-6
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,29 @@ QgsMapLayer *QgsProcessingParameters::parameterAsLayer( const QgsProcessingParam
301301
if ( !definition )
302302
return nullptr;
303303

304-
QString layerRef = parameterAsString( definition, parameters, context );
304+
QVariant val = parameters.value( definition->name() );
305+
if ( val.canConvert<QgsProperty>() )
306+
{
307+
val = val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
308+
}
309+
310+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
311+
{
312+
return layer;
313+
}
314+
315+
if ( !val.isValid() || val.toString().isEmpty() )
316+
{
317+
// fall back to default
318+
val = definition->defaultValue();
319+
}
320+
321+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
322+
{
323+
return layer;
324+
}
325+
326+
QString layerRef = val.toString();
305327
if ( layerRef.isEmpty() )
306328
layerRef = definition->defaultValue().toString();
307329

@@ -456,14 +478,31 @@ QList<QgsMapLayer *> QgsProcessingParameters::parameterAsLayerList( const QgsPro
456478
if ( !definition )
457479
return QList<QgsMapLayer *>();
458480

459-
QStringList resultStringList;
460481
QVariant val = parameters.value( definition->name() );
482+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( val ) ) )
483+
{
484+
return QList<QgsMapLayer *>() << layer;
485+
}
486+
487+
QList<QgsMapLayer *> layers;
488+
489+
QStringList resultStringList;
490+
461491
if ( val.canConvert<QgsProperty>() )
462492
resultStringList << val.value< QgsProperty >().valueAsString( context.expressionContext(), definition->defaultValue().toString() );
463493
else if ( val.type() == QVariant::List )
464494
{
465495
Q_FOREACH ( const QVariant &var, val.toList() )
466-
resultStringList << var.toString();
496+
{
497+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( var ) ) )
498+
{
499+
layers << layer;
500+
}
501+
else
502+
{
503+
resultStringList << var.toString();
504+
}
505+
}
467506
}
468507
else
469508
resultStringList << val.toString();
@@ -472,16 +511,28 @@ QList<QgsMapLayer *> QgsProcessingParameters::parameterAsLayerList( const QgsPro
472511
{
473512
resultStringList.clear();
474513
// check default
475-
if ( definition->defaultValue().type() == QVariant::List )
514+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( definition->defaultValue() ) ) )
515+
{
516+
layers << layer;
517+
}
518+
else if ( definition->defaultValue().type() == QVariant::List )
476519
{
477520
Q_FOREACH ( const QVariant &var, definition->defaultValue().toList() )
478-
resultStringList << var.toString();
521+
{
522+
if ( QgsMapLayer *layer = qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( var ) ) )
523+
{
524+
layers << layer;
525+
}
526+
else
527+
{
528+
resultStringList << var.toString();
529+
}
530+
}
479531
}
480532
else
481533
resultStringList << definition->defaultValue().toString();
482534
}
483535

484-
QList<QgsMapLayer *> layers;
485536
Q_FOREACH ( const QString &s, resultStringList )
486537
{
487538
QgsMapLayer *layer = QgsProcessingUtils::mapLayerFromString( s, context );
@@ -662,6 +713,11 @@ bool QgsProcessingParameterExtent::checkValueIsAcceptable( const QVariant &input
662713
return true;
663714
}
664715

716+
if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
717+
{
718+
return true;
719+
}
720+
665721
if ( input.type() != QVariant::String || input.toString().isEmpty() )
666722
return mFlags & FlagOptional;
667723

@@ -842,6 +898,11 @@ bool QgsProcessingParameterMultipleLayers::checkValueIsAcceptable( const QVarian
842898
if ( !input.isValid() )
843899
return mFlags & FlagOptional;
844900

901+
if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( input ) ) )
902+
{
903+
return true;
904+
}
905+
845906
if ( input.type() == QVariant::String )
846907
{
847908
if ( input.toString().isEmpty() )
@@ -868,6 +929,9 @@ bool QgsProcessingParameterMultipleLayers::checkValueIsAcceptable( const QVarian
868929

869930
Q_FOREACH ( const QVariant &v, input.toList() )
870931
{
932+
if ( qobject_cast< QgsMapLayer * >( qvariant_cast<QObject *>( v ) ) )
933+
continue;
934+
871935
if ( !QgsProcessingUtils::mapLayerFromString( v.toString(), *context ) )
872936
return false;
873937
}
@@ -1048,6 +1112,9 @@ bool QgsProcessingParameterRasterLayer::checkValueIsAcceptable( const QVariant &
10481112
return true;
10491113
}
10501114

1115+
if ( qobject_cast< QgsRasterLayer * >( qvariant_cast<QObject *>( input ) ) )
1116+
return true;
1117+
10511118
if ( input.type() != QVariant::String || input.toString().isEmpty() )
10521119
return mFlags & FlagOptional;
10531120

@@ -1282,6 +1349,10 @@ bool QgsProcessingParameterFeatureSource::checkValueIsAcceptable( const QVariant
12821349
{
12831350
return true;
12841351
}
1352+
if ( qobject_cast< QgsVectorLayer * >( qvariant_cast<QObject *>( input ) ) )
1353+
{
1354+
return true;
1355+
}
12851356

12861357
if ( var.type() != QVariant::String || var.toString().isEmpty() )
12871358
return mFlags & FlagOptional;

tests/src/core/testqgsprocessing.cpp

+57-1
Original file line numberDiff line numberDiff line change
@@ -1409,6 +1409,8 @@ void TestQgsProcessing::parameterLayer()
14091409
QVERIFY( !def->checkValueIsAcceptable( true ) );
14101410
QVERIFY( !def->checkValueIsAcceptable( 5 ) );
14111411
QVERIFY( def->checkValueIsAcceptable( "layer12312312" ) );
1412+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
1413+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( v1 ) ) );
14121414
QVERIFY( !def->checkValueIsAcceptable( "" ) );
14131415
QVERIFY( !def->checkValueIsAcceptable( QVariant() ) );
14141416

@@ -1437,6 +1439,13 @@ void TestQgsProcessing::parameterLayer()
14371439
params.insert( "non_optional", QString( "i'm not a layer, and nothing you can do will make me one" ) );
14381440
QVERIFY( !QgsProcessingParameters::parameterAsLayer( def.get(), params, context ) );
14391441

1442+
// layer
1443+
params.insert( "non_optional", QVariant::fromValue( r1 ) );
1444+
QCOMPARE( QgsProcessingParameters::parameterAsLayer( def.get(), params, context ), r1 );
1445+
params.insert( "non_optional", QVariant::fromValue( v1 ) );
1446+
QCOMPARE( QgsProcessingParameters::parameterAsLayer( def.get(), params, context ), v1 );
1447+
1448+
14401449
// optional
14411450
def.reset( new QgsProcessingParameterMapLayer( "optional", QString(), v1->id(), true ) );
14421451
params.insert( "optional", QVariant() );
@@ -1448,6 +1457,8 @@ void TestQgsProcessing::parameterLayer()
14481457
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.shp" ) );
14491458
QVERIFY( def->checkValueIsAcceptable( "" ) );
14501459
QVERIFY( def->checkValueIsAcceptable( QVariant() ) );
1460+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
1461+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( v1 ) ) );
14511462
}
14521463

14531464
void TestQgsProcessing::parameterExtent()
@@ -1674,6 +1685,8 @@ void TestQgsProcessing::parameterLayerList()
16741685
QVERIFY( def->checkValueIsAcceptable( "layer12312312" ) );
16751686
QVERIFY( !def->checkValueIsAcceptable( "" ) );
16761687
QVERIFY( !def->checkValueIsAcceptable( QVariant() ) );
1688+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
1689+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( v1 ) ) );
16771690

16781691
// should be OK
16791692
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.shp" ) );
@@ -1690,11 +1703,18 @@ void TestQgsProcessing::parameterLayerList()
16901703
QVariantMap params;
16911704
params.insert( "non_optional", v1->id() );
16921705
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 );
1706+
// using existing map layer
1707+
params.insert( "non_optional", QVariant::fromValue( v1 ) );
1708+
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 );
16931709

16941710
// using two existing map layer ID
16951711
params.insert( "non_optional", QVariantList() << v1->id() << r1->id() );
16961712
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 << r1 );
16971713

1714+
// using two existing map layers
1715+
params.insert( "non_optional", QVariantList() << QVariant::fromValue( v1 ) << QVariant::fromValue( r1 ) );
1716+
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 << r1 );
1717+
16981718
// mix of existing layers and non project layer string
16991719
params.insert( "non_optional", QVariantList() << v1->id() << raster2 );
17001720
QList< QgsMapLayer *> layers = QgsProcessingParameters::parameterAsLayerList( def.get(), params, context );
@@ -1756,6 +1776,14 @@ void TestQgsProcessing::parameterLayerList()
17561776
def.reset( new QgsProcessingParameterMultipleLayers( "optional", QString(), QgsProcessingParameterDefinition::TypeAny, QVariantList() << v1->id() << r1->publicSource(), true ) );
17571777
params.insert( "optional", QVariant() );
17581778
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 << r1 );
1779+
1780+
// optional with one default direct layer
1781+
def.reset( new QgsProcessingParameterMultipleLayers( "optional", QString(), QgsProcessingParameterDefinition::TypeAny, QVariant::fromValue( v1 ), true ) );
1782+
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 );
1783+
1784+
// optional with two default direct layers
1785+
def.reset( new QgsProcessingParameterMultipleLayers( "optional", QString(), QgsProcessingParameterDefinition::TypeAny, QVariantList() << QVariant::fromValue( v1 ) << QVariant::fromValue( r1 ), true ) );
1786+
QCOMPARE( QgsProcessingParameters::parameterAsLayerList( def.get(), params, context ), QList< QgsMapLayer *>() << v1 << r1 );
17591787
}
17601788

17611789
void TestQgsProcessing::parameterNumber()
@@ -1915,6 +1943,8 @@ void TestQgsProcessing::parameterRasterLayer()
19151943
QVERIFY( def->checkValueIsAcceptable( "layer12312312" ) );
19161944
QVERIFY( !def->checkValueIsAcceptable( "" ) );
19171945
QVERIFY( !def->checkValueIsAcceptable( QVariant() ) );
1946+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
1947+
QVERIFY( !def->checkValueIsAcceptable( QVariant::fromValue( v1 ) ) );
19181948

19191949
// should be OK
19201950
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.tif" ) );
@@ -1926,10 +1956,18 @@ void TestQgsProcessing::parameterRasterLayer()
19261956
params.insert( "non_optional", r1->id() );
19271957
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
19281958

1959+
// using existing map layer
1960+
params.insert( "non_optional", QVariant::fromValue( r1 ) );
1961+
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
1962+
19291963
// not raster layer
19301964
params.insert( "non_optional", v1->id() );
19311965
QVERIFY( !QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context ) );
19321966

1967+
// using existing vector layer
1968+
params.insert( "non_optional", QVariant::fromValue( v1 ) );
1969+
QVERIFY( !QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context ) );
1970+
19331971
// string representing a project layer source
19341972
params.insert( "non_optional", raster1 );
19351973
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
@@ -1943,7 +1981,7 @@ void TestQgsProcessing::parameterRasterLayer()
19431981

19441982
// optional
19451983
def.reset( new QgsProcessingParameterRasterLayer( "optional", QString(), r1->id(), true ) );
1946-
QCOMPARE( QgsProcessingParameters::parameterAsLayer( def.get(), params, context )->id(), r1->id() );
1984+
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
19471985
QVERIFY( def->checkValueIsAcceptable( false ) );
19481986
QVERIFY( def->checkValueIsAcceptable( true ) );
19491987
QVERIFY( def->checkValueIsAcceptable( 5 ) );
@@ -1954,6 +1992,10 @@ void TestQgsProcessing::parameterRasterLayer()
19541992

19551993
params.insert( "optional", QVariant() );
19561994
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
1995+
1996+
// optional with direct layer
1997+
def.reset( new QgsProcessingParameterRasterLayer( "optional", QString(), QVariant::fromValue( r1 ), true ) );
1998+
QCOMPARE( QgsProcessingParameters::parameterAsRasterLayer( def.get(), params, context )->id(), r1->id() );
19571999
}
19582000

19592001
void TestQgsProcessing::parameterEnum()
@@ -2219,6 +2261,8 @@ void TestQgsProcessing::parameterFeatureSource()
22192261
QVERIFY( !def->checkValueIsAcceptable( "" ) );
22202262
QVERIFY( !def->checkValueIsAcceptable( QVariant() ) );
22212263
QVERIFY( def->checkValueIsAcceptable( QgsProcessingFeatureSourceDefinition( "layer1231123" ) ) );
2264+
QVERIFY( def->checkValueIsAcceptable( QVariant::fromValue( v1 ) ) );
2265+
QVERIFY( !def->checkValueIsAcceptable( QVariant::fromValue( r1 ) ) );
22222266

22232267
// should be OK
22242268
QVERIFY( def->checkValueIsAcceptable( "c:/Users/admin/Desktop/roads_clipped_transformed_v1_reprojected_final_clipped_aAAA.shp" ) );
@@ -2230,10 +2274,18 @@ void TestQgsProcessing::parameterFeatureSource()
22302274
params.insert( "non_optional", v1->id() );
22312275
QCOMPARE( QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context )->id(), v1->id() );
22322276

2277+
// using existing layer
2278+
params.insert( "non_optional", QVariant::fromValue( v1 ) );
2279+
QCOMPARE( QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context )->id(), v1->id() );
2280+
22332281
// not vector layer
22342282
params.insert( "non_optional", r1->id() );
22352283
QVERIFY( !QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context ) );
22362284

2285+
// using existing non-vector layer
2286+
params.insert( "non_optional", QVariant::fromValue( r1 ) );
2287+
QVERIFY( !QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context ) );
2288+
22372289
// string representing a layer source
22382290
params.insert( "non_optional", vector1 );
22392291
QCOMPARE( QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context )->publicSource(), vector1 );
@@ -2254,6 +2306,10 @@ void TestQgsProcessing::parameterFeatureSource()
22542306
QVERIFY( def->checkValueIsAcceptable( "" ) );
22552307
QVERIFY( def->checkValueIsAcceptable( QVariant() ) );
22562308
QVERIFY( def->checkValueIsAcceptable( QgsProcessingFeatureSourceDefinition( "layer1231123" ) ) );
2309+
2310+
//optional with direct layer default
2311+
def.reset( new QgsProcessingParameterFeatureSource( "optional", QString(), QList< int >() << QgsProcessingParameterDefinition::TypeVectorAny, QVariant::fromValue( v1 ), true ) );
2312+
QCOMPARE( QgsProcessingParameters::parameterAsVectorLayer( def.get(), params, context )->id(), v1->id() );
22572313
}
22582314

22592315
void TestQgsProcessing::parameterFeatureSink()

0 commit comments

Comments
 (0)