Skip to content

Commit ecbc471

Browse files
committed
[processing] Some more framework for dynamic (data defined) parameters
1 parent 618baf9 commit ecbc471

File tree

3 files changed

+143
-0
lines changed

3 files changed

+143
-0
lines changed

python/core/processing/qgsprocessingparameters.sip

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -376,6 +376,69 @@ class QgsProcessingParameterDefinition
376376
:rtype: str
377377
%End
378378

379+
bool isDynamic() const;
380+
%Docstring
381+
Returns true if the parameter supports is dynamic, and can support data-defined values
382+
(i.e. QgsProperty based values).
383+
.. seealso:: setIsDynamic()
384+
.. seealso:: dynamicPropertyDefinition()
385+
.. seealso:: dynamicLayerParameterName()
386+
:rtype: bool
387+
%End
388+
389+
void setIsDynamic( bool dynamic );
390+
%Docstring
391+
Sets whether the parameter is ``dynamic``, and can support data-defined values
392+
(i.e. QgsProperty based values).
393+
.. seealso:: isDynamic()
394+
.. seealso:: setDynamicPropertyDefinition()
395+
.. seealso:: setDynamicLayerParameterName()
396+
%End
397+
398+
QgsPropertyDefinition dynamicPropertyDefinition() const;
399+
%Docstring
400+
Returns the property definition for dynamic properties.
401+
.. seealso:: isDynamic()
402+
.. seealso:: setDynamicPropertyDefinition()
403+
.. seealso:: dynamicLayerParameterName()
404+
:rtype: QgsPropertyDefinition
405+
%End
406+
407+
void setDynamicPropertyDefinition( const QgsPropertyDefinition &definition );
408+
%Docstring
409+
Sets the property ``definition`` for dynamic properties.
410+
.. seealso:: isDynamic()
411+
.. seealso:: dynamicPropertyDefinition()
412+
.. seealso:: setDynamicLayerParameterName()
413+
%End
414+
415+
QString dynamicLayerParameterName() const;
416+
%Docstring
417+
Returns the name of the parameter for a layer linked to a dynamic parameter, or an empty string if this is not set.
418+
419+
Dynamic parameters (see isDynamic()) can have an optional vector layer parameter linked to them,
420+
which indicates which layer the fields and values will be available from when evaluating
421+
the dynamic parameter.
422+
423+
.. seealso:: setDynamicLayerParameterName()
424+
.. seealso:: isDynamic()
425+
.. seealso:: dynamicPropertyDefinition()
426+
:rtype: str
427+
%End
428+
429+
void setDynamicLayerParameterName( const QString &name );
430+
%Docstring
431+
Sets the ``name`` for the parameter for a layer linked to a dynamic parameter, or an empty string if this is not set.
432+
433+
Dynamic parameters (see isDynamic()) can have an optional vector layer parameter linked to them,
434+
which indicates which layer the fields and values will be available from when evaluating
435+
the dynamic parameter.
436+
437+
.. seealso:: dynamicLayerParameterName()
438+
.. seealso:: isDynamic()
439+
.. seealso:: setDynamicPropertyDefinition()
440+
%End
441+
379442
protected:
380443

381444

@@ -385,6 +448,9 @@ class QgsProcessingParameterDefinition
385448

386449

387450

451+
452+
453+
388454
};
389455

390456
QFlags<QgsProcessingParameterDefinition::Flag> operator|(QgsProcessingParameterDefinition::Flag f1, QFlags<QgsProcessingParameterDefinition::Flag> f2);

src/core/processing/qgsprocessingparameters.h

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -412,6 +412,66 @@ class CORE_EXPORT QgsProcessingParameterDefinition
412412
*/
413413
virtual QString toolTip() const;
414414

415+
/**
416+
* Returns true if the parameter supports is dynamic, and can support data-defined values
417+
* (i.e. QgsProperty based values).
418+
* \see setIsDynamic()
419+
* \see dynamicPropertyDefinition()
420+
* \see dynamicLayerParameterName()
421+
*/
422+
bool isDynamic() const { return mIsDynamic; }
423+
424+
/**
425+
* Sets whether the parameter is \a dynamic, and can support data-defined values
426+
* (i.e. QgsProperty based values).
427+
* \see isDynamic()
428+
* \see setDynamicPropertyDefinition()
429+
* \see setDynamicLayerParameterName()
430+
*/
431+
void setIsDynamic( bool dynamic ) { mIsDynamic = dynamic; }
432+
433+
/**
434+
* Returns the property definition for dynamic properties.
435+
* \see isDynamic()
436+
* \see setDynamicPropertyDefinition()
437+
* \see dynamicLayerParameterName()
438+
*/
439+
QgsPropertyDefinition dynamicPropertyDefinition() const { return mPropertyDefinition; }
440+
441+
/**
442+
* Sets the property \a definition for dynamic properties.
443+
* \see isDynamic()
444+
* \see dynamicPropertyDefinition()
445+
* \see setDynamicLayerParameterName()
446+
*/
447+
void setDynamicPropertyDefinition( const QgsPropertyDefinition &definition ) { mPropertyDefinition = definition; }
448+
449+
/**
450+
* Returns the name of the parameter for a layer linked to a dynamic parameter, or an empty string if this is not set.
451+
*
452+
* Dynamic parameters (see isDynamic()) can have an optional vector layer parameter linked to them,
453+
* which indicates which layer the fields and values will be available from when evaluating
454+
* the dynamic parameter.
455+
*
456+
* \see setDynamicLayerParameterName()
457+
* \see isDynamic()
458+
* \see dynamicPropertyDefinition()
459+
*/
460+
QString dynamicLayerParameterName() const { return mDynamicLayerParameterName; }
461+
462+
/**
463+
* Sets the \a name for the parameter for a layer linked to a dynamic parameter, or an empty string if this is not set.
464+
*
465+
* Dynamic parameters (see isDynamic()) can have an optional vector layer parameter linked to them,
466+
* which indicates which layer the fields and values will be available from when evaluating
467+
* the dynamic parameter.
468+
*
469+
* \see dynamicLayerParameterName()
470+
* \see isDynamic()
471+
* \see setDynamicPropertyDefinition()
472+
*/
473+
void setDynamicLayerParameterName( const QString &name ) { mDynamicLayerParameterName = name; }
474+
415475
protected:
416476

417477
//! Parameter name
@@ -432,6 +492,15 @@ class CORE_EXPORT QgsProcessingParameterDefinition
432492
//! Pointer to algorithm which owns this parameter
433493
QgsProcessingAlgorithm *mAlgorithm = nullptr;
434494

495+
//! True for dynamic parameters, which can have data-defined (QgsProperty) based values
496+
bool mIsDynamic = false;
497+
498+
//! Data defined property definition
499+
QgsPropertyDefinition mPropertyDefinition;
500+
501+
//! Linked vector layer parameter name for dynamic properties
502+
QString mDynamicLayerParameterName;
503+
435504
// To allow access to mAlgorithm. We don't want a public setter for this!
436505
friend class QgsProcessingAlgorithm;
437506

tests/src/analysis/testqgsprocessing.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1445,6 +1445,7 @@ void TestQgsProcessing::parameters()
14451445
// test parameter utilities
14461446

14471447
std::unique_ptr< QgsProcessingParameterDefinition > def;
1448+
14481449
QVariantMap params;
14491450
params.insert( QStringLiteral( "prop" ), QgsProperty::fromField( "a_field" ) );
14501451
params.insert( QStringLiteral( "string" ), QStringLiteral( "a string" ) );
@@ -1471,6 +1472,13 @@ void TestQgsProcessing::parameters()
14711472
def->setName( QStringLiteral( "bad" ) );
14721473
QCOMPARE( QgsProcessingParameters::parameterAsString( def.get(), params, context ), QString() );
14731474

1475+
def->setIsDynamic( true );
1476+
QVERIFY( def->isDynamic() );
1477+
def->setDynamicPropertyDefinition( QgsPropertyDefinition( QStringLiteral( "Distance" ), QObject::tr( "Buffer distance" ), QgsPropertyDefinition::Double ) );
1478+
QCOMPARE( def->dynamicPropertyDefinition().name(), QStringLiteral( "Distance" ) );
1479+
def->setDynamicLayerParameterName( "parent" );
1480+
QCOMPARE( def->dynamicLayerParameterName(), QStringLiteral( "parent" ) );
1481+
14741482
// string with dynamic property (feature not set)
14751483
def->setName( QStringLiteral( "prop" ) );
14761484
QCOMPARE( QgsProcessingParameters::parameterAsString( def.get(), params, context ), QString() );

0 commit comments

Comments
 (0)