Skip to content

Commit

Permalink
Apply suggestions
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn authored and nyalldawson committed Sep 5, 2022
1 parent 2dae176 commit 6b071d3
Show file tree
Hide file tree
Showing 4 changed files with 107 additions and 37 deletions.
Expand Up @@ -111,6 +111,19 @@ Sets the coordinate custom CRS used when the project coordinate type is set to Q

.. seealso:: :py:func:`setCoordinateCustomCrs`

.. versionadded:: 3.28
%End

QgsCoordinateReferenceSystem coordinateCrs() const;
%Docstring
Returns the coordinate display CRS used derived from the coordinate type.

.. seealso:: :py:func:`coordinateType`

.. note::

if not parented to a project object, an invalid CRS will be returned.

.. versionadded:: 3.28
%End

Expand Down Expand Up @@ -167,6 +180,17 @@ Emitted when the coordinate custom CRS changes.

.. seealso:: :py:func:`coordinateCustomCrs`

.. versionadded:: 3.28
%End

void coordinateCrsChanged();
%Docstring
Emitted when the coordinate CRS changes.

.. seealso:: :py:func:`coordinateCrs`

.. seealso:: :py:func:`coordinateType`

.. versionadded:: 3.28
%End

Expand Down
50 changes: 44 additions & 6 deletions src/core/project/qgsprojectdisplaysettings.cpp
Expand Up @@ -30,7 +30,10 @@ QgsProjectDisplaySettings::QgsProjectDisplaySettings( QObject *parent )
, mBearingFormat( std::make_unique< QgsBearingNumericFormat >() )
, mGeographicCoordinateFormat( std::make_unique< QgsGeographicCoordinateNumericFormat >() )
{

if ( QgsProject *project = qobject_cast< QgsProject * >( parent ) )
{
connect( project, &QgsProject::crsChanged, this, &QgsProjectDisplaySettings::updateCoordinateCrs );
}
}

QgsProjectDisplaySettings::~QgsProjectDisplaySettings() = default;
Expand All @@ -44,6 +47,9 @@ void QgsProjectDisplaySettings::reset()
mCoordinateType = Qgis::CoordinateDisplayType::MapCrs;
mCoordinateCustomCrs = QgsCoordinateReferenceSystem( "EPSG:4326" );

mCoordinateCrs = QgsCoordinateReferenceSystem();
updateCoordinateCrs();

emit bearingFormatChanged();
emit geographicCoordinateFormatChanged();
emit coordinateTypeChanged();
Expand Down Expand Up @@ -78,6 +84,7 @@ void QgsProjectDisplaySettings::setCoordinateType( Qgis::CoordinateDisplayType t
return;

mCoordinateType = type;
updateCoordinateCrs();

emit coordinateTypeChanged();
}
Expand All @@ -89,9 +96,41 @@ void QgsProjectDisplaySettings::setCoordinateCustomCrs( const QgsCoordinateRefer

mCoordinateCustomCrs = crs;

if ( mCoordinateType == Qgis::CoordinateDisplayType::CustomCrs )
updateCoordinateCrs();

emit coordinateCustomCrsChanged();
}

void QgsProjectDisplaySettings::updateCoordinateCrs()
{
if ( QgsProject *project = qobject_cast< QgsProject * >( parent() ) )
{
const QgsCoordinateReferenceSystem projectCrs = project->crs();
QgsCoordinateReferenceSystem crs;
switch ( mCoordinateType )
{
case Qgis::CoordinateDisplayType::MapCrs:
crs = projectCrs;
break;

case Qgis::CoordinateDisplayType::MapGeographic:
crs = !projectCrs.isGeographic() ? projectCrs.toGeographicCrs() : projectCrs;
break;

case Qgis::CoordinateDisplayType::CustomCrs:
crs = mCoordinateCustomCrs;
break;
}

if ( mCoordinateCrs != crs )
{
mCoordinateCrs = crs;
emit coordinateCrsChanged();
}
}
}

bool QgsProjectDisplaySettings::readXml( const QDomElement &element, const QgsReadWriteContext &context )
{
{
Expand Down Expand Up @@ -139,7 +178,7 @@ bool QgsProjectDisplaySettings::readXml( const QDomElement &element, const QgsRe
{
if ( element.hasAttribute( QStringLiteral( "CoordinateType" ) ) )
{
mCoordinateType = static_cast<Qgis::CoordinateDisplayType>( element.attribute( QStringLiteral( "CoordinateType" ) ).toInt() );
setCoordinateType( qgsEnumKeyToValue( element.attribute( QStringLiteral( "CoordinateType" ), qgsEnumValueToKey( Qgis::CoordinateDisplayType::MapCrs ) ), Qgis::CoordinateDisplayType::MapCrs ) );
}
else if ( project )
{
Expand All @@ -148,15 +187,14 @@ bool QgsProjectDisplaySettings::readXml( const QDomElement &element, const QgsRe
{
if ( format != QStringLiteral( "MU" ) && !project->crs().isGeographic() )
{
mCoordinateType = Qgis::CoordinateDisplayType::CustomCrs;
setCoordinateType( Qgis::CoordinateDisplayType::CustomCrs );
}
else
{
mCoordinateType = Qgis::CoordinateDisplayType::MapCrs;
setCoordinateType( Qgis::CoordinateDisplayType::MapCrs );
}
}
}
emit coordinateTypeChanged();

QDomNodeList crsNodeList = element.elementsByTagName( QStringLiteral( "CoordinateCustomCrs" ) );
if ( !crsNodeList.isEmpty() )
Expand Down Expand Up @@ -186,7 +224,7 @@ QDomElement QgsProjectDisplaySettings::writeXml( QDomDocument &doc, const QgsRea
element.appendChild( geographicElement );
}

element.setAttribute( QStringLiteral( "CoordinateType" ), static_cast<int>( mCoordinateType ) );
element.setAttribute( QStringLiteral( "CoordinateType" ), qgsEnumValueToKey( mCoordinateType ) );
if ( mCoordinateCustomCrs.isValid() )
{
QDomElement crsElem = doc.createElement( QStringLiteral( "CoordinateCustomCrs" ) );
Expand Down
22 changes: 22 additions & 0 deletions src/core/project/qgsprojectdisplaysettings.h
Expand Up @@ -45,6 +45,8 @@ class CORE_EXPORT QgsProjectDisplaySettings : public QObject
public:

Q_PROPERTY( Qgis::CoordinateDisplayType coordinateType READ coordinateType WRITE setCoordinateType NOTIFY coordinateTypeChanged )
Q_PROPERTY( QgsCoordinateReferenceSystem coordinateCustomCrs READ coordinateCustomCrs WRITE setCoordinateCustomCrs NOTIFY coordinateCustomCrsChanged )
Q_PROPERTY( QgsCoordinateReferenceSystem coordinateCrs READ coordinateCrs NOTIFY coordinateCrsChanged )

/**
* Constructor for QgsProjectDisplaySettings with the specified \a parent object.
Expand Down Expand Up @@ -124,6 +126,14 @@ class CORE_EXPORT QgsProjectDisplaySettings : public QObject
*/
void setCoordinateCustomCrs( const QgsCoordinateReferenceSystem &crs );

/**
* Returns the coordinate display CRS used derived from the coordinate type.
* \see coordinateType()
* \note if not parented to a project object, an invalid CRS will be returned.
* \since QGIS 3.28
*/
QgsCoordinateReferenceSystem coordinateCrs() const { return mCoordinateCrs; }

/**
* Reads the settings's state from a DOM element.
* \see writeXml()
Expand Down Expand Up @@ -172,12 +182,24 @@ class CORE_EXPORT QgsProjectDisplaySettings : public QObject
*/
void coordinateCustomCrsChanged();

/**
* Emitted when the coordinate CRS changes.
*
* \see coordinateCrs()
* \see coordinateType()
* \since QGIS 3.28
*/
void coordinateCrsChanged();

private:
void updateCoordinateCrs();

std::unique_ptr< QgsBearingNumericFormat > mBearingFormat;
std::unique_ptr< QgsGeographicCoordinateNumericFormat > mGeographicCoordinateFormat;

Qgis::CoordinateDisplayType mCoordinateType = Qgis::CoordinateDisplayType::MapCrs;
QgsCoordinateReferenceSystem mCoordinateCustomCrs = QgsCoordinateReferenceSystem( QStringLiteral( "EPSG:4326" ) );
QgsCoordinateReferenceSystem mCoordinateCrs;

};

Expand Down
48 changes: 17 additions & 31 deletions src/core/qgscoordinateutils.cpp
Expand Up @@ -114,42 +114,28 @@ QString QgsCoordinateUtils::formatCoordinateForProject( QgsProject *project, con

const Qgis::CoordinateOrder axisOrder = qgsEnumKeyToValue( project->readEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/CoordinateOrder" ) ), Qgis::CoordinateOrder::Default );

QgsCoordinateReferenceSystem crs = destCrs;
QgsCoordinateReferenceSystem crs = project->displaySettings()->coordinateCrs();
if ( !crs.isValid() && !destCrs.isValid() )
{
return QString();
}
else if ( !crs.isValid() )
{
crs = destCrs;
}

QgsPointXY p = point;
bool isGeographic = false;
if ( project->displaySettings()->coordinateType() == Qgis::CoordinateDisplayType::MapGeographic )
const bool isGeographic = crs.isGeographic();
if ( destCrs != crs )
{
isGeographic = true;
if ( destCrs.isValid() && !destCrs.isGeographic() )
const QgsCoordinateTransform ct( destCrs, crs, project );
try
{
// use the associated geographic projection to the destination CRS.
crs = destCrs.toGeographicCrs();
const QgsCoordinateTransform ct( destCrs, crs, project );
try
{
p = ct.transform( point );
}
catch ( QgsCsException & )
{
return QString();
}
p = ct.transform( point );
}
}
else if ( project->displaySettings()->coordinateType() == Qgis::CoordinateDisplayType::CustomCrs )
{
crs = project->displaySettings()->coordinateCustomCrs();
if ( destCrs != crs )
catch ( QgsCsException & )
{
isGeographic = crs.isGeographic();
const QgsCoordinateTransform ct( destCrs, crs, project );
try
{
p = ct.transform( point );
}
catch ( QgsCsException & )
{
return QString();
}
return QString();
}
}

Expand Down

0 comments on commit 6b071d3

Please sign in to comment.