diff --git a/python/gui/qgsexpressionbuilderdialog.sip b/python/gui/qgsexpressionbuilderdialog.sip index 4761a65e5d6..1dcbbbcd7db 100644 --- a/python/gui/qgsexpressionbuilderdialog.sip +++ b/python/gui/qgsexpressionbuilderdialog.sip @@ -17,6 +17,11 @@ class QgsExpressionBuilderDialog : QDialog QString expressionText(); + /** Sets geometry calculator used in distance/area calculations. + * @note added in version 2.0 + */ + void setGeomCalculator( const QgsDistanceArea & da ); + protected: /** * Handle closing of the window diff --git a/python/gui/qgsexpressionbuilderwidget.sip b/python/gui/qgsexpressionbuilderwidget.sip index 31271d27920..c8b7f1f6bf7 100644 --- a/python/gui/qgsexpressionbuilderwidget.sip +++ b/python/gui/qgsexpressionbuilderwidget.sip @@ -84,6 +84,11 @@ class QgsExpressionBuilderWidget : QWidget void loadFieldNames( QMap fields ); + /** Sets geometry calculator used in distance/area calculations. + * @note added in version 2.0 + */ + void setGeomCalculator( const QgsDistanceArea & da ); + /** Gets the expression string that has been set in the expression area. * @returns The expression as a string. */ QString expressionText(); diff --git a/src/app/qgsattributeactiondialog.cpp b/src/app/qgsattributeactiondialog.cpp index 7a6554242c4..1e6734e61ab 100644 --- a/src/app/qgsattributeactiondialog.cpp +++ b/src/app/qgsattributeactiondialog.cpp @@ -23,6 +23,9 @@ back to QgsVectorLayer. #include "qgsattributeactiondialog.h" #include "qgsattributeaction.h" #include "qgsexpressionbuilderdialog.h" +#include "qgisapp.h" +#include "qgsproject.h" +#include "qgsmapcanvas.h" #include #include @@ -173,6 +176,13 @@ void QgsAttributeActionDialog::insertExpression() // display the expression builder QgsExpressionBuilderDialog dlg( mActions->layer(), selText, this ); dlg.setWindowTitle( tr( "Insert expression" ) ); + + QgsDistanceArea myDa; + myDa.setSourceCrs( mActions->layer()->crs().srsid() ); + myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); + myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + dlg.setGeomCalculator( myDa ); + if ( dlg.exec() == QDialog::Accepted ) { QString expression = dlg.expressionBuilder()->expressionText(); diff --git a/src/app/qgsattributedialog.cpp b/src/app/qgsattributedialog.cpp index 217790a9f13..64116dda212 100644 --- a/src/app/qgsattributedialog.cpp +++ b/src/app/qgsattributedialog.cpp @@ -18,6 +18,7 @@ #include "qgsfield.h" #include "qgslogger.h" #include "qgsmapcanvas.h" +#include "qgsproject.h" #include "qgsvectorlayer.h" #include "qgsvectordataprovider.h" #include "qgsuniquevaluerenderer.h" @@ -220,11 +221,10 @@ QgsAttributeDialog::QgsAttributeDialog( QgsVectorLayer *vl, QgsFeature *thepFeat { QgsDistanceArea myDa; - QSettings settings; myDa.setSourceCrs( vl->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); - myDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() ); + myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); for ( QgsFieldMap::const_iterator it = theFieldMap.begin(); it != theFieldMap.end(); ++it ) { diff --git a/src/app/qgsattributetabledialog.cpp b/src/app/qgsattributetabledialog.cpp index e25b26384d9..6153a5fa9fe 100644 --- a/src/app/qgsattributetabledialog.cpp +++ b/src/app/qgsattributetabledialog.cpp @@ -32,6 +32,7 @@ #include "qgssearchquerybuilder.h" #include "qgslogger.h" #include "qgsmapcanvas.h" +#include "qgsproject.h" #include "qgsfieldcalculator.h" #include "qgsfeatureaction.h" #include "qgsattributeaction.h" @@ -538,11 +539,10 @@ void QgsAttributeTableDialog::doSearch( QString searchString ) { QgsDistanceArea myDa; - QSettings settings; myDa.setSourceCrs( mLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); - myDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() ); + myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); // parse search string and build parsed tree QgsExpression search( searchString ); diff --git a/src/app/qgsfieldcalculator.cpp b/src/app/qgsfieldcalculator.cpp index 39a860ef319..40687ba7064 100644 --- a/src/app/qgsfieldcalculator.cpp +++ b/src/app/qgsfieldcalculator.cpp @@ -18,6 +18,7 @@ #include "qgsdistancearea.h" #include "qgsexpression.h" #include "qgsmapcanvas.h" +#include "qgsproject.h" #include "qgsvectordataprovider.h" #include "qgsvectorlayer.h" @@ -85,11 +86,10 @@ void QgsFieldCalculator::accept() // Set up QgsDistanceArea each time we (re-)calculate QgsDistanceArea myDa; - QSettings settings; myDa.setSourceCrs( mVectorLayer->crs().srsid() ); myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); - myDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() ); + myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); QString calcString = builder->expressionText(); diff --git a/src/app/qgslabelinggui.cpp b/src/app/qgslabelinggui.cpp index 73e9e1f3050..e293f0d2b8c 100644 --- a/src/app/qgslabelinggui.cpp +++ b/src/app/qgslabelinggui.cpp @@ -25,7 +25,8 @@ #include "qgslabelengineconfigdialog.h" #include "qgsexpressionbuilderdialog.h" #include "qgsexpression.h" -#include "qgsmapcanvas.h" +#include "qgisapp.h" +#include "qgsproject.h" #include "qgscharacterselectdialog.h" #include @@ -894,6 +895,13 @@ void QgsLabelingGui::showExpressionDialog() { QgsExpressionBuilderDialog dlg( mLayer, cboFieldName->currentText() , this ); dlg.setWindowTitle( tr( "Expression based label" ) ); + + QgsDistanceArea myDa; + myDa.setSourceCrs( mLayer->crs().srsid() ); + myDa.setEllipsoidalMode( QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); + myDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); + dlg.setGeomCalculator( myDa ); + if ( dlg.exec() == QDialog::Accepted ) { QString expression = dlg.expressionText(); diff --git a/src/app/qgsmaptoolidentify.cpp b/src/app/qgsmaptoolidentify.cpp index b8506fb505a..c92f981f17c 100644 --- a/src/app/qgsmaptoolidentify.cpp +++ b/src/app/qgsmaptoolidentify.cpp @@ -214,7 +214,8 @@ bool QgsMapToolIdentify::identifyVectorLayer( QgsVectorLayer *layer, int x, int // load identify radius from settings QSettings settings; double identifyValue = settings.value( "/Map/identifyRadius", QGis::DEFAULT_IDENTIFY_RADIUS ).toDouble(); - QString ellipsoid = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString(); + + QString ellipsoid = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ); if ( identifyValue <= 0.0 ) identifyValue = QGis::DEFAULT_IDENTIFY_RADIUS; diff --git a/src/app/qgsmaptoolmeasureangle.cpp b/src/app/qgsmaptoolmeasureangle.cpp index 33a7532d97b..d9cf3aa2bf4 100644 --- a/src/app/qgsmaptoolmeasureangle.cpp +++ b/src/app/qgsmaptoolmeasureangle.cpp @@ -19,6 +19,7 @@ #include "qgslogger.h" #include "qgsmapcanvas.h" #include "qgsmaptopixel.h" +#include "qgsproject.h" #include "qgsrubberband.h" #include #include @@ -182,7 +183,7 @@ void QgsMapToolMeasureAngle::updateSettings() void QgsMapToolMeasureAngle::configureDistanceArea() { QSettings settings; - QString ellipsoidId = settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString(); + QString ellipsoidId = QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ); mDa.setSourceCrs( mCanvas->mapRenderer()->destinationCrs().srsid() ); mDa.setEllipsoid( ellipsoidId ); // Only use ellipsoidal calculation when project wide transformation is enabled. diff --git a/src/app/qgsmeasuredialog.cpp b/src/app/qgsmeasuredialog.cpp index f7dcaddfdd0..538b3cfc3bf 100644 --- a/src/app/qgsmeasuredialog.cpp +++ b/src/app/qgsmeasuredialog.cpp @@ -22,6 +22,7 @@ #include "qgsdistancearea.h" #include "qgsmapcanvas.h" #include "qgsmaprenderer.h" +#include "qgsproject.h" #include "qgscoordinatereferencesystem.h" #include @@ -60,7 +61,7 @@ void QgsMeasureDialog::updateSettings() mDisplayUnits = QGis::fromLiteral( settings.value( "/qgis/measure/displayunits", QGis::toLiteral( QGis::Meters ) ).toString() ); // Configure QgsDistanceArea mDa.setSourceCrs( mTool->canvas()->mapRenderer()->destinationCrs().srsid() ); - mDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() ); + mDa.setEllipsoid( QgsProject::instance()->readEntry( "Measure", "/Ellipsoid", GEO_NONE ) ); // Only use ellipsoidal calculation when project wide transformation is enabled. if ( mTool->canvas()->mapRenderer()->hasCrsTransformEnabled() ) { diff --git a/src/app/qgsprojectproperties.cpp b/src/app/qgsprojectproperties.cpp index 97a07d9b546..198398a505e 100644 --- a/src/app/qgsprojectproperties.cpp +++ b/src/app/qgsprojectproperties.cpp @@ -59,6 +59,9 @@ const char * QgsProjectProperties::GEO_NONE_DESC = QT_TRANSLATE_NOOP( "QgsOption QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *parent, Qt::WFlags fl ) : QDialog( parent, fl ) , mMapCanvas( mapCanvas ) + , mEllipsoidList() + , mEllipsoidIndex( 0 ) + { setupUi( this ); connect( buttonBox, SIGNAL( accepted() ), this, SLOT( accept() ) ); @@ -114,7 +117,6 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa QgsDebugMsg( "Setting upp ellipsoid" ); - mEllipsoidIndex = 0; populateEllipsoidList(); // Reading ellipsoid from setttings @@ -138,6 +140,7 @@ QgsProjectProperties::QgsProjectProperties( QgsMapCanvas* mapCanvas, QWidget *pa updateEllipsoidUI( myIndex ); + int dp = QgsProject::instance()->readNumEntry( "PositionPrecision", "/DecimalPlaces" ); spinBoxDP->setValue( dp ); @@ -553,12 +556,12 @@ void QgsProjectProperties::apply() minor = QLocale::system().toDouble( leSemiMinor->text() ); } QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", QString( "PARAMETER:%1:%2" ) - .arg( major, 0, 'g', 17 ) - .arg( minor, 0, 'g', 17 ) ); + .arg( major, 0, 'g', 17 ) + .arg( minor, 0, 'g', 17 ) ); } else { - QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", mEllipsoidList[ mEllipsoidIndex ].acronym ); + QgsProject::instance()->writeEntry( "Measure", "/Ellipsoid", mEllipsoidList[ mEllipsoidIndex ].acronym ); } //set the color for selections @@ -1395,6 +1398,11 @@ void QgsProjectProperties::populateEllipsoidList() void QgsProjectProperties::updateEllipsoidUI( int newIndex ) { + // Just return if the list isn't populated yet + if ( mEllipsoidList.isEmpty() ) + { + return; + } // Called whenever settings change, adjusts the UI accordingly // Pre-select current ellipsoid diff --git a/src/gui/qgsexpressionbuilderdialog.cpp b/src/gui/qgsexpressionbuilderdialog.cpp index 479d31acf69..aac1fbefbaf 100644 --- a/src/gui/qgsexpressionbuilderdialog.cpp +++ b/src/gui/qgsexpressionbuilderdialog.cpp @@ -55,3 +55,9 @@ void QgsExpressionBuilderDialog::closeEvent( QCloseEvent *event ) QSettings settings; settings.setValue( "/Windows/ExpressionBuilderDialog/geometry", saveGeometry() ); } + +void QgsExpressionBuilderDialog::setGeomCalculator( const QgsDistanceArea & da ) +{ + // Store in child widget only. + builder->setGeomCalculator( da ); +} diff --git a/src/gui/qgsexpressionbuilderdialog.h b/src/gui/qgsexpressionbuilderdialog.h index 04088eb35ec..dae9d9ff8d5 100644 --- a/src/gui/qgsexpressionbuilderdialog.h +++ b/src/gui/qgsexpressionbuilderdialog.h @@ -17,6 +17,7 @@ #define QGSEXPRESSIONBUILDERDIALOG_H #include +#include "qgsdistancearea.h" #include "ui_qgsexpressionbuilderdialogbase.h" /** A generic dialog for building expression strings @@ -34,6 +35,11 @@ class GUI_EXPORT QgsExpressionBuilderDialog : public QDialog, private Ui::QgsExp QString expressionText(); + /** Sets geometry calculator used in distance/area calculations. + * @note added in version 2.0 + */ + void setGeomCalculator( const QgsDistanceArea & da ); + protected: /** * Handle closing of the window diff --git a/src/gui/qgsexpressionbuilderwidget.cpp b/src/gui/qgsexpressionbuilderwidget.cpp index a538563787e..45b1c1477c0 100644 --- a/src/gui/qgsexpressionbuilderwidget.cpp +++ b/src/gui/qgsexpressionbuilderwidget.cpp @@ -242,8 +242,7 @@ bool QgsExpressionBuilderWidget::isExpressionValid() void QgsExpressionBuilderWidget::setGeomCalculator( const QgsDistanceArea & da ) { - Q_UNUSED( da ); - // TODO! FIXME!!! + mDa = da; } QString QgsExpressionBuilderWidget::expressionText() @@ -278,16 +277,8 @@ void QgsExpressionBuilderWidget::on_txtExpressionString_textChanged() if ( mLayer ) { - // Only set ellipsoid if we have layer... - QgsDistanceArea myDa; - QSettings settings; - - myDa.setEllipsoid( settings.value( "/qgis/measure/ellipsoid", GEO_NONE ).toString() ); - myDa.setSourceCrs( mLayer->crs().srsid() ); - // myDa.setEllipsoidalMode(QgisApp::instance()->mapCanvas()->mapRenderer()->hasCrsTransformEnabled() ); - myDa.setEllipsoidalMode( false ); - - exp.setGeomCalculator( myDa ); + // Only set calculator if we have layer, else use default. + exp.setGeomCalculator( mDa ); if ( !mFeature.isValid() ) { @@ -425,12 +416,12 @@ QString QgsExpressionBuilderWidget::loadFunctionHelp( QgsExpressionItem* express return ""; QString helpContents; - // Return the function help that is set for the function if there is one. + // Return the function help that is set for the function if there is one. if ( !expressionItem->getHelpText().isEmpty() ) { - QString myStyle = QgsApplication::reportStyleSheet(); - helpContents = "" + expressionItem->getHelpText() + ""; - return helpContents; + QString myStyle = QgsApplication::reportStyleSheet(); + helpContents = "" + expressionItem->getHelpText() + ""; + return helpContents; } // set up the path to the help file QString helpFilesPath = QgsApplication::pkgDataPath() + "/resources/function_help/"; diff --git a/src/gui/qgsexpressionbuilderwidget.h b/src/gui/qgsexpressionbuilderwidget.h index 5c95628ffb3..a7c2e1e649c 100644 --- a/src/gui/qgsexpressionbuilderwidget.h +++ b/src/gui/qgsexpressionbuilderwidget.h @@ -123,7 +123,8 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp void loadFieldNames( QgsFieldMap fields ); - /** Sets geometry calculator in order to get the measurements correct. + /** Sets geometry calculator used in distance/area calculations. + * @note added in version 2.0 */ void setGeomCalculator( const QgsDistanceArea & da ); @@ -181,6 +182,7 @@ class GUI_EXPORT QgsExpressionBuilderWidget : public QWidget, private Ui::QgsExp QgsFeature mFeature; QgsExpressionHighlighter* highlighter; bool mExpressionValid; + QgsDistanceArea mDa; }; #endif // QGSEXPRESSIONBUILDER_H