Skip to content

Commit

Permalink
Avoid more needless project dirtying
Browse files Browse the repository at this point in the history
  • Loading branch information
nirvn committed Nov 21, 2018
1 parent 5171e4e commit 4e1d684
Show file tree
Hide file tree
Showing 6 changed files with 75 additions and 6 deletions.
Expand Up @@ -63,6 +63,7 @@ Copy constructor
%End


bool operator==( const QgsCoordinateTransformContext &rhs ) const;

void clear();
%Docstring
Expand Down
13 changes: 13 additions & 0 deletions src/core/qgscoordinatetransformcontext.cpp
Expand Up @@ -36,6 +36,19 @@ QgsCoordinateTransformContext &QgsCoordinateTransformContext::operator=( const Q
return *this;
}

bool QgsCoordinateTransformContext::operator==( const QgsCoordinateTransformContext &rhs ) const
{
if ( d == rhs.d )
return true;

d->mLock.lockForRead();
rhs.d->mLock.lockForRead();
bool equal = d->mSourceDestDatumTransforms == rhs.d->mSourceDestDatumTransforms;
d->mLock.unlock();
rhs.d->mLock.unlock();
return equal;
}

void QgsCoordinateTransformContext::clear()
{
d.detach();
Expand Down
1 change: 1 addition & 0 deletions src/core/qgscoordinatetransformcontext.h
Expand Up @@ -80,6 +80,7 @@ class CORE_EXPORT QgsCoordinateTransformContext
*/
QgsCoordinateTransformContext &operator=( const QgsCoordinateTransformContext &rhs ) SIP_SKIP;

bool operator==( const QgsCoordinateTransformContext &rhs ) const ;

/**
* Clears all stored transform information from the context.
Expand Down
30 changes: 25 additions & 5 deletions src/core/qgsproject.cpp
Expand Up @@ -278,6 +278,13 @@ QgsProjectProperty *addKey_( const QString &scope,
return nullptr;
}

/**
* Remove a given key
\param scope scope of key
\param key key name
\param rootProperty is the property from which to start adding
*/

void removeKey_( const QString &scope,
const QString &key,
Expand Down Expand Up @@ -628,6 +635,9 @@ QgsCoordinateReferenceSystem QgsProject::crs() const

void QgsProject::setCrs( const QgsCoordinateReferenceSystem &crs )
{
if ( crs == mCrs )
return;

mCrs = crs;
writeEntry( QStringLiteral( "SpatialRefSys" ), QStringLiteral( "/ProjectionsEnabled" ), crs.isValid() ? 1 : 0 );
setDirty( true );
Expand All @@ -645,7 +655,6 @@ QString QgsProject::ellipsoid() const
void QgsProject::setEllipsoid( const QString &ellipsoid )
{
writeEntry( QStringLiteral( "Measure" ), QStringLiteral( "/Ellipsoid" ), ellipsoid );
setDirty( true );
emit ellipsoidChanged( ellipsoid );
}

Expand All @@ -656,6 +665,9 @@ QgsCoordinateTransformContext QgsProject::transformContext() const

void QgsProject::setTransformContext( const QgsCoordinateTransformContext &context )
{
if ( context == mTransformContext )
return;

mTransformContext = context;
emit transformContextChanged();
}
Expand Down Expand Up @@ -848,7 +860,7 @@ void QgsProject::setSnappingConfig( const QgsSnappingConfig &snappingConfig )
return;

mSnappingConfig = snappingConfig;
setDirty();
setDirty( true );
emit snappingConfigChanged( mSnappingConfig );
}

Expand Down Expand Up @@ -2117,9 +2129,11 @@ bool QgsProject::readBoolEntry( const QString &scope, const QString &key, bool d

bool QgsProject::removeEntry( const QString &scope, const QString &key )
{
removeKey_( scope, key, mProperties );

setDirty( true );
if ( findKey_( scope, key, mProperties ) )
{
removeKey_( scope, key, mProperties );
setDirty( true );
}

return !findKey_( scope, key, mProperties );
}
Expand Down Expand Up @@ -2390,6 +2404,9 @@ bool QgsProject::evaluateDefaultValues() const

void QgsProject::setEvaluateDefaultValues( bool evaluateDefaultValues )
{
if ( evaluateDefaultValues == mEvaluateDefaultValues )
return;

const QMap<QString, QgsMapLayer *> layers = mapLayers();
QMap<QString, QgsMapLayer *>::const_iterator layerIt = layers.constBegin();
for ( ; layerIt != layers.constEnd(); ++layerIt )
Expand Down Expand Up @@ -2886,6 +2903,9 @@ const QgsProjectMetadata &QgsProject::metadata() const

void QgsProject::setMetadata( const QgsProjectMetadata &metadata )
{
if ( metadata == mMetadata )
return;

mMetadata = metadata;
emit metadataChanged();

Expand Down
13 changes: 13 additions & 0 deletions tests/src/python/test_qgscoordinatetransformcontext.py
Expand Up @@ -408,6 +408,19 @@ def testReadWriteSettings(self):
{('EPSG:4204', 'EPSG:4326'): QgsDatumTransform.TransformPair(source_id_1, dest_id_1),
('EPSG:4205', 'EPSG:4326'): QgsDatumTransform.TransformPair(source_id_2, dest_id_2)})

def testEqualOperator(self):
context1 = QgsCoordinateTransformContext()
context2 = QgsCoordinateTransformContext()
self.assertTrue(context1 == context2)

context1.addSourceDestinationDatumTransform(QgsCoordinateReferenceSystem('EPSG:3111'),
QgsCoordinateReferenceSystem('EPSG:4283'), 1, 2)
self.assertFalse(context1 == context2)

context2.addSourceDestinationDatumTransform(QgsCoordinateReferenceSystem('EPSG:3111'),
QgsCoordinateReferenceSystem('EPSG:4283'), 1, 2)
self.assertTrue(context1 == context2)


if __name__ == '__main__':
unittest.main()
23 changes: 22 additions & 1 deletion tests/src/python/test_qgsproject.py
Expand Up @@ -1129,7 +1129,7 @@ def testWriteEntry(self):
self.assertTrue(ok)
self.assertEqual(q, query)

def testWriteEntryDirtying(self):
def testDirtying(self):

project = QgsProject()

Expand All @@ -1148,6 +1148,27 @@ def testWriteEntryDirtying(self):
self.assertTrue(project.writeEntry('myscope', 'myentry', False))
self.assertTrue(project.isDirty())

# removing an existing entry should dirty the project
project.setDirty(False)
self.assertTrue(project.removeEntry('myscope', 'myentry'))
self.assertTrue(project.isDirty())

# removing a non-existing entry should _not_ dirty the project
project.setDirty(False)
self.assertTrue(project.removeEntry('myscope', 'myentry'))
self.assertFalse(project.isDirty())

# setting a project CRS with a new value should dirty the project
project.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
project.setDirty(False)
project.setCrs(QgsCoordinateReferenceSystem('EPSG:3148'))
self.assertTrue(project.isDirty())

# setting a project CRS with the same project CRS should not dirty the project
project.setDirty(False)
project.setCrs(QgsCoordinateReferenceSystem('EPSG:3148'))
self.assertFalse(project.isDirty())


if __name__ == '__main__':
unittest.main()

0 comments on commit 4e1d684

Please sign in to comment.