Skip to content

Commit

Permalink
[feature] Expose choice of distance unit in elevation profile settings
Browse files Browse the repository at this point in the history
menu

Allows users to change the distance unit for situations where the
map's default distance unit isn't appropriate
  • Loading branch information
nyalldawson committed May 29, 2023
1 parent ddc0012 commit 2d10520
Show file tree
Hide file tree
Showing 5 changed files with 188 additions and 36 deletions.
Expand Up @@ -221,6 +221,24 @@ Sets whether the distance and elevation scales are locked to each other.

.. seealso:: :py:func:`lockAxisScales`

.. versionadded:: 3.32
%End

Qgis::DistanceUnit distanceUnit() const;
%Docstring
Returns the distance unit used by the canvas.

.. seealso:: :py:func:`setDistanceUnit`

.. versionadded:: 3.32
%End

void setDistanceUnit( Qgis::DistanceUnit unit );
%Docstring
Sets the distance ``unit`` used by the canvas.

.. seealso:: :py:func:`distanceUnit`

.. versionadded:: 3.32
%End

Expand Down
56 changes: 56 additions & 0 deletions src/app/elevation/qgselevationprofilewidget.cpp
Expand Up @@ -345,6 +345,56 @@ QgsElevationProfileWidget::QgsElevationProfileWidget( const QString &name )
connect( mLockRatioAction, &QAction::toggled, this, &QgsElevationProfileWidget::axisScaleLockToggled );
mOptionsMenu->addAction( mLockRatioAction );

mDistanceUnitMenu = new QMenu( tr( "Distance Units" ), this );
QActionGroup *unitGroup = new QActionGroup( this );
for ( Qgis::DistanceUnit unit :
{
Qgis::DistanceUnit::Kilometers,
Qgis::DistanceUnit::Meters,
Qgis::DistanceUnit::Centimeters,
Qgis::DistanceUnit::Millimeters,
Qgis::DistanceUnit::Miles,
Qgis::DistanceUnit::NauticalMiles,
Qgis::DistanceUnit::Yards,
Qgis::DistanceUnit::Feet,
Qgis::DistanceUnit::Inches,
Qgis::DistanceUnit::Degrees,
} )
{
QString title;
if ( ( QgsGui::higFlags() & QgsGui::HigDialogTitleIsTitleCase ) )
{
title = QgsStringUtils::capitalize( QgsUnitTypes::toString( unit ), Qgis::Capitalization::TitleCase );
}
else
{
title = QgsUnitTypes::toString( unit );
}
QAction *action = new QAction( title );
action->setData( QVariant::fromValue( unit ) );
action->setCheckable( true );
action->setActionGroup( unitGroup );
connect( action, &QAction::toggled, this, [ = ]( bool active )
{
if ( active )
{
mCanvas->setDistanceUnit( unit );
}
} );
mDistanceUnitMenu->addAction( action );
}
connect( mDistanceUnitMenu, &QMenu::aboutToShow, this, [ = ]
{
for ( QAction *action : mDistanceUnitMenu->actions() )
{
if ( action->data().value< Qgis::DistanceUnit >() == mCanvas->distanceUnit() && !action->isChecked() )
action->setChecked( true );
}
} );

mOptionsMenu->addMenu( mDistanceUnitMenu );
mOptionsMenu->addSeparator();

mSettingsAction = new QgsElevationProfileWidgetSettingsAction( mOptionsMenu );

mSettingsAction->toleranceSpinBox()->setValue( settingTolerance->value() );
Expand Down Expand Up @@ -480,6 +530,12 @@ void QgsElevationProfileWidget::setMainCanvas( QgsMapCanvas *canvas )
mMapPointRubberBand->setSecondaryStrokeColor( QColor( 255, 255, 255, 100 ) );
mMapPointRubberBand->setColor( QColor( 0, 0, 0 ) );
mMapPointRubberBand->hide();

mCanvas->setDistanceUnit( mMainCanvas->mapSettings().destinationCrs().mapUnits() );
connect( mMainCanvas, &QgsMapCanvas::destinationCrsChanged, this, [ = ]
{
mCanvas->setDistanceUnit( mMainCanvas->mapSettings().destinationCrs().mapUnits() );
} );
}

void QgsElevationProfileWidget::cancelJobs()
Expand Down
1 change: 1 addition & 0 deletions src/app/elevation/qgselevationprofilewidget.h
Expand Up @@ -153,6 +153,7 @@ class QgsElevationProfileWidget : public QWidget
QAction *mNudgeLeftAction = nullptr;
QAction *mNudgeRightAction = nullptr;
QAction *mLockRatioAction = nullptr;
QMenu *mDistanceUnitMenu = nullptr;

QgsDockableWidgetHelper *mDockableWidgetHelper = nullptr;
std::unique_ptr< QgsMapToolProfileCurve > mCaptureCurveMapTool;
Expand Down

0 comments on commit 2d10520

Please sign in to comment.