Skip to content

Commit 5acd7ff

Browse files
committedDec 17, 2018
[processing] Add API to set default unit to distance parameters
Otherwise the API forces use of a corresponding CRS parameter in order to determine the relevant distance unit, but this is not always desirable
1 parent 9e1bf68 commit 5acd7ff

File tree

6 files changed

+59
-1
lines changed

6 files changed

+59
-1
lines changed
 

‎python/core/auto_generated/processing/qgsprocessingparameters.sip.in

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1555,6 +1555,24 @@ Returns the name of the parent parameter, or an empty string if this is not set.
15551555
Sets the name of the parent layer parameter. Use an empty string if this is not required.
15561556

15571557
.. seealso:: :py:func:`parentParameterName`
1558+
%End
1559+
1560+
QgsUnitTypes::DistanceUnit defaultUnit() const;
1561+
%Docstring
1562+
Returns the default distance unit for the parameter.
1563+
1564+
.. seealso:: :py:func:`setDefaultUnit`
1565+
1566+
.. versionadded:: 3.4.3
1567+
%End
1568+
1569+
void setDefaultUnit( QgsUnitTypes::DistanceUnit unit );
1570+
%Docstring
1571+
Sets the default distance ``unit`` for the parameter.
1572+
1573+
.. seealso:: :py:func:`defaultUnit`
1574+
1575+
.. versionadded:: 3.4.3
15581576
%End
15591577

15601578
virtual QVariantMap toVariantMap() const;

‎src/core/processing/qgsprocessingparameters.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4734,12 +4734,14 @@ QVariantMap QgsProcessingParameterDistance::toVariantMap() const
47344734
{
47354735
QVariantMap map = QgsProcessingParameterNumber::toVariantMap();
47364736
map.insert( QStringLiteral( "parent" ), mParentParameterName );
4737+
map.insert( QStringLiteral( "default_unit" ), static_cast< int >( mDefaultUnit ) );
47374738
return map;
47384739
}
47394740

47404741
bool QgsProcessingParameterDistance::fromVariantMap( const QVariantMap &map )
47414742
{
47424743
QgsProcessingParameterNumber::fromVariantMap( map );
47434744
mParentParameterName = map.value( QStringLiteral( "parent" ) ).toString();
4745+
mDefaultUnit = static_cast< QgsUnitTypes::DistanceUnit>( map.value( QStringLiteral( "default_unit" ), QgsUnitTypes::DistanceUnknownUnit ).toInt() );
47444746
return true;
47454747
}

‎src/core/processing/qgsprocessingparameters.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1539,12 +1539,29 @@ class CORE_EXPORT QgsProcessingParameterDistance : public QgsProcessingParameter
15391539
*/
15401540
void setParentParameterName( const QString &parentParameterName );
15411541

1542+
/**
1543+
* Returns the default distance unit for the parameter.
1544+
*
1545+
* \see setDefaultUnit()
1546+
* \since QGIS 3.4.3
1547+
*/
1548+
QgsUnitTypes::DistanceUnit defaultUnit() const { return mDefaultUnit; }
1549+
1550+
/**
1551+
* Sets the default distance \a unit for the parameter.
1552+
*
1553+
* \see defaultUnit()
1554+
* \since QGIS 3.4.3
1555+
*/
1556+
void setDefaultUnit( QgsUnitTypes::DistanceUnit unit ) { mDefaultUnit = unit; }
1557+
15421558
QVariantMap toVariantMap() const override;
15431559
bool fromVariantMap( const QVariantMap &map ) override;
15441560

15451561
private:
15461562

15471563
QString mParentParameterName;
1564+
QgsUnitTypes::DistanceUnit mDefaultUnit = QgsUnitTypes::DistanceUnknownUnit;
15481565

15491566
};
15501567

‎src/gui/processing/qgsprocessingwidgetwrapperimpl.cpp

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -739,6 +739,8 @@ QgsAbstractProcessingParameterWidgetWrapper *QgsProcessingDistanceWidgetWrapper:
739739

740740
QWidget *QgsProcessingDistanceWidgetWrapper::createWidget()
741741
{
742+
const QgsProcessingParameterDistance *distanceDef = static_cast< const QgsProcessingParameterDistance * >( parameterDefinition() );
743+
742744
QWidget *spin = QgsProcessingNumericWidgetWrapper::createWidget();
743745
switch ( type() )
744746
{
@@ -777,7 +779,7 @@ QWidget *QgsProcessingDistanceWidgetWrapper::createWidget()
777779
mWarningLabel->setLayout( warningLayout );
778780
layout->insertWidget( 4, mWarningLabel );
779781

780-
setUnits( QgsUnitTypes::DistanceUnknownUnit );
782+
setUnits( distanceDef->defaultUnit() );
781783

782784
QWidget *w = new QWidget();
783785
layout->setMargin( 0 );

‎tests/src/analysis/testqgsprocessing.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3274,6 +3274,13 @@ void TestQgsProcessing::parameterDistance()
32743274
std::unique_ptr< QgsProcessingParameterDistance > def( new QgsProcessingParameterDistance( "non_optional", QString(), 5, QStringLiteral( "parent" ), false ) );
32753275
QCOMPARE( def->parentParameterName(), QStringLiteral( "parent" ) );
32763276
def->setParentParameterName( QStringLiteral( "parent2" ) );
3277+
QCOMPARE( def->defaultUnit(), QgsUnitTypes::DistanceUnknownUnit );
3278+
def->setDefaultUnit( QgsUnitTypes::DistanceFeet );
3279+
QCOMPARE( def->defaultUnit(), QgsUnitTypes::DistanceFeet );
3280+
std::unique_ptr< QgsProcessingParameterDistance > clone( def->clone() );
3281+
QCOMPARE( clone->parentParameterName(), QStringLiteral( "parent2" ) );
3282+
QCOMPARE( clone->defaultUnit(), QgsUnitTypes::DistanceFeet );
3283+
32773284
QCOMPARE( def->parentParameterName(), QStringLiteral( "parent2" ) );
32783285
QVERIFY( def->checkValueIsAcceptable( 5 ) );
32793286
QVERIFY( def->checkValueIsAcceptable( "1.1" ) );
@@ -3331,6 +3338,7 @@ void TestQgsProcessing::parameterDistance()
33313338
QCOMPARE( fromMap.maximum(), def->maximum() );
33323339
QCOMPARE( fromMap.dataType(), def->dataType() );
33333340
QCOMPARE( fromMap.parentParameterName(), QStringLiteral( "parent2" ) );
3341+
QCOMPARE( fromMap.defaultUnit(), QgsUnitTypes::DistanceFeet );
33343342
def.reset( dynamic_cast< QgsProcessingParameterDistance *>( QgsProcessingParameters::parameterFromVariantMap( map ) ) );
33353343
QVERIFY( dynamic_cast< QgsProcessingParameterDistance *>( def.get() ) );
33363344

‎tests/src/gui/testprocessinggui.cpp

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1396,6 +1396,8 @@ void TestProcessingGui::testDistanceWrapper()
13961396
// test unit handling
13971397
w->show();
13981398

1399+
QCOMPARE( wrapper.mLabel->text(), QStringLiteral( "<unknown>" ) );
1400+
13991401
// crs values
14001402
wrapper.setUnitParameterValue( QStringLiteral( "EPSG:3111" ) );
14011403
QCOMPARE( wrapper.mLabel->text(), QStringLiteral( "meters" ) );
@@ -1475,6 +1477,15 @@ void TestProcessingGui::testDistanceWrapper()
14751477

14761478
delete w;
14771479

1480+
// with default unit
1481+
QgsProcessingParameterDistance paramDefaultUnit( QStringLiteral( "num" ), QStringLiteral( "num" ) );
1482+
paramDefaultUnit.setDefaultUnit( QgsUnitTypes::DistanceFeet );
1483+
QgsProcessingDistanceWidgetWrapper wrapperDefaultUnit( &paramDefaultUnit, QgsProcessingGui::Standard );
1484+
w = wrapperDefaultUnit.createWrappedWidget( context );
1485+
w->show();
1486+
QCOMPARE( wrapperDefaultUnit.mLabel->text(), QStringLiteral( "feet" ) );
1487+
delete w;
1488+
14781489
// with decimals
14791490
QgsProcessingParameterDistance paramDecimals( QStringLiteral( "num" ), QStringLiteral( "num" ), QVariant(), QString(), true, 1, 1.02 );
14801491
QVariantMap metadata;

0 commit comments

Comments
 (0)
Please sign in to comment.