Skip to content

Commit

Permalink
Add method to convert parameter value to a list of strings
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Dec 16, 2021
1 parent 4e71e45 commit 6315133
Show file tree
Hide file tree
Showing 4 changed files with 126 additions and 2 deletions.
Expand Up @@ -544,7 +544,28 @@ Returns a string version of the parameter input ``value`` (if possible).
:param context: processing context

:return: - value converted to string
- ok: will be set to ``True`` if value could be represented as a string
- ok: will be set to ``True`` if value could be represented as a string.

.. seealso:: :py:func:`valueAsStringList`

.. seealso:: :py:func:`valueAsJsonObject`

.. seealso:: :py:func:`valueAsPythonString`

.. versionadded:: 3.24
%End

virtual QStringList valueAsStringList( const QVariant &value, QgsProcessingContext &context, bool &ok /Out/ ) const;
%Docstring
Returns a string list version of the parameter input ``value`` (if possible).

:param value: value to convert
:param context: processing context

:return: - value converted to string list
- ok: will be set to ``True`` if value could be represented as a string list

.. seealso:: :py:func:`valueAsString`

.. seealso:: :py:func:`valueAsJsonObject`

Expand Down
25 changes: 25 additions & 0 deletions src/core/processing/qgsprocessingparameters.cpp
Expand Up @@ -2824,6 +2824,31 @@ QString QgsProcessingParameterDefinition::valueAsString( const QVariant &value,
return value.toString();
}

QStringList QgsProcessingParameterDefinition::valueAsStringList( const QVariant &value, QgsProcessingContext &context, bool &ok ) const
{
ok = true;
if ( !value.isValid( ) )
return QStringList();

if ( value.type() == QVariant::Type::List || value.type() == QVariant::Type::StringList )
{
const QVariantList sourceList = value.toList();
QStringList resultList;
resultList.reserve( sourceList.size() );
for ( const QVariant &v : sourceList )
{
resultList.append( valueAsStringList( v, context, ok ) );
}
return resultList;
}

const QString res = valueAsString( value, context, ok );
if ( !ok )
return QStringList();

return {res};
}

QString QgsProcessingParameterDefinition::valueAsPythonComment( const QVariant &, QgsProcessingContext & ) const
{
return QString();
Expand Down
18 changes: 17 additions & 1 deletion src/core/processing/qgsprocessingparameters.h
Expand Up @@ -635,15 +635,31 @@ class CORE_EXPORT QgsProcessingParameterDefinition
*
* \param value value to convert
* \param context processing context
* \param ok will be set to TRUE if value could be represented as a string
* \param ok will be set to TRUE if value could be represented as a string.
* \returns value converted to string
*
* \see valueAsStringList()
* \see valueAsJsonObject()
* \see valueAsPythonString()
* \since QGIS 3.24
*/
virtual QString valueAsString( const QVariant &value, QgsProcessingContext &context, bool &ok SIP_OUT ) const;

/**
* Returns a string list version of the parameter input \a value (if possible).
*
* \param value value to convert
* \param context processing context
* \param ok will be set to TRUE if value could be represented as a string list
* \returns value converted to string list
*
* \see valueAsString()
* \see valueAsJsonObject()
* \see valueAsPythonString()
* \since QGIS 3.24
*/
virtual QStringList valueAsStringList( const QVariant &value, QgsProcessingContext &context, bool &ok SIP_OUT ) const;

/**
* Returns a Python comment explaining a parameter \a value, or an empty string if no comment is required.
*
Expand Down
62 changes: 62 additions & 0 deletions tests/src/analysis/testqgsprocessing.cpp
Expand Up @@ -2672,6 +2672,17 @@ void TestQgsProcessing::parameterBoolean()
QCOMPARE( def->valueAsString( QVariant(), context, ok ), QString() );
QVERIFY( ok );

QCOMPARE( def->valueAsStringList( false, context, ok ), QStringList( {QStringLiteral( "false" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( true, context, ok ), QStringList( {QStringLiteral( "true" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( "false", context, ok ), QStringList( {QStringLiteral( "false" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( "true", context, ok ), QStringList( {QStringLiteral( "true" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariant(), context, ok ), QStringList() );
QVERIFY( ok );

QString code = def->asScriptCode();
QCOMPARE( code, QStringLiteral( "##non_optional_default_false=boolean false" ) );
std::unique_ptr< QgsProcessingParameterBoolean > fromCode( dynamic_cast< QgsProcessingParameterBoolean * >( QgsProcessingParameters::parameterFromScriptCode( code ) ) );
Expand Down Expand Up @@ -4267,6 +4278,17 @@ void TestQgsProcessing::parameterMatrix()
QCOMPARE( def->valueAsString( "1,2,3", context, ok ), QVariant( QStringLiteral( "1,2,3" ) ) );
QVERIFY( ok );

QCOMPARE( def->valueAsStringList( QVariantList() << 1 << 2.5 << 3, context, ok ), QStringList( {QStringLiteral( "1" ), QStringLiteral( "2.5" ), QStringLiteral( "3" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << ( QVariantList() << 1 << 2 << 3 ) << ( QVariantList() << 1 << 2 << 3 ), context, ok ), QStringList( {QStringLiteral( "1" ), QStringLiteral( "2" ), QStringLiteral( "3" ), QStringLiteral( "1" ), QStringLiteral( "2" ), QStringLiteral( "3" )} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << ( QVariantList() << 1 << QStringLiteral( "value" ) << 3 ) << ( QVariantList() << 1 << 2 << QStringLiteral( "it's a value" ) ), context, ok ), QStringList( {"1", "value", "3", "1", "2", "it's a value" } ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << ( QVariantList() << 1 << QVariant() << 3 ) << ( QVariantList() << QVariant() << 2 << 3 ), context, ok ), QStringList( {"1", "3", "2", "3"} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << ( QVariantList() << 1 << QString( "" ) << 3 ) << ( QVariantList() << 1 << 2 << QString( "" ) ), context, ok ), QStringList( {"1", "", "3", "1", "2", "" } ) );
QVERIFY( ok );

QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterMatrix('non_optional', '', numberRows=3, hasFixedNumberRows=False, headers=[], defaultValue=None)" ) );

Expand Down Expand Up @@ -4472,6 +4494,9 @@ void TestQgsProcessing::parameterLayerList()
QCOMPARE( def->valueAsString( "uri='complex' username=\"complex\"", context, ok ), QStringLiteral( "uri='complex' username=\"complex\"" ) );
QVERIFY( ok );

QCOMPARE( def->valueAsStringList( QStringList() << r1->id() << raster2, context, ok ), QStringList( { QString( testDataDir + QStringLiteral( "tenbytenraster.asc" ) ), QString( testDataDir + QStringLiteral( "landsat.tif" ) ) } ) );
QVERIFY( ok );

QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterMultipleLayers('non_optional', '', layerType=QgsProcessing.TypeMapLayer, defaultValue='')" ) );

Expand Down Expand Up @@ -4678,6 +4703,11 @@ void TestQgsProcessing::parameterLayerList()
QVERIFY( !ok );
QCOMPARE( def->valueAsString( QVariantList() << "c" << "d", context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( QStringList() << "a" << "B", context, ok ), QStringList( {"a", "B"} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << "c" << "d", context, ok ), QStringList( {"c", "d"} ) );
QVERIFY( ok );
}

void TestQgsProcessing::parameterDistance()
Expand Down Expand Up @@ -5224,6 +5254,9 @@ void TestQgsProcessing::parameterRange()
QCOMPARE( def->valueAsString( QVariantList() << 1.1 << 2, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( QVariantList() << 1.1 << 2, context, ok ), QStringList( {"1.1", "2"} ) );
QVERIFY( ok );

QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterRange('non_optional', '', type=QgsProcessingParameterNumber.Double, defaultValue=[5,6])" ) );

Expand Down Expand Up @@ -5611,6 +5644,9 @@ void TestQgsProcessing::parameterEnum()
QCOMPARE( def->valueAsString( QStringLiteral( "1,2" ), context, ok ), QStringLiteral( "1,2" ) );
QVERIFY( ok );

QCOMPARE( def->valueAsStringList( QVariantList() << 1 << 2, context, ok ), QStringList( {"1", "2"} ) );
QVERIFY( ok );

QCOMPARE( def->valueAsPythonComment( QVariant(), context ), QString() );
QCOMPARE( def->valueAsPythonComment( 2, context ), QStringLiteral( "C" ) );
QCOMPARE( def->valueAsPythonComment( QVariantList() << 1 << 2, context ), QStringLiteral( "B,C" ) );
Expand Down Expand Up @@ -6404,6 +6440,9 @@ void TestQgsProcessing::parameterField()
QCOMPARE( def->valueAsString( QStringList() << "a" << "b", context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( QStringList() << "a" << "b", context, ok ), QStringList( {"a", "b"} ) );
QVERIFY( ok );

QVariantMap map = def->toVariantMap();
QgsProcessingParameterField fromMap( "x" );
QVERIFY( fromMap.fromVariantMap( map ) );
Expand Down Expand Up @@ -8118,6 +8157,11 @@ void TestQgsProcessing::parameterBand()
QCOMPARE( def->valueAsString( QVariantList() << 1 << 2, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( QStringList() << "1" << "2", context, ok ), QStringList( {"1", "2"} ) );
QVERIFY( ok );
QCOMPARE( def->valueAsStringList( QVariantList() << 1 << 2, context, ok ), QStringList( {"1", "2"} ) );
QVERIFY( ok );

const QVariantMap map = def->toVariantMap();
QgsProcessingParameterBand fromMap( "x" );
QVERIFY( fromMap.fromVariantMap( map ) );
Expand Down Expand Up @@ -9404,6 +9448,9 @@ void TestQgsProcessing::parameterAggregate()
QCOMPARE( def->valueAsString( QVariant( QVariantList() << map << map2 ), context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( QVariant( QVariantList() << map << map2 ), context, ok ), QStringList() );
QVERIFY( !ok );

QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterAggregate('non_optional', '', parentLayerParameterName='parent')" ) );

Expand Down Expand Up @@ -9481,6 +9528,9 @@ void TestQgsProcessing::parameterTinInputLayers()
QCOMPARE( def->valueAsString( layerList, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( layerList, context, ok ), QStringList() );
QVERIFY( !ok );

const QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterTinInputLayers('tin input layer', '')" ) );
}
Expand Down Expand Up @@ -9534,6 +9584,9 @@ void TestQgsProcessing::parameterMeshDatasetGroups()
QCOMPARE( def->valueAsString( groupsList, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( groupsList, context, ok ), QStringList( {"0", "5"} ) );
QVERIFY( ok );

QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterMeshDatasetGroups('dataset groups', 'groups', dataType=[QgsMeshDatasetGroupMetadata.DataOnVertices])" ) );

Expand Down Expand Up @@ -9569,6 +9622,9 @@ void TestQgsProcessing::parameterMeshDatasetGroups()
QCOMPARE( def->valueAsString( groupsList, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( groupsList, context, ok ), QStringList( {"2", "6"} ) );
QVERIFY( ok );

QVERIFY( !def->dependsOnOtherParameters().isEmpty() );
QCOMPARE( def->meshLayerParameterName(), QStringLiteral( "layer parameter" ) );

Expand Down Expand Up @@ -9624,6 +9680,9 @@ void TestQgsProcessing::parameterMeshDatasetTime()
QCOMPARE( def->valueAsString( value, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( value, context, ok ), QStringList() );
QVERIFY( !ok );

QCOMPARE( QgsProcessingParameterMeshDatasetTime::valueAsTimeType( value ), QStringLiteral( "static" ) );

value[QStringLiteral( "type" )] = QStringLiteral( "current-context-time" );
Expand Down Expand Up @@ -10109,6 +10168,9 @@ void TestQgsProcessing::parameterDxfLayers()
QCOMPARE( def->valueAsString( layerList, context, ok ), QString() );
QVERIFY( !ok );

QCOMPARE( def->valueAsStringList( layerList, context, ok ), QStringList() );
QVERIFY( !ok );

const QString pythonCode = def->asPythonString();
QCOMPARE( pythonCode, QStringLiteral( "QgsProcessingParameterDxfLayers('dxf input layer', '')" ) );

Expand Down

0 comments on commit 6315133

Please sign in to comment.