Skip to content

Commit

Permalink
[api] Add project's default coordinate display type functions +
Browse files Browse the repository at this point in the history
Q_PROPERTY for coordinate display type, distance units, and area units
  • Loading branch information
nirvn authored and nyalldawson committed Sep 5, 2022
1 parent 50c53c1 commit 1570643
Show file tree
Hide file tree
Showing 13 changed files with 215 additions and 70 deletions.
6 changes: 6 additions & 0 deletions python/core/auto_additions/qgis.py
Expand Up @@ -1916,3 +1916,9 @@
Qgis.RelationshipCardinality.__doc__ = 'Relationship cardinality.\n\n.. versionadded:: 3.28\n\n' + '* ``OneToOne``: ' + Qgis.RelationshipCardinality.OneToOne.__doc__ + '\n' + '* ``OneToMany``: ' + Qgis.RelationshipCardinality.OneToMany.__doc__ + '\n' + '* ``ManyToOne``: ' + Qgis.RelationshipCardinality.ManyToOne.__doc__ + '\n' + '* ``ManyToMany``: ' + Qgis.RelationshipCardinality.ManyToMany.__doc__
# --
Qgis.RelationshipCardinality.baseClass = Qgis
# monkey patching scoped based enum
Qgis.CoordinateDisplayType.Geographic.__doc__ = "Geographic"
Qgis.CoordinateDisplayType.MapUnits.__doc__ = "Map units"
Qgis.CoordinateDisplayType.__doc__ = 'Formats for displaying coordinates\n\n.. versionadded:: 3.28\n\n' + '* ``Geographic``: ' + Qgis.CoordinateDisplayType.Geographic.__doc__ + '\n' + '* ``MapUnits``: ' + Qgis.CoordinateDisplayType.MapUnits.__doc__
# --
Qgis.CoordinateDisplayType.baseClass = Qgis
17 changes: 17 additions & 0 deletions python/core/auto_generated/project/qgsproject.sip.in
Expand Up @@ -1761,6 +1761,23 @@ Emitted when the project ``ellipsoid`` is changed.
.. versionadded:: 3.0
%End

void distanceUnitsChanged();
%Docstring
Emitted when the default distance units changes.

.. seealso:: :py:func:`setDistanceUnits`

.. versionadded:: 3.28
%End

void areaUnitsChanged();
%Docstring
Emitted when the default area units changes.

.. seealso:: :py:func:`setAreaUnits`

.. versionadded:: 3.28
%End

void transformContextChanged();
%Docstring
Expand Down
Expand Up @@ -8,6 +8,7 @@




class QgsProjectDisplaySettings : QObject
{
%Docstring(signature="appended")
Expand All @@ -22,6 +23,7 @@ values such as map coordinates and bearings.
%End
public:


QgsProjectDisplaySettings( QObject *parent = 0 );
%Docstring
Constructor for QgsProjectDisplaySettings with the specified ``parent`` object.
Expand Down Expand Up @@ -74,6 +76,24 @@ Returns the project's geographic coordinate format, which controls how geographi
.. seealso:: :py:func:`setGeographicCoordinateFormat`

.. seealso:: :py:func:`geographicCoordinateFormatChanged`
%End

Qgis::CoordinateDisplayType coordinateType() const;
%Docstring
Returns default coordinate type for the project.

.. seealso:: :py:func:`setCoordinateType`

.. versionadded:: 3.28
%End

void setCoordinateType( Qgis::CoordinateDisplayType type );
%Docstring
Sets the default coordinate ``type`` for the project.

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

.. versionadded:: 3.28
%End

bool readXml( const QDomElement &element, const QgsReadWriteContext &context );
Expand Down Expand Up @@ -108,6 +128,17 @@ Emitted when the geographic coordinate format changes.
.. seealso:: :py:func:`setGeographicCoordinateFormat`

.. seealso:: :py:func:`geographicCoordinateFormat`
%End

void coordinateTypeChanged();
%Docstring
Emitted when the default coordinate format changes.

.. seealso:: :py:func:`setCoordinateType`

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

.. versionadded:: 3.28
%End

};
Expand Down
6 changes: 6 additions & 0 deletions python/core/auto_generated/qgis.sip.in
Expand Up @@ -1238,6 +1238,12 @@ The development version
ManyToMany,
};

enum class CoordinateDisplayType
{
Geographic,
MapUnits,
};

static const double DEFAULT_SEARCH_RADIUS_MM;

static const float DEFAULT_MAPTOPIXEL_THRESHOLD;
Expand Down
31 changes: 9 additions & 22 deletions src/app/qgsprojectproperties.cpp
Expand Up @@ -135,8 +135,8 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
// and connecting QDialogButtonBox's accepted/rejected signals to dialog's accept/reject slots
initOptionsBase( false );

mCoordinateDisplayComboBox->addItem( tr( "Map Units" ), MapUnits );
mCoordinateDisplayComboBox->addItem( tr( "Geographic (Latitude / Longitude)" ), Geographic );
mCoordinateDisplayComboBox->addItem( tr( "Map Units" ), static_cast<int>( Qgis::CoordinateDisplayType::MapUnits ) );
mCoordinateDisplayComboBox->addItem( tr( "Geographic (Latitude / Longitude)" ), static_cast<int>( Qgis::CoordinateDisplayType::Geographic ) );

mCoordinateOrderComboBox->addItem( tr( "Default" ), static_cast< int >( Qgis::CoordinateOrder::Default ) );
mCoordinateOrderComboBox->addItem( tr( "Easting, Northing (Longitude, Latitude)" ), static_cast< int >( Qgis::CoordinateOrder::XY ) );
Expand Down Expand Up @@ -382,11 +382,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
updateEllipsoidUI( index );
}

const QString format = QgsProject::instance()->readEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/DegreeFormat" ), QStringLiteral( "MU" ) );
if ( format == QLatin1String( "MU" ) )
mCoordinateDisplayComboBox->setCurrentIndex( mCoordinateDisplayComboBox->findData( MapUnits ) );
else
mCoordinateDisplayComboBox->setCurrentIndex( mCoordinateDisplayComboBox->findData( Geographic ) );
mCoordinateDisplayComboBox->setCurrentIndex( mCoordinateDisplayComboBox->findData( static_cast<int>( QgsProject::instance()->displaySettings()->coordinateType() ) ) );

const Qgis::CoordinateOrder axisOrder = qgsEnumKeyToValue( QgsProject::instance()->readEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/CoordinateOrder" ) ), Qgis::CoordinateOrder::Default );
mCoordinateOrderComboBox->setCurrentIndex( mCoordinateOrderComboBox->findData( static_cast< int >( axisOrder ) ) );
Expand Down Expand Up @@ -1188,26 +1184,17 @@ void QgsProjectProperties::apply()
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/Automatic" ), radAutomatic->isChecked() );
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/DecimalPlaces" ), spinBoxDP->value() );

QString degreeFormat;
switch ( static_cast< CoordinateFormat >( mCoordinateDisplayComboBox->currentData().toInt() ) )
{
case Geographic:
degreeFormat = QStringLiteral( "D" );
break;
case MapUnits:
degreeFormat = QStringLiteral( "MU" );
break;
}
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/DegreeFormat" ), degreeFormat );
const Qgis::CoordinateDisplayType coordinateType = static_cast< Qgis::CoordinateDisplayType >( mCoordinateDisplayComboBox->currentData().toInt() );
QgsProject::instance()->displaySettings()->setCoordinateType( coordinateType );
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/CoordinateOrder" ), qgsEnumValueToKey( static_cast< Qgis::CoordinateOrder >( mCoordinateOrderComboBox->currentData().toInt() ) ) );

// Announce that we may have a new display precision setting
emit displayPrecisionChanged();

QgsUnitTypes::DistanceUnit distanceUnits = static_cast< QgsUnitTypes::DistanceUnit >( mDistanceUnitsCombo->currentData().toInt() );
const QgsUnitTypes::DistanceUnit distanceUnits = static_cast< QgsUnitTypes::DistanceUnit >( mDistanceUnitsCombo->currentData().toInt() );
QgsProject::instance()->setDistanceUnits( distanceUnits );

QgsUnitTypes::AreaUnit areaUnits = static_cast< QgsUnitTypes::AreaUnit >( mAreaUnitsCombo->currentData().toInt() );
const QgsUnitTypes::AreaUnit areaUnits = static_cast< QgsUnitTypes::AreaUnit >( mAreaUnitsCombo->currentData().toInt() );
QgsProject::instance()->setAreaUnits( areaUnits );

QgsProject::instance()->setFilePathStorage( static_cast< Qgis::FilePathType >( cbxAbsolutePath->currentData().toInt() ) );
Expand Down Expand Up @@ -1859,7 +1846,7 @@ void QgsProjectProperties::updateGuiForMapUnits()
mAreaUnitsCombo->setItemText( idx, tr( "Unknown Units" ) );
mAreaUnitsCombo->setCurrentIndex( idx );
}
idx = mCoordinateDisplayComboBox->findData( MapUnits );
idx = mCoordinateDisplayComboBox->findData( static_cast<int>( Qgis::CoordinateDisplayType::MapUnits ) );
if ( idx >= 0 )
{
mCoordinateDisplayComboBox->setItemText( idx, tr( "Unknown Units" ) );
Expand All @@ -1878,7 +1865,7 @@ void QgsProjectProperties::updateGuiForMapUnits()
mCoordinateDisplayComboBox->setEnabled( true );

//make sure map units option is shown in coordinate display combo
int idx = mCoordinateDisplayComboBox->findData( MapUnits );
int idx = mCoordinateDisplayComboBox->findData( static_cast<int>( Qgis::CoordinateDisplayType::MapUnits ) );
QString mapUnitString = tr( "Map Units (%1)" ).arg( QgsUnitTypes::toString( units ) );
mCoordinateDisplayComboBox->setItemText( idx, mapUnitString );

Expand Down
7 changes: 0 additions & 7 deletions src/app/qgsprojectproperties.h
Expand Up @@ -206,13 +206,6 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
*/
void crsChanged( const QgsCoordinateReferenceSystem &crs );

//! Formats for displaying coordinates
enum CoordinateFormat
{
Geographic, //!< Geographic
MapUnits, //!< Show coordinates in map units
};

QgsRelationManagerDialog *mRelationManagerDlg = nullptr;
QgsMapCanvas *mMapCanvas = nullptr;
QgsStyle *mStyle = nullptr;
Expand Down
59 changes: 30 additions & 29 deletions src/core/project/qgsproject.cpp
Expand Up @@ -60,7 +60,6 @@
#include "qgsstyleentityvisitor.h"
#include "qgsprojectviewsettings.h"
#include "qgsprojectstylesettings.h"
#include "qgsprojectdisplaysettings.h"
#include "qgsprojecttimesettings.h"
#include "qgsvectortilelayer.h"
#include "qgsruntimeprofiler.h"
Expand Down Expand Up @@ -957,6 +956,14 @@ void QgsProject::clear()
context.readSettings();
setTransformContext( context );

//fallback to QGIS default measurement unit
bool ok = false;
const QgsUnitTypes::DistanceUnit distanceUnit = QgsUnitTypes::decodeDistanceUnit( mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString(), &ok );
setDistanceUnits( ok ? distanceUnit : QgsUnitTypes::DistanceMeters );
ok = false;
const QgsUnitTypes::AreaUnit areaUnits = QgsUnitTypes::decodeAreaUnit( mSettings.value( QStringLiteral( "/qgis/measure/areaunits" ) ).toString(), &ok );
setAreaUnits( ok ? areaUnits : QgsUnitTypes::AreaSquareMeters );

mEmbeddedLayers.clear();
mRelationManager->clear();
mAnnotationManager->clear();
Expand Down Expand Up @@ -999,10 +1006,6 @@ void QgsProject::clear()
const bool defaultRelativePaths = mSettings.value( QStringLiteral( "/qgis/defaultProjectPathsRelative" ), true ).toBool();
setFilePathStorage( defaultRelativePaths ? Qgis::FilePathType::Relative : Qgis::FilePathType::Absolute );

//copy default units to project
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString() );
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), mSettings.value( QStringLiteral( "/qgis/measure/areaunits" ) ).toString() );

int red = mSettings.value( QStringLiteral( "qgis/default_canvas_color_red" ), 255 ).toInt();
int green = mSettings.value( QStringLiteral( "qgis/default_canvas_color_green" ), 255 ).toInt();
int blue = mSettings.value( QStringLiteral( "qgis/default_canvas_color_blue" ), 255 ).toInt();
Expand Down Expand Up @@ -1646,6 +1649,15 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorAlphaPart" ), 255 ) );
setSelectionColor( selectionColor );


const QString distanceUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QString() );
if ( !distanceUnitString.isEmpty() )
setDistanceUnits( QgsUnitTypes::decodeDistanceUnit( distanceUnitString ) );

const QString areaUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QString() );
if ( !areaUnitString.isEmpty() )
setAreaUnits( QgsUnitTypes::decodeAreaUnit( areaUnitString ) );

QgsReadWriteContext context;
context.setPathResolver( pathResolver() );
context.setProjectTranslator( this );
Expand Down Expand Up @@ -2724,6 +2736,9 @@ bool QgsProject::writeProjectFile( const QString &filename )
writeEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorBluePart" ), mSelectionColor.blue() );
writeEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorAlphaPart" ), mSelectionColor.alpha() );

writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QgsUnitTypes::encodeUnit( mDistanceUnits ) );
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QgsUnitTypes::encodeUnit( mAreaUnits ) );

// now add the optional extra properties
#if 0
dump_( mProperties );
Expand Down Expand Up @@ -3371,38 +3386,24 @@ bool QgsProject::topologicalEditing() const
return readNumEntry( QStringLiteral( "Digitizing" ), QStringLiteral( "/TopologicalEditing" ), 0 );
}

QgsUnitTypes::DistanceUnit QgsProject::distanceUnits() const
{
const QString distanceUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QString() );
if ( !distanceUnitString.isEmpty() )
return QgsUnitTypes::decodeDistanceUnit( distanceUnitString );

//fallback to QGIS default measurement unit
bool ok = false;
const QgsUnitTypes::DistanceUnit type = QgsUnitTypes::decodeDistanceUnit( mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString(), &ok );
return ok ? type : QgsUnitTypes::DistanceMeters;
}

void QgsProject::setDistanceUnits( QgsUnitTypes::DistanceUnit unit )
{
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QgsUnitTypes::encodeUnit( unit ) );
}
if ( mDistanceUnits == unit )
return;

QgsUnitTypes::AreaUnit QgsProject::areaUnits() const
{
const QString areaUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QString() );
if ( !areaUnitString.isEmpty() )
return QgsUnitTypes::decodeAreaUnit( areaUnitString );
mDistanceUnits = unit;

//fallback to QGIS default area unit
bool ok = false;
const QgsUnitTypes::AreaUnit type = QgsUnitTypes::decodeAreaUnit( mSettings.value( QStringLiteral( "/qgis/measure/areaunits" ) ).toString(), &ok );
return ok ? type : QgsUnitTypes::AreaSquareMeters;
emit distanceUnitsChanged();
}

void QgsProject::setAreaUnits( QgsUnitTypes::AreaUnit unit )
{
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QgsUnitTypes::encodeUnit( unit ) );
if ( mAreaUnits == unit )
return;

mAreaUnits = unit;

emit areaUnitsChanged();
}

QString QgsProject::homePath() const
Expand Down
27 changes: 24 additions & 3 deletions src/core/project/qgsproject.h
Expand Up @@ -47,6 +47,7 @@
#include "qgsreadwritecontext.h"
#include "qgsprojectmetadata.h"
#include "qgstranslationcontext.h"
#include "qgsprojectdisplaysettings.h"
#include "qgsprojecttranslator.h"
#include "qgscolorscheme.h"
#include "qgssettings.h"
Expand Down Expand Up @@ -79,7 +80,6 @@ class QgsMapLayer;
class QgsBookmarkManager;
class QgsProjectViewSettings;
class QgsProjectStyleSettings;
class QgsProjectDisplaySettings;
class QgsProjectTimeSettings;
class QgsAnnotationLayer;
class QgsAttributeEditorContainer;
Expand Down Expand Up @@ -118,6 +118,9 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
Q_PROPERTY( QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged )
Q_PROPERTY( QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged )
Q_PROPERTY( bool topologicalEditing READ topologicalEditing WRITE setTopologicalEditing NOTIFY topologicalEditingChanged )
Q_PROPERTY( QgsUnitTypes::DistanceUnit distanceUnits READ distanceUnits WRITE setDistanceUnits NOTIFY distanceUnitsChanged )
Q_PROPERTY( QgsUnitTypes::AreaUnit areaUnits READ areaUnits WRITE setAreaUnits NOTIFY areaUnitsChanged )
Q_PROPERTY( QgsProjectDisplaySettings *displaySettings READ displaySettings CONSTANT )

public:

Expand Down Expand Up @@ -692,7 +695,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
* \see areaUnits()
* \since QGIS 2.14
*/
QgsUnitTypes::DistanceUnit distanceUnits() const;
QgsUnitTypes::DistanceUnit distanceUnits() const { return mDistanceUnits; }

/**
* Sets the default distance measurement units for the project.
Expand All @@ -707,7 +710,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
* \see distanceUnits()
* \since QGIS 2.14
*/
QgsUnitTypes::AreaUnit areaUnits() const;
QgsUnitTypes::AreaUnit areaUnits() const { return mAreaUnits; }

/**
* Sets the default area measurement units for the project.
Expand Down Expand Up @@ -1763,6 +1766,21 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
*/
void ellipsoidChanged( const QString &ellipsoid );

/**
* Emitted when the default distance units changes.
*
* \see setDistanceUnits()
* \since QGIS 3.28
*/
void distanceUnitsChanged();

/**
* Emitted when the default area units changes.
*
* \see setAreaUnits()
* \since QGIS 3.28
*/
void areaUnitsChanged();

/**
* Emitted when the project transformContext() is changed.
Expand Down Expand Up @@ -2262,6 +2280,9 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
QColor mBackgroundColor;
QColor mSelectionColor;

QgsUnitTypes::DistanceUnit mDistanceUnits = QgsUnitTypes::DistanceMeters;
QgsUnitTypes::AreaUnit mAreaUnits = QgsUnitTypes::AreaSquareMeters;

mutable QgsProjectPropertyKey mProperties; // property hierarchy, TODO: this shouldn't be mutable
Qgis::TransactionMode mTransactionMode = Qgis::TransactionMode::Disabled; // transaction grouped editing

Expand Down

0 comments on commit 1570643

Please sign in to comment.