Skip to content

Commit

Permalink
Merge pull request #34311 from pblottiere/fix_embedded_layer_read
Browse files Browse the repository at this point in the history
Turn relative path into absolute path for reading embedded projects.
  • Loading branch information
pblottiere committed Feb 18, 2020
2 parents 38fb7da + 930d479 commit a3c08ad
Show file tree
Hide file tree
Showing 4 changed files with 25 additions and 5 deletions.
13 changes: 9 additions & 4 deletions src/core/qgsproject.cpp
Expand Up @@ -1005,7 +1005,7 @@ bool QgsProject::_getMapLayers( const QDomDocument &doc, QList<QDomNode> &broken

if ( element.attribute( QStringLiteral( "embedded" ) ) == QLatin1String( "1" ) )
{
createEmbeddedLayer( element.attribute( QStringLiteral( "id" ) ), readPath( element.attribute( QStringLiteral( "project" ) ) ), brokenNodes, flags );
createEmbeddedLayer( element.attribute( QStringLiteral( "id" ) ), readPath( element.attribute( QStringLiteral( "project" ) ) ), brokenNodes, true, flags );
}
else
{
Expand Down Expand Up @@ -1585,9 +1585,9 @@ bool QgsProject::readProjectFile( const QString &filename, QgsProject::ReadFlags
}


void QgsProject::loadEmbeddedNodes( QgsLayerTreeGroup *group, QgsProject::ReadFlags flags )
bool QgsProject::loadEmbeddedNodes( QgsLayerTreeGroup *group, QgsProject::ReadFlags flags )
{

bool valid = true;
const auto constChildren = group->children();
for ( QgsLayerTreeNode *child : constChildren )
{
Expand Down Expand Up @@ -1621,11 +1621,16 @@ void QgsProject::loadEmbeddedNodes( QgsLayerTreeGroup *group, QgsProject::ReadFl
if ( child->customProperty( QStringLiteral( "embedded" ) ).toInt() )
{
QList<QDomNode> brokenNodes;
createEmbeddedLayer( QgsLayerTree::toLayer( child )->layerId(), child->customProperty( QStringLiteral( "embedded_project" ) ).toString(), brokenNodes, flags );
if ( ! createEmbeddedLayer( QgsLayerTree::toLayer( child )->layerId(), readPath( child->customProperty( QStringLiteral( "embedded_project" ) ).toString() ), brokenNodes, true, flags ) )
{
valid = valid && false;
}
}
}

}

return valid;
}

QVariantMap QgsProject::customVariables() const
Expand Down
4 changes: 3 additions & 1 deletion src/core/qgsproject.h
Expand Up @@ -1749,7 +1749,7 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera
* The optional \a flags argument can be used to control layer reading behavior.
* \note not available in Python bindings
*/
void loadEmbeddedNodes( QgsLayerTreeGroup *group, QgsProject::ReadFlags flags = nullptr ) SIP_SKIP;
bool loadEmbeddedNodes( QgsLayerTreeGroup *group, QgsProject::ReadFlags flags = nullptr ) SIP_SKIP;

//! Read .qgs file
bool readProjectFile( const QString &filename, QgsProject::ReadFlags flags = nullptr );
Expand Down Expand Up @@ -1849,6 +1849,8 @@ class CORE_EXPORT QgsProject : public QObject, public QgsExpressionContextGenera

// Required by QGIS Server for switching the current project instance
friend class QgsConfigCache;

friend class TestQgsProject;
};

Q_DECLARE_OPERATORS_FOR_FLAGS( QgsProject::ReadFlags )
Expand Down
13 changes: 13 additions & 0 deletions tests/src/core/testqgsproject.cpp
Expand Up @@ -21,6 +21,7 @@
#include "qgspathresolver.h"
#include "qgsproject.h"
#include "qgssinglesymbolrenderer.h"
#include "qgslayertree.h"
#include "qgssettings.h"
#include "qgsunittypes.h"
#include "qgsvectorlayer.h"
Expand Down Expand Up @@ -485,6 +486,18 @@ void TestQgsProject::testEmbeddedLayerGroupFromQgz()

QCOMPARE( p1.layerIsEmbedded( points->id() ), path );
QCOMPARE( p1.layerIsEmbedded( polys->id() ), path );

// test embedded layers when origin project is something like ../XXX
path = QString( TEST_DATA_DIR ) + QStringLiteral( "/embedded_layers/project.qgz" );
QgsProject p2;
p2.read( path );

QgsMapLayer *points2 = p0.mapLayersByName( "points" )[0];
bool saveFlag = p2.mEmbeddedLayers[points2->id()].second;
QCOMPARE( saveFlag, true );

bool valid = p2.loadEmbeddedNodes( p2.layerTreeRoot() );
QCOMPARE( valid, true );
}

void TestQgsProject::projectSaveUser()
Expand Down
Binary file added tests/testdata/embedded_layers/project.qgz
Binary file not shown.

0 comments on commit a3c08ad

Please sign in to comment.