Skip to content

Commit 95b47b7

Browse files
committedMar 16, 2023
Allow overriding the distance and area units in algorithm settings
1 parent e19840e commit 95b47b7

File tree

3 files changed

+105
-9
lines changed

3 files changed

+105
-9
lines changed
 

‎src/gui/processing/qgsprocessingalgorithmdialogbase.cpp

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
#include "qgsapplication.h"
2727
#include "qgspanelwidget.h"
2828
#include "qgsjsonutils.h"
29+
#include "qgsunittypes.h"
2930
#include <QToolButton>
3031
#include <QDesktopServices>
3132
#include <QScrollBar>
@@ -263,6 +264,8 @@ QgsProcessingAlgorithmDialogBase::QgsProcessingAlgorithmDialogBase( QWidget *par
263264
{
264265
mOverrideDefaultContextSettings = true;
265266
mGeometryCheck = mContextOptionsWidget->invalidGeometryCheck();
267+
mDistanceUnits = mContextOptionsWidget->distanceUnit();
268+
mAreaUnits = mContextOptionsWidget->areaUnit();
266269
} );
267270
}
268271
}
@@ -863,6 +866,8 @@ void QgsProcessingAlgorithmDialogBase::applyContextOverrides( QgsProcessingConte
863866
if ( mOverrideDefaultContextSettings )
864867
{
865868
context->setInvalidGeometryCheck( mGeometryCheck );
869+
context->setDistanceUnit( mDistanceUnits );
870+
context->setAreaUnit( mAreaUnits );
866871
}
867872
}
868873

@@ -942,17 +947,67 @@ QgsProcessingContextOptionsWidget::QgsProcessingContextOptionsWidget( QWidget *p
942947
mComboInvalidFeatureFiltering->addItem( tr( "Skip (Ignore) Features with Invalid Geometries" ), QgsFeatureRequest::GeometrySkipInvalid );
943948
mComboInvalidFeatureFiltering->addItem( tr( "Stop Algorithm Execution When a Geometry is Invalid" ), QgsFeatureRequest::GeometryAbortOnInvalid );
944949

950+
mDistanceUnitsCombo->addItem( tr( "Default" ), QVariant::fromValue( Qgis::DistanceUnit::Unknown ) );
951+
for ( Qgis::DistanceUnit unit :
952+
{
953+
Qgis::DistanceUnit::Meters,
954+
Qgis::DistanceUnit::Kilometers,
955+
Qgis::DistanceUnit::Centimeters,
956+
Qgis::DistanceUnit::Millimeters,
957+
Qgis::DistanceUnit::Feet,
958+
Qgis::DistanceUnit::Miles,
959+
Qgis::DistanceUnit::NauticalMiles,
960+
Qgis::DistanceUnit::Yards,
961+
Qgis::DistanceUnit::Degrees,
962+
} )
963+
{
964+
mDistanceUnitsCombo->addItem( QgsUnitTypes::toString( unit ), QVariant::fromValue( unit ) );
965+
}
966+
967+
mAreaUnitsCombo->addItem( tr( "Default" ), QVariant::fromValue( Qgis::AreaUnit::Unknown ) );
968+
for ( Qgis::AreaUnit unit :
969+
{
970+
Qgis::AreaUnit::SquareMeters,
971+
Qgis::AreaUnit::Hectares,
972+
Qgis::AreaUnit::SquareKilometers,
973+
Qgis::AreaUnit::SquareCentimeters,
974+
Qgis::AreaUnit::SquareMillimeters,
975+
Qgis::AreaUnit::SquareFeet,
976+
Qgis::AreaUnit::SquareMiles,
977+
Qgis::AreaUnit::SquareNauticalMiles,
978+
Qgis::AreaUnit::SquareYards,
979+
Qgis::AreaUnit::Acres,
980+
Qgis::AreaUnit::SquareDegrees,
981+
} )
982+
{
983+
mAreaUnitsCombo->addItem( QgsUnitTypes::toString( unit ), QVariant::fromValue( unit ) );
984+
}
985+
945986
connect( mComboInvalidFeatureFiltering, qOverload< int >( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
987+
connect( mDistanceUnitsCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
988+
connect( mAreaUnitsCombo, qOverload< int >( &QComboBox::currentIndexChanged ), this, &QgsPanelWidget::widgetChanged );
946989
}
947990

948991
void QgsProcessingContextOptionsWidget::setFromContext( const QgsProcessingContext *context )
949992
{
950993
whileBlocking( mComboInvalidFeatureFiltering )->setCurrentIndex( mComboInvalidFeatureFiltering->findData( static_cast< int >( context->invalidGeometryCheck() ) ) );
994+
whileBlocking( mDistanceUnitsCombo )->setCurrentIndex( mDistanceUnitsCombo->findData( QVariant::fromValue( context->distanceUnit() ) ) );
995+
whileBlocking( mAreaUnitsCombo )->setCurrentIndex( mAreaUnitsCombo->findData( QVariant::fromValue( context->areaUnit() ) ) );
951996
}
952997

953998
QgsFeatureRequest::InvalidGeometryCheck QgsProcessingContextOptionsWidget::invalidGeometryCheck() const
954999
{
9551000
return static_cast< QgsFeatureRequest::InvalidGeometryCheck >( mComboInvalidFeatureFiltering->currentData().toInt() );
9561001
}
9571002

1003+
Qgis::DistanceUnit QgsProcessingContextOptionsWidget::distanceUnit() const
1004+
{
1005+
return mDistanceUnitsCombo->currentData().value< Qgis::DistanceUnit >();
1006+
}
1007+
1008+
Qgis::AreaUnit QgsProcessingContextOptionsWidget::areaUnit() const
1009+
{
1010+
return mAreaUnitsCombo->currentData().value< Qgis::AreaUnit >();
1011+
}
1012+
9581013
///@endcond

‎src/gui/processing/qgsprocessingalgorithmdialogbase.h

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -472,6 +472,8 @@ class GUI_EXPORT QgsProcessingAlgorithmDialogBase : public QDialog, public QgsPr
472472
QPointer< QgsProcessingContextOptionsWidget > mContextOptionsWidget;
473473
bool mOverrideDefaultContextSettings = false;
474474
QgsFeatureRequest::InvalidGeometryCheck mGeometryCheck = QgsFeatureRequest::InvalidGeometryCheck::GeometryAbortOnInvalid;
475+
Qgis::DistanceUnit mDistanceUnits = Qgis::DistanceUnit::Unknown;
476+
Qgis::AreaUnit mAreaUnits = Qgis::AreaUnit::Unknown;
475477

476478
QString formatHelp( QgsProcessingAlgorithm *algorithm );
477479
void scrollToBottomOfLog();
@@ -546,6 +548,16 @@ class GUI_EXPORT QgsProcessingContextOptionsWidget : public QgsPanelWidget, priv
546548
*/
547549
QgsFeatureRequest::InvalidGeometryCheck invalidGeometryCheck() const;
548550

551+
/**
552+
* Returns the distance unit selected in the widget.
553+
*/
554+
Qgis::DistanceUnit distanceUnit() const;
555+
556+
/**
557+
* Returns the area unit selected in the widget.
558+
*/
559+
Qgis::AreaUnit areaUnit() const;
560+
549561
};
550562

551563
#endif

‎src/ui/processing/qgsprocessingcontextoptionsbase.ui

Lines changed: 38 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -47,14 +47,14 @@
4747
</rect>
4848
</property>
4949
<layout class="QGridLayout" name="gridLayout" columnstretch="0,0">
50-
<item row="1" column="0">
51-
<widget class="QLabel" name="label">
52-
<property name="text">
53-
<string>Invalid feature filtering</string>
50+
<item row="1" column="1">
51+
<widget class="QComboBox" name="mComboInvalidFeatureFiltering">
52+
<property name="toolTip">
53+
<string>If set, allows the default method for handling features with invalid geometries to be overridden</string>
5454
</property>
5555
</widget>
5656
</item>
57-
<item row="2" column="0">
57+
<item row="3" column="0">
5858
<spacer name="verticalSpacer">
5959
<property name="orientation">
6060
<enum>Qt::Vertical</enum>
@@ -67,11 +67,40 @@
6767
</property>
6868
</spacer>
6969
</item>
70-
<item row="1" column="1">
71-
<widget class="QComboBox" name="mComboInvalidFeatureFiltering">
72-
<property name="toolTip">
73-
<string>If set, allows the default method for handling features with invalid geometries to be overridden</string>
70+
<item row="1" column="0">
71+
<widget class="QLabel" name="label">
72+
<property name="text">
73+
<string>Invalid feature filtering</string>
74+
</property>
75+
</widget>
76+
</item>
77+
<item row="2" column="0" colspan="2">
78+
<widget class="QGroupBox" name="groupBox">
79+
<property name="title">
80+
<string>Calculation Settings</string>
7481
</property>
82+
<layout class="QGridLayout" name="gridLayout_2">
83+
<item row="0" column="0">
84+
<widget class="QLabel" name="label_2">
85+
<property name="text">
86+
<string>Distance units</string>
87+
</property>
88+
</widget>
89+
</item>
90+
<item row="0" column="1">
91+
<widget class="QComboBox" name="mDistanceUnitsCombo"/>
92+
</item>
93+
<item row="1" column="0">
94+
<widget class="QLabel" name="label_3">
95+
<property name="text">
96+
<string>Area units</string>
97+
</property>
98+
</widget>
99+
</item>
100+
<item row="1" column="1">
101+
<widget class="QComboBox" name="mAreaUnitsCombo"/>
102+
</item>
103+
</layout>
75104
</widget>
76105
</item>
77106
</layout>

0 commit comments

Comments
 (0)
Please sign in to comment.