Skip to content

Commit 1570643

Browse files
nirvnnyalldawson
authored andcommittedSep 5, 2022
[api] Add project's default coordinate display type functions +
Q_PROPERTY for coordinate display type, distance units, and area units
1 parent 50c53c1 commit 1570643

File tree

13 files changed

+215
-70
lines changed

13 files changed

+215
-70
lines changed
 

‎python/core/auto_additions/qgis.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1916,3 +1916,9 @@
19161916
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__
19171917
# --
19181918
Qgis.RelationshipCardinality.baseClass = Qgis
1919+
# monkey patching scoped based enum
1920+
Qgis.CoordinateDisplayType.Geographic.__doc__ = "Geographic"
1921+
Qgis.CoordinateDisplayType.MapUnits.__doc__ = "Map units"
1922+
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__
1923+
# --
1924+
Qgis.CoordinateDisplayType.baseClass = Qgis

‎python/core/auto_generated/project/qgsproject.sip.in

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1761,6 +1761,23 @@ Emitted when the project ``ellipsoid`` is changed.
17611761
.. versionadded:: 3.0
17621762
%End
17631763

1764+
void distanceUnitsChanged();
1765+
%Docstring
1766+
Emitted when the default distance units changes.
1767+
1768+
.. seealso:: :py:func:`setDistanceUnits`
1769+
1770+
.. versionadded:: 3.28
1771+
%End
1772+
1773+
void areaUnitsChanged();
1774+
%Docstring
1775+
Emitted when the default area units changes.
1776+
1777+
.. seealso:: :py:func:`setAreaUnits`
1778+
1779+
.. versionadded:: 3.28
1780+
%End
17641781

17651782
void transformContextChanged();
17661783
%Docstring

‎python/core/auto_generated/project/qgsprojectdisplaysettings.sip.in

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010

11+
1112
class QgsProjectDisplaySettings : QObject
1213
{
1314
%Docstring(signature="appended")
@@ -22,6 +23,7 @@ values such as map coordinates and bearings.
2223
%End
2324
public:
2425

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

7678
.. seealso:: :py:func:`geographicCoordinateFormatChanged`
79+
%End
80+
81+
Qgis::CoordinateDisplayType coordinateType() const;
82+
%Docstring
83+
Returns default coordinate type for the project.
84+
85+
.. seealso:: :py:func:`setCoordinateType`
86+
87+
.. versionadded:: 3.28
88+
%End
89+
90+
void setCoordinateType( Qgis::CoordinateDisplayType type );
91+
%Docstring
92+
Sets the default coordinate ``type`` for the project.
93+
94+
.. seealso:: :py:func:`coordinateType`
95+
96+
.. versionadded:: 3.28
7797
%End
7898

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

110130
.. seealso:: :py:func:`geographicCoordinateFormat`
131+
%End
132+
133+
void coordinateTypeChanged();
134+
%Docstring
135+
Emitted when the default coordinate format changes.
136+
137+
.. seealso:: :py:func:`setCoordinateType`
138+
139+
.. seealso:: :py:func:`coordinateType`
140+
141+
.. versionadded:: 3.28
111142
%End
112143

113144
};

‎python/core/auto_generated/qgis.sip.in

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1238,6 +1238,12 @@ The development version
12381238
ManyToMany,
12391239
};
12401240

1241+
enum class CoordinateDisplayType
1242+
{
1243+
Geographic,
1244+
MapUnits,
1245+
};
1246+
12411247
static const double DEFAULT_SEARCH_RADIUS_MM;
12421248

12431249
static const float DEFAULT_MAPTOPIXEL_THRESHOLD;

‎src/app/qgsprojectproperties.cpp

Lines changed: 9 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,8 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas *mapCanvas, QWidget *pa
135135
// and connecting QDialogButtonBox's accepted/rejected signals to dialog's accept/reject slots
136136
initOptionsBase( false );
137137

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

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

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

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

1191-
QString degreeFormat;
1192-
switch ( static_cast< CoordinateFormat >( mCoordinateDisplayComboBox->currentData().toInt() ) )
1193-
{
1194-
case Geographic:
1195-
degreeFormat = QStringLiteral( "D" );
1196-
break;
1197-
case MapUnits:
1198-
degreeFormat = QStringLiteral( "MU" );
1199-
break;
1200-
}
1201-
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/DegreeFormat" ), degreeFormat );
1187+
const Qgis::CoordinateDisplayType coordinateType = static_cast< Qgis::CoordinateDisplayType >( mCoordinateDisplayComboBox->currentData().toInt() );
1188+
QgsProject::instance()->displaySettings()->setCoordinateType( coordinateType );
12021189
QgsProject::instance()->writeEntry( QStringLiteral( "PositionPrecision" ), QStringLiteral( "/CoordinateOrder" ), qgsEnumValueToKey( static_cast< Qgis::CoordinateOrder >( mCoordinateOrderComboBox->currentData().toInt() ) ) );
12031190

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

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

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

12131200
QgsProject::instance()->setFilePathStorage( static_cast< Qgis::FilePathType >( cbxAbsolutePath->currentData().toInt() ) );
@@ -1859,7 +1846,7 @@ void QgsProjectProperties::updateGuiForMapUnits()
18591846
mAreaUnitsCombo->setItemText( idx, tr( "Unknown Units" ) );
18601847
mAreaUnitsCombo->setCurrentIndex( idx );
18611848
}
1862-
idx = mCoordinateDisplayComboBox->findData( MapUnits );
1849+
idx = mCoordinateDisplayComboBox->findData( static_cast<int>( Qgis::CoordinateDisplayType::MapUnits ) );
18631850
if ( idx >= 0 )
18641851
{
18651852
mCoordinateDisplayComboBox->setItemText( idx, tr( "Unknown Units" ) );
@@ -1878,7 +1865,7 @@ void QgsProjectProperties::updateGuiForMapUnits()
18781865
mCoordinateDisplayComboBox->setEnabled( true );
18791866

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

‎src/app/qgsprojectproperties.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -206,13 +206,6 @@ class APP_EXPORT QgsProjectProperties : public QgsOptionsDialogBase, private Ui:
206206
*/
207207
void crsChanged( const QgsCoordinateReferenceSystem &crs );
208208

209-
//! Formats for displaying coordinates
210-
enum CoordinateFormat
211-
{
212-
Geographic, //!< Geographic
213-
MapUnits, //!< Show coordinates in map units
214-
};
215-
216209
QgsRelationManagerDialog *mRelationManagerDlg = nullptr;
217210
QgsMapCanvas *mMapCanvas = nullptr;
218211
QgsStyle *mStyle = nullptr;

‎src/core/project/qgsproject.cpp

Lines changed: 30 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,6 @@
6060
#include "qgsstyleentityvisitor.h"
6161
#include "qgsprojectviewsettings.h"
6262
#include "qgsprojectstylesettings.h"
63-
#include "qgsprojectdisplaysettings.h"
6463
#include "qgsprojecttimesettings.h"
6564
#include "qgsvectortilelayer.h"
6665
#include "qgsruntimeprofiler.h"
@@ -957,6 +956,14 @@ void QgsProject::clear()
957956
context.readSettings();
958957
setTransformContext( context );
959958

959+
//fallback to QGIS default measurement unit
960+
bool ok = false;
961+
const QgsUnitTypes::DistanceUnit distanceUnit = QgsUnitTypes::decodeDistanceUnit( mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString(), &ok );
962+
setDistanceUnits( ok ? distanceUnit : QgsUnitTypes::DistanceMeters );
963+
ok = false;
964+
const QgsUnitTypes::AreaUnit areaUnits = QgsUnitTypes::decodeAreaUnit( mSettings.value( QStringLiteral( "/qgis/measure/areaunits" ) ).toString(), &ok );
965+
setAreaUnits( ok ? areaUnits : QgsUnitTypes::AreaSquareMeters );
966+
960967
mEmbeddedLayers.clear();
961968
mRelationManager->clear();
962969
mAnnotationManager->clear();
@@ -999,10 +1006,6 @@ void QgsProject::clear()
9991006
const bool defaultRelativePaths = mSettings.value( QStringLiteral( "/qgis/defaultProjectPathsRelative" ), true ).toBool();
10001007
setFilePathStorage( defaultRelativePaths ? Qgis::FilePathType::Relative : Qgis::FilePathType::Absolute );
10011008

1002-
//copy default units to project
1003-
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString() );
1004-
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), mSettings.value( QStringLiteral( "/qgis/measure/areaunits" ) ).toString() );
1005-
10061009
int red = mSettings.value( QStringLiteral( "qgis/default_canvas_color_red" ), 255 ).toInt();
10071010
int green = mSettings.value( QStringLiteral( "qgis/default_canvas_color_green" ), 255 ).toInt();
10081011
int blue = mSettings.value( QStringLiteral( "qgis/default_canvas_color_blue" ), 255 ).toInt();
@@ -1646,6 +1649,15 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
16461649
readNumEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorAlphaPart" ), 255 ) );
16471650
setSelectionColor( selectionColor );
16481651

1652+
1653+
const QString distanceUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QString() );
1654+
if ( !distanceUnitString.isEmpty() )
1655+
setDistanceUnits( QgsUnitTypes::decodeDistanceUnit( distanceUnitString ) );
1656+
1657+
const QString areaUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QString() );
1658+
if ( !areaUnitString.isEmpty() )
1659+
setAreaUnits( QgsUnitTypes::decodeAreaUnit( areaUnitString ) );
1660+
16491661
QgsReadWriteContext context;
16501662
context.setPathResolver( pathResolver() );
16511663
context.setProjectTranslator( this );
@@ -2724,6 +2736,9 @@ bool QgsProject::writeProjectFile( const QString &filename )
27242736
writeEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorBluePart" ), mSelectionColor.blue() );
27252737
writeEntry( QStringLiteral( "Gui" ), QStringLiteral( "/SelectionColorAlphaPart" ), mSelectionColor.alpha() );
27262738

2739+
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QgsUnitTypes::encodeUnit( mDistanceUnits ) );
2740+
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QgsUnitTypes::encodeUnit( mAreaUnits ) );
2741+
27272742
// now add the optional extra properties
27282743
#if 0
27292744
dump_( mProperties );
@@ -3371,38 +3386,24 @@ bool QgsProject::topologicalEditing() const
33713386
return readNumEntry( QStringLiteral( "Digitizing" ), QStringLiteral( "/TopologicalEditing" ), 0 );
33723387
}
33733388

3374-
QgsUnitTypes::DistanceUnit QgsProject::distanceUnits() const
3375-
{
3376-
const QString distanceUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QString() );
3377-
if ( !distanceUnitString.isEmpty() )
3378-
return QgsUnitTypes::decodeDistanceUnit( distanceUnitString );
3379-
3380-
//fallback to QGIS default measurement unit
3381-
bool ok = false;
3382-
const QgsUnitTypes::DistanceUnit type = QgsUnitTypes::decodeDistanceUnit( mSettings.value( QStringLiteral( "/qgis/measure/displayunits" ) ).toString(), &ok );
3383-
return ok ? type : QgsUnitTypes::DistanceMeters;
3384-
}
3385-
33863389
void QgsProject::setDistanceUnits( QgsUnitTypes::DistanceUnit unit )
33873390
{
3388-
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/DistanceUnits" ), QgsUnitTypes::encodeUnit( unit ) );
3389-
}
3391+
if ( mDistanceUnits == unit )
3392+
return;
33903393

3391-
QgsUnitTypes::AreaUnit QgsProject::areaUnits() const
3392-
{
3393-
const QString areaUnitString = readEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QString() );
3394-
if ( !areaUnitString.isEmpty() )
3395-
return QgsUnitTypes::decodeAreaUnit( areaUnitString );
3394+
mDistanceUnits = unit;
33963395

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

34033399
void QgsProject::setAreaUnits( QgsUnitTypes::AreaUnit unit )
34043400
{
3405-
writeEntry( QStringLiteral( "Measurement" ), QStringLiteral( "/AreaUnits" ), QgsUnitTypes::encodeUnit( unit ) );
3401+
if ( mAreaUnits == unit )
3402+
return;
3403+
3404+
mAreaUnits = unit;
3405+
3406+
emit areaUnitsChanged();
34063407
}
34073408

34083409
QString QgsProject::homePath() const

‎src/core/project/qgsproject.h

Lines changed: 24 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,7 @@
4747
#include "qgsreadwritecontext.h"
4848
#include "qgsprojectmetadata.h"
4949
#include "qgstranslationcontext.h"
50+
#include "qgsprojectdisplaysettings.h"
5051
#include "qgsprojecttranslator.h"
5152
#include "qgscolorscheme.h"
5253
#include "qgssettings.h"
@@ -79,7 +80,6 @@ class QgsMapLayer;
7980
class QgsBookmarkManager;
8081
class QgsProjectViewSettings;
8182
class QgsProjectStyleSettings;
82-
class QgsProjectDisplaySettings;
8383
class QgsProjectTimeSettings;
8484
class QgsAnnotationLayer;
8585
class QgsAttributeEditorContainer;
@@ -118,6 +118,9 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
118118
Q_PROPERTY( QColor backgroundColor READ backgroundColor WRITE setBackgroundColor NOTIFY backgroundColorChanged )
119119
Q_PROPERTY( QColor selectionColor READ selectionColor WRITE setSelectionColor NOTIFY selectionColorChanged )
120120
Q_PROPERTY( bool topologicalEditing READ topologicalEditing WRITE setTopologicalEditing NOTIFY topologicalEditingChanged )
121+
Q_PROPERTY( QgsUnitTypes::DistanceUnit distanceUnits READ distanceUnits WRITE setDistanceUnits NOTIFY distanceUnitsChanged )
122+
Q_PROPERTY( QgsUnitTypes::AreaUnit areaUnits READ areaUnits WRITE setAreaUnits NOTIFY areaUnitsChanged )
123+
Q_PROPERTY( QgsProjectDisplaySettings *displaySettings READ displaySettings CONSTANT )
121124

122125
public:
123126

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

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

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

1769+
/**
1770+
* Emitted when the default distance units changes.
1771+
*
1772+
* \see setDistanceUnits()
1773+
* \since QGIS 3.28
1774+
*/
1775+
void distanceUnitsChanged();
1776+
1777+
/**
1778+
* Emitted when the default area units changes.
1779+
*
1780+
* \see setAreaUnits()
1781+
* \since QGIS 3.28
1782+
*/
1783+
void areaUnitsChanged();
17661784

17671785
/**
17681786
* Emitted when the project transformContext() is changed.
@@ -2262,6 +2280,9 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
22622280
QColor mBackgroundColor;
22632281
QColor mSelectionColor;
22642282

2283+
QgsUnitTypes::DistanceUnit mDistanceUnits = QgsUnitTypes::DistanceMeters;
2284+
QgsUnitTypes::AreaUnit mAreaUnits = QgsUnitTypes::AreaSquareMeters;
2285+
22652286
mutable QgsProjectPropertyKey mProperties; // property hierarchy, TODO: this shouldn't be mutable
22662287
Qgis::TransactionMode mTransactionMode = Qgis::TransactionMode::Disabled; // transaction grouped editing
22672288

0 commit comments

Comments
 (0)
Please sign in to comment.