Skip to content

Commit 4a67573

Browse files
committed
Merge pull request #1566 from mdouchin/debug_project_path_embedded_items
Fix #11109 (Write relative path in project XML for embedded groups and layers)
2 parents 99ff44c + 092b7fc commit 4a67573

File tree

5 files changed

+28
-22
lines changed

5 files changed

+28
-22
lines changed

src/app/qgisapp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9648,6 +9648,7 @@ void QgisApp::writeProject( QDomDocument &doc )
96489648

96499649
QgsLayerTreeNode* clonedRoot = QgsProject::instance()->layerTreeRoot()->clone();
96509650
QgsLayerTreeUtils::removeChildrenOfEmbeddedGroups( QgsLayerTree::toGroup( clonedRoot ) );
9651+
QgsLayerTreeUtils::updateEmbeddedGroupsProjectPath( QgsLayerTree::toGroup( clonedRoot ) ); // convert absolute paths to relative paths if required
96519652
QDomElement oldLegendElem = QgsLayerTreeUtils::writeOldLegend( doc, QgsLayerTree::toGroup( clonedRoot ),
96529653
mLayerTreeCanvasBridge->hasCustomLayerOrder(), mLayerTreeCanvasBridge->customLayerOrder() );
96539654
delete clonedRoot;

src/core/layertree/qgslayertreeutils.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,11 @@
1919

2020
#include "qgsvectorlayer.h"
2121

22+
#include "qgsproject.h"
23+
2224
#include <QDomElement>
2325

26+
2427
static void _readOldLegendGroup( const QDomElement& groupElem, QgsLayerTreeGroup* parent );
2528
static void _readOldLegendLayer( const QDomElement& layerElem, QgsLayerTreeGroup* parent );
2629

@@ -314,3 +317,22 @@ void QgsLayerTreeUtils::removeChildrenOfEmbeddedGroups( QgsLayerTreeGroup* group
314317
}
315318
}
316319
}
320+
321+
322+
void QgsLayerTreeUtils::updateEmbeddedGroupsProjectPath( QgsLayerTreeGroup* group )
323+
{
324+
foreach ( QgsLayerTreeNode* node, group->children() )
325+
{
326+
if ( !node->customProperty( "embedded_project" ).toString().isEmpty() )
327+
{
328+
// may change from absolute path to relative path
329+
QString newPath = QgsProject::instance()->writePath( node->customProperty( "embedded_project" ).toString() );
330+
node->setCustomProperty( "embedded_project", newPath );
331+
}
332+
333+
if ( QgsLayerTree::isGroup( node ) )
334+
{
335+
updateEmbeddedGroupsProjectPath( QgsLayerTree::toGroup( node ) );
336+
}
337+
}
338+
}

src/core/layertree/qgslayertreeutils.h

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,9 @@ class CORE_EXPORT QgsLayerTreeUtils
5858
//! Remove subtree of embedded groups. Useful when saving layer tree
5959
static void removeChildrenOfEmbeddedGroups( QgsLayerTreeGroup* group );
6060

61+
//! @note not available in python bindings
62+
static void updateEmbeddedGroupsProjectPath( QgsLayerTreeGroup* group );
63+
6164
};
6265

6366
#endif // QGSLAYERTREEUTILS_H

src/core/qgsproject.cpp

Lines changed: 2 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1003,24 +1003,6 @@ void QgsProject::loadEmbeddedNodes( QgsLayerTreeGroup* group )
10031003
}
10041004
}
10051005

1006-
void QgsProject::updateEmbeddedGroupsProjectPath( QgsLayerTreeGroup* group )
1007-
{
1008-
foreach ( QgsLayerTreeNode* node, group->children() )
1009-
{
1010-
if ( QgsLayerTree::isGroup( node ) )
1011-
{
1012-
if ( !node->customProperty( "embedded_project" ).toString().isEmpty() )
1013-
{
1014-
// may change from absolute path to relative path
1015-
QString newPath = writePath( node->customProperty( "embedded_project" ).toString() );
1016-
node->setCustomProperty( "embedded_project", newPath );
1017-
}
1018-
else
1019-
updateEmbeddedGroupsProjectPath( QgsLayerTree::toGroup( node ) );
1020-
}
1021-
}
1022-
}
1023-
10241006

10251007
bool QgsProject::read( QDomNode & layerNode )
10261008
{
@@ -1102,7 +1084,7 @@ bool QgsProject::write()
11021084
// write layer tree - make sure it is without embedded subgroups
11031085
QgsLayerTreeNode* clonedRoot = mRootGroup->clone();
11041086
QgsLayerTreeUtils::removeChildrenOfEmbeddedGroups( QgsLayerTree::toGroup( clonedRoot ) );
1105-
updateEmbeddedGroupsProjectPath( QgsLayerTree::toGroup( clonedRoot ) ); // convert absolute paths to relative paths if required
1087+
QgsLayerTreeUtils::updateEmbeddedGroupsProjectPath( QgsLayerTree::toGroup( clonedRoot ) ); // convert absolute paths to relative paths if required
11061088
clonedRoot->writeXML( qgisNode );
11071089
delete clonedRoot;
11081090

@@ -1716,6 +1698,7 @@ bool QgsProject::createEmbeddedLayer( const QString& layerId, const QString& pro
17161698

17171699
//does project store pathes absolute or relative?
17181700
bool useAbsolutePathes = true;
1701+
17191702
QDomElement propertiesElem = projectDocument.documentElement().firstChildElement( "properties" );
17201703
if ( !propertiesElem.isNull() )
17211704
{

src/core/qgsproject.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -361,9 +361,6 @@ class CORE_EXPORT QgsProject : public QObject
361361
//! @note not available in python bindings
362362
void loadEmbeddedNodes( QgsLayerTreeGroup* group );
363363

364-
//! @note not available in python bindings
365-
void updateEmbeddedGroupsProjectPath( QgsLayerTreeGroup* group );
366-
367364
signals:
368365
//! emitted when project is being read
369366
void readProject( const QDomDocument & );

0 commit comments

Comments
 (0)