Skip to content

Commit

Permalink
Fix trust parameter not saved and not read
Browse files Browse the repository at this point in the history
  • Loading branch information
troopa81 authored and nyalldawson committed Mar 5, 2023
1 parent dffb541 commit 3044b1c
Show file tree
Hide file tree
Showing 3 changed files with 49 additions and 11 deletions.
28 changes: 18 additions & 10 deletions src/core/project/qgsproject.cpp
Expand Up @@ -532,7 +532,11 @@ void QgsProject::setFlags( Qgis::ProjectFlags flags )
}
}

mFlags = flags;
if ( mFlags != flags )
{
mFlags = flags;
setDirty( true );
}
}

void QgsProject::setFlag( Qgis::ProjectFlag flag, bool enabled )
Expand Down Expand Up @@ -1311,15 +1315,8 @@ bool QgsProject::addLayer( const QDomElement &layerElem, QList<QDomNode> &broken
switch ( layerType )
{
case QgsMapLayerType::VectorLayer:
{
mapLayer = std::make_unique<QgsVectorLayer>();
// apply specific settings to vector layer
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mapLayer.get() ) )
{
vl->setReadExtentFromXml( ( mFlags & Qgis::ProjectFlag::TrustStoredLayerStatistics ) || ( flags & Qgis::ProjectReadFlag::TrustLayerMetadata ) );
}
break;
}

case QgsMapLayerType::RasterLayer:
mapLayer = std::make_unique<QgsRasterLayer>();
Expand Down Expand Up @@ -1387,6 +1384,17 @@ bool QgsProject::addLayer( const QDomElement &layerElem, QList<QDomNode> &broken
profile.switchTask( tr( "Load layer source" ) );
const bool layerIsValid = mapLayer->readLayerXml( layerElem, context, layerFlags ) && mapLayer->isValid();

// apply specific settings to vector layer
if ( QgsVectorLayer *vl = qobject_cast<QgsVectorLayer *>( mapLayer.get() ) )
{
vl->setReadExtentFromXml( ( mFlags & Qgis::ProjectFlag::TrustStoredLayerStatistics ) || ( flags & Qgis::ProjectReadFlag::TrustLayerMetadata ) );
if ( vl->dataProvider() )
{
const bool evaluateDefaultValues = mFlags & Qgis::ProjectFlag::EvaluateDefaultValuesOnProviderSide;
vl->dataProvider()->setProviderProperty( QgsVectorDataProvider::EvaluateDefaultValues, evaluateDefaultValues );
}
}

profile.switchTask( tr( "Add layer to project" ) );
QList<QgsMapLayer *> newLayers;
newLayers << mapLayer.get();
Expand Down Expand Up @@ -1789,6 +1797,8 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
// get the map layers
profile.switchTask( tr( "Reading map layers" ) );

loadProjectFlags( doc.get() );

QList<QDomNode> brokenNodes;
const bool clean = _getMapLayers( *doc, brokenNodes, flags );

Expand Down Expand Up @@ -1829,8 +1839,6 @@ bool QgsProject::readProjectFile( const QString &filename, Qgis::ProjectReadFlag
profile.switchTask( tr( "Resolving references" ) );
mRootGroup->resolveReferences( this );

loadProjectFlags( doc.get() );

if ( !layerTreeElem.isNull() )
{
mRootGroup->readLayerOrderFromXml( layerTreeElem );
Expand Down
2 changes: 2 additions & 0 deletions src/core/providers/qgsdataprovider.h
Expand Up @@ -687,6 +687,8 @@ class CORE_EXPORT QgsDataProvider : public QObject
* \since QGIS 3.12
*/
virtual void reloadProviderData() {}

friend class TestQgsProject;
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsDataProvider::ReadFlags )
Expand Down
30 changes: 29 additions & 1 deletion tests/src/core/testqgsproject.cpp
Expand Up @@ -403,9 +403,37 @@ void TestQgsProject::testLayerFlags()
QgsProject prj2;
prj2.setFileName( f.fileName() );
QVERIFY( prj2.read() );
QgsMapLayer *layer = prj.mapLayer( layer2id );
QgsMapLayer *layer = prj2.mapLayer( layer2id );
QVERIFY( layer );
QVERIFY( !layer->flags().testFlag( QgsMapLayer::Removable ) );

// test setFlags modifies correctly existing layer settings
QVERIFY( !prj2.isDirty() );
prj2.setFlag( Qgis::ProjectFlag::TrustStoredLayerStatistics, true );
prj2.setFlag( Qgis::ProjectFlag::EvaluateDefaultValuesOnProviderSide, true );
QVERIFY( prj2.isDirty() );
QgsVectorLayer *vlayer = qobject_cast<QgsVectorLayer *>( prj2.mapLayer( layer2id ) );
QVERIFY( vlayer->readExtentFromXml() );
// vlayer doesn't have trust because it will be done for new layer or when reloading the project
// no need to set trust on a layer which has already loaded everything
QVERIFY( !vlayer->dataProvider()->mReadFlags.testFlag( QgsDataProvider::FlagTrustDataSource ) );
QVERIFY( vlayer->dataProvider()->providerProperty( QgsVectorDataProvider::EvaluateDefaultValues ).toBool() );

prj2.write();

// check reload of project sets the correct flags and layer properties
QgsProject prj3;
prj3.setFileName( f.fileName() );
QVERIFY( prj3.read() );
QVERIFY( prj3.flags().testFlag( Qgis::ProjectFlag::TrustStoredLayerStatistics ) );
QVERIFY( prj3.flags().testFlag( Qgis::ProjectFlag::EvaluateDefaultValuesOnProviderSide ) );
vlayer = qobject_cast<QgsVectorLayer *>( prj3.mapLayer( layer2id ) );
QVERIFY( vlayer );
QVERIFY( !vlayer->flags().testFlag( QgsMapLayer::Removable ) );
QVERIFY( !prj3.isDirty() );
QVERIFY( vlayer->readExtentFromXml() );
QVERIFY( vlayer->dataProvider()->mReadFlags.testFlag( QgsDataProvider::FlagTrustDataSource ) );
QVERIFY( vlayer->dataProvider()->providerProperty( QgsVectorDataProvider::EvaluateDefaultValues ).toBool() );
}

void TestQgsProject::testLocalFiles()
Expand Down

0 comments on commit 3044b1c

Please sign in to comment.