Skip to content

Commit 7aa24f6

Browse files
committedNov 7, 2017
[bugfix] Pass QgsReadWriteContext into project XML r/w
Or we miss the path resolver and we do not read/write relative paths correctly Fixes #17116
1 parent 8aa8c30 commit 7aa24f6

25 files changed

+97
-59
lines changed
 

‎python/core/composer/qgscomposeritemgroup.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88

99

1010

11+
1112
class QgsComposerItemGroup: QgsComposerItem
1213
{
1314
%Docstring

‎python/core/composer/qgscomposerobject.sip

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99

1010

1111

12+
1213
class QgsComposerObject: QObject, QgsExpressionContextGenerator
1314
{
1415
%Docstring

‎python/core/layertree/qgslayertree.sip

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ class QgsLayerTree : QgsLayerTreeGroup
122122
.. versionadded:: 3.0
123123
%End
124124

125-
static QgsLayerTree *readXml( QDomElement &element );
125+
static QgsLayerTree *readXml( QDomElement &element, const QgsReadWriteContext &context );
126126
%Docstring
127127
Load the layer tree from an XML element.
128128
It is not required that layers are loaded at this point.
@@ -141,7 +141,7 @@ class QgsLayerTree : QgsLayerTreeGroup
141141
.. versionadded:: 3.0
142142
%End
143143

144-
virtual void writeXml( QDomElement &parentElement );
144+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context );
145145

146146
virtual QgsLayerTree *clone() const /Factory/;
147147

‎python/core/layertree/qgslayertreegroup.sip

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -138,27 +138,27 @@ class QgsLayerTreeGroup : QgsLayerTreeNode
138138
:rtype: QgsLayerTreeGroup
139139
%End
140140

141-
static QgsLayerTreeGroup *readXml( QDomElement &element ) /Factory/;
141+
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
142142
%Docstring
143143
Read group (tree) from XML element <layer-tree-group> and return the newly created group (or null on error).
144144
Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
145145
:rtype: QgsLayerTreeGroup
146146
%End
147147

148-
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsProject *project ) /Factory/;
148+
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsProject *project, const QgsReadWriteContext &context ) /Factory/;
149149
%Docstring
150150
Read group (tree) from XML element <layer-tree-group> and return the newly created group (or null on error).
151151
Also resolves textual references to layers from the project (calls resolveReferences() internally).
152152
.. versionadded:: 3.0
153153
:rtype: QgsLayerTreeGroup
154154
%End
155155

156-
virtual void writeXml( QDomElement &parentElement );
156+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context );
157157
%Docstring
158158
Write group (tree) as XML element <layer-tree-group> and add it to the given parent element
159159
%End
160160

161-
void readChildrenFromXml( QDomElement &element );
161+
void readChildrenFromXml( QDomElement &element, const QgsReadWriteContext &context );
162162
%Docstring
163163
Read children from XML and append them to the group.
164164
Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.

‎python/core/layertree/qgslayertreelayer.sip

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -63,22 +63,22 @@ class QgsLayerTreeLayer : QgsLayerTreeNode
6363
.. versionadded:: 3.0
6464
%End
6565

66-
static QgsLayerTreeLayer *readXml( QDomElement &element ) /Factory/;
66+
static QgsLayerTreeLayer *readXml( QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
6767
%Docstring
6868
Read layer node from XML. Returns new instance.
6969
Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
7070
:rtype: QgsLayerTreeLayer
7171
%End
7272

73-
static QgsLayerTreeLayer *readXml( QDomElement &element, const QgsProject *project ) /Factory/;
73+
static QgsLayerTreeLayer *readXml( QDomElement &element, const QgsProject *project, const QgsReadWriteContext &context ) /Factory/;
7474
%Docstring
7575
Read layer node from XML. Returns new instance.
7676
Also resolves textual references to layers from the project (calls resolveReferences() internally).
7777
.. versionadded:: 3.0
7878
:rtype: QgsLayerTreeLayer
7979
%End
8080

81-
virtual void writeXml( QDomElement &parentElement );
81+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context );
8282

8383
virtual QString dump() const;
8484

‎python/core/layertree/qgslayertreenode.sip

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,7 @@ Get list of children of the node. Children are owned by the parent
111111
.. versionadded:: 3.0
112112
%End
113113

114-
static QgsLayerTreeNode *readXml( QDomElement &element ) /Factory/;
114+
static QgsLayerTreeNode *readXml( QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
115115
%Docstring
116116
Read layer tree from XML. Returns new instance.
117117
Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
@@ -126,7 +126,7 @@ Get list of children of the node. Children are owned by the parent
126126
:rtype: QgsLayerTreeNode
127127
%End
128128

129-
virtual void writeXml( QDomElement &parentElement ) = 0;
129+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context ) = 0;
130130
%Docstring
131131
Write layer tree to XML
132132
%End

‎src/app/qgsprojectlayergroupdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,7 @@ void QgsProjectLayerGroupDialog::changeProjectFile()
170170
QDomElement layerTreeElem = projectDom.documentElement().firstChildElement( QStringLiteral( "layer-tree-group" ) );
171171
if ( !layerTreeElem.isNull() )
172172
{
173-
mRootGroup->readChildrenFromXml( layerTreeElem );
173+
mRootGroup->readChildrenFromXml( layerTreeElem, QgsReadWriteContext() );
174174
}
175175
else
176176
{

‎src/core/composer/qgscomposerarrow.cpp

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,6 @@ bool QgsComposerArrow::writeXml( QDomElement &elem, QDomDocument &doc ) const
429429

430430
QgsReadWriteContext context;
431431
context.setPathResolver( pathResolver );
432-
433432
// absolute paths to relative
434433
QString startMarkerPath = QgsSymbolLayerUtils::svgSymbolPathToName( mStartMarkerFile, pathResolver );
435434
QString endMarkerPath = QgsSymbolLayerUtils::svgSymbolPathToName( mEndMarkerFile, pathResolver );

‎src/core/composer/qgscomposeritem.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,12 @@ void QgsComposerItem::setSelected( bool s )
143143

144144
bool QgsComposerItem::_writeXml( QDomElement &itemElem, QDomDocument &doc ) const
145145
{
146+
QgsPathResolver pathResolver;
147+
if ( composition() )
148+
pathResolver = composition()->project()->pathResolver();
149+
QgsReadWriteContext context;
150+
context.setPathResolver( pathResolver );
151+
146152
if ( itemElem.isNull() )
147153
{
148154
return false;

‎src/core/composer/qgscomposeritemgroup.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
#include "qgis_core.h"
2121
#include "qgis.h"
2222
#include "qgscomposeritem.h"
23+
#include "qgsreadwritecontext.h"
24+
2325
#include <QSet>
2426

2527
/**

‎src/core/composer/qgscomposerlegend.cpp

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -344,6 +344,12 @@ bool QgsComposerLegend::writeXml( QDomElement &elem, QDomDocument &doc ) const
344344
return false;
345345
}
346346

347+
QgsPathResolver pathResolver;
348+
if ( mComposition )
349+
pathResolver = mComposition->project()->pathResolver();
350+
QgsReadWriteContext context;
351+
context.setPathResolver( pathResolver );
352+
347353
QDomElement composerLegendElem = doc.createElement( QStringLiteral( "ComposerLegend" ) );
348354
elem.appendChild( composerLegendElem );
349355

@@ -389,7 +395,7 @@ bool QgsComposerLegend::writeXml( QDomElement &elem, QDomDocument &doc ) const
389395
if ( mCustomLayerTree )
390396
{
391397
// if not using auto-update - store the custom layer tree
392-
mCustomLayerTree->writeXml( composerLegendElem );
398+
mCustomLayerTree->writeXml( composerLegendElem, context );
393399
}
394400

395401
if ( mLegendFilterByMap )
@@ -408,6 +414,12 @@ bool QgsComposerLegend::readXml( const QDomElement &itemElem, const QDomDocument
408414
return false;
409415
}
410416

417+
QgsPathResolver pathResolver;
418+
if ( mComposition )
419+
pathResolver = mComposition->project()->pathResolver();
420+
QgsReadWriteContext context;
421+
context.setPathResolver( pathResolver );
422+
411423
//read general properties
412424
mTitle = itemElem.attribute( QStringLiteral( "title" ) );
413425
mSettings.setTitle( mTitle );
@@ -479,7 +491,7 @@ bool QgsComposerLegend::readXml( const QDomElement &itemElem, const QDomDocument
479491

480492
if ( !layerTreeElem.isNull() )
481493
{
482-
std::unique_ptr< QgsLayerTree > tree( QgsLayerTree::readXml( layerTreeElem ) );
494+
std::unique_ptr< QgsLayerTree > tree( QgsLayerTree::readXml( layerTreeElem, context ) );
483495
if ( mComposition )
484496
tree->resolveReferences( mComposition->project(), true );
485497
setCustomLayerTree( tree.release() );

‎src/core/composer/qgscomposernodesitem.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -272,6 +272,7 @@ bool QgsComposerNodesItem::moveNode( const int index, QPointF pt )
272272
bool QgsComposerNodesItem::readXml( const QDomElement &itemElem,
273273
const QDomDocument &doc )
274274
{
275+
275276
// restore general composer item properties
276277
const QDomNodeList composerItemList = itemElem.elementsByTagName( QStringLiteral( "ComposerItem" ) );
277278
if ( !composerItemList.isEmpty() )

‎src/core/composer/qgscomposerobject.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
#include "qgsobjectcustomproperties.h"
2323
#include "qgsexpressioncontextgenerator.h"
2424
#include "qgspropertycollection.h"
25+
#include "qgsreadwritecontext.h"
26+
2527
#include <QObject>
2628
#include <QDomNode>
2729
#include <QMap>

‎src/core/layertree/qgslayertree.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -99,26 +99,26 @@ void QgsLayerTree::setHasCustomLayerOrder( bool hasCustomLayerOrder )
9999
emit layerOrderChanged();
100100
}
101101

102-
QgsLayerTree *QgsLayerTree::readXml( QDomElement &element )
102+
QgsLayerTree *QgsLayerTree::readXml( QDomElement &element, const QgsReadWriteContext &context )
103103
{
104104
QgsLayerTree *tree = new QgsLayerTree();
105105

106106
tree->readCommonXml( element );
107107

108-
tree->readChildrenFromXml( element );
108+
tree->readChildrenFromXml( element, context );
109109

110110
return tree;
111111
}
112112

113-
void QgsLayerTree::writeXml( QDomElement &parentElement )
113+
void QgsLayerTree::writeXml( QDomElement &parentElement, const QgsReadWriteContext &context )
114114
{
115115
QDomDocument doc = parentElement.ownerDocument();
116116
QDomElement elem = doc.createElement( QStringLiteral( "layer-tree-group" ) );
117117

118118
writeCommonXml( elem );
119119

120120
Q_FOREACH ( QgsLayerTreeNode *node, mChildren )
121-
node->writeXml( elem );
121+
node->writeXml( elem, context );
122122

123123
QDomElement customOrderElem = doc.createElement( QStringLiteral( "custom-order" ) );
124124
customOrderElem.setAttribute( QStringLiteral( "enabled" ), mHasCustomLayerOrder ? 1 : 0 );

‎src/core/layertree/qgslayertree.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ class CORE_EXPORT QgsLayerTree : public QgsLayerTreeGroup
172172
*
173173
* \since QGIS 3.0
174174
*/
175-
static QgsLayerTree *readXml( QDomElement &element );
175+
static QgsLayerTree *readXml( QDomElement &element, const QgsReadWriteContext &context );
176176

177177
/**
178178
* Load the layer order from an XML element.
@@ -182,7 +182,7 @@ class CORE_EXPORT QgsLayerTree : public QgsLayerTreeGroup
182182
*/
183183
void readLayerOrderFromXml( const QDomElement &doc );
184184

185-
virtual void writeXml( QDomElement &parentElement ) override;
185+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context ) override;
186186

187187
virtual QgsLayerTree *clone() const override SIP_FACTORY;
188188

‎src/core/layertree/qgslayertreegroup.cpp

Lines changed: 8 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -249,7 +249,7 @@ QgsLayerTreeGroup *QgsLayerTreeGroup::findGroup( const QString &name )
249249
return nullptr;
250250
}
251251

252-
QgsLayerTreeGroup *QgsLayerTreeGroup::readXml( QDomElement &element )
252+
QgsLayerTreeGroup *QgsLayerTreeGroup::readXml( QDomElement &element, const QgsReadWriteContext &context )
253253
{
254254
if ( element.tagName() != QLatin1String( "layer-tree-group" ) )
255255
return nullptr;
@@ -265,22 +265,22 @@ QgsLayerTreeGroup *QgsLayerTreeGroup::readXml( QDomElement &element )
265265

266266
groupNode->readCommonXml( element );
267267

268-
groupNode->readChildrenFromXml( element );
268+
groupNode->readChildrenFromXml( element, context );
269269

270270
groupNode->setIsMutuallyExclusive( isMutuallyExclusive, mutuallyExclusiveChildIndex );
271271

272272
return groupNode;
273273
}
274274

275-
QgsLayerTreeGroup *QgsLayerTreeGroup::readXml( QDomElement &element, const QgsProject *project )
275+
QgsLayerTreeGroup *QgsLayerTreeGroup::readXml( QDomElement &element, const QgsProject *project, const QgsReadWriteContext &context )
276276
{
277-
QgsLayerTreeGroup *node = readXml( element );
277+
QgsLayerTreeGroup *node = readXml( element, context );
278278
if ( node )
279279
node->resolveReferences( project );
280280
return node;
281281
}
282282

283-
void QgsLayerTreeGroup::writeXml( QDomElement &parentElement )
283+
void QgsLayerTreeGroup::writeXml( QDomElement &parentElement, const QgsReadWriteContext &context )
284284
{
285285
QDomDocument doc = parentElement.ownerDocument();
286286
QDomElement elem = doc.createElement( QStringLiteral( "layer-tree-group" ) );
@@ -296,18 +296,18 @@ void QgsLayerTreeGroup::writeXml( QDomElement &parentElement )
296296
writeCommonXml( elem );
297297

298298
Q_FOREACH ( QgsLayerTreeNode *node, mChildren )
299-
node->writeXml( elem );
299+
node->writeXml( elem, context );
300300

301301
parentElement.appendChild( elem );
302302
}
303303

304-
void QgsLayerTreeGroup::readChildrenFromXml( QDomElement &element )
304+
void QgsLayerTreeGroup::readChildrenFromXml( QDomElement &element, const QgsReadWriteContext &context )
305305
{
306306
QList<QgsLayerTreeNode *> nodes;
307307
QDomElement childElem = element.firstChildElement();
308308
while ( !childElem.isNull() )
309309
{
310-
QgsLayerTreeNode *newNode = QgsLayerTreeNode::readXml( childElem );
310+
QgsLayerTreeNode *newNode = QgsLayerTreeNode::readXml( childElem, context );
311311
if ( newNode )
312312
nodes << newNode;
313313

‎src/core/layertree/qgslayertreegroup.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -145,25 +145,25 @@ class CORE_EXPORT QgsLayerTreeGroup : public QgsLayerTreeNode
145145
* Read group (tree) from XML element <layer-tree-group> and return the newly created group (or null on error).
146146
* Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
147147
*/
148-
static QgsLayerTreeGroup *readXml( QDomElement &element ) SIP_FACTORY;
148+
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
149149

150150
/**
151151
* Read group (tree) from XML element <layer-tree-group> and return the newly created group (or null on error).
152152
* Also resolves textual references to layers from the project (calls resolveReferences() internally).
153153
* \since QGIS 3.0
154154
*/
155-
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsProject *project ) SIP_FACTORY;
155+
static QgsLayerTreeGroup *readXml( QDomElement &element, const QgsProject *project, const QgsReadWriteContext &context ) SIP_FACTORY;
156156

157157
/**
158158
* Write group (tree) as XML element <layer-tree-group> and add it to the given parent element
159159
*/
160-
virtual void writeXml( QDomElement &parentElement ) override;
160+
virtual void writeXml( QDomElement &parentElement, const QgsReadWriteContext &context ) override;
161161

162162
/**
163163
* Read children from XML and append them to the group.
164164
* Does not resolve textual references to layers. Call resolveReferences() afterwards to do it.
165165
*/
166-
void readChildrenFromXml( QDomElement &element );
166+
void readChildrenFromXml( QDomElement &element, const QgsReadWriteContext &context );
167167

168168
/**
169169
* Return text representation of the tree. For debugging purposes only.

‎src/core/layertree/qgslayertreelayer.cpp

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -97,16 +97,17 @@ void QgsLayerTreeLayer::setName( const QString &n )
9797
}
9898
}
9999

100-
QgsLayerTreeLayer *QgsLayerTreeLayer::readXml( QDomElement &element )
100+
QgsLayerTreeLayer *QgsLayerTreeLayer::readXml( QDomElement &element, const QgsReadWriteContext &context )
101101
{
102+
Q_UNUSED( context );
102103
if ( element.tagName() != QLatin1String( "layer-tree-layer" ) )
103104
return nullptr;
104105

105106
QString layerID = element.attribute( QStringLiteral( "id" ) );
106107
QString layerName = element.attribute( QStringLiteral( "name" ) );
107108

108109
QString providerKey = element.attribute( QStringLiteral( "providerKey" ) );
109-
QString source = element.attribute( QStringLiteral( "source" ) );
110+
QString source = context.pathResolver().readPath( element.attribute( QStringLiteral( "source" ) ) );
110111

111112
Qt::CheckState checked = QgsLayerTreeUtils::checkStateFromXml( element.attribute( QStringLiteral( "checked" ) ) );
112113
bool isExpanded = ( element.attribute( QStringLiteral( "expanded" ), QStringLiteral( "1" ) ) == QLatin1String( "1" ) );
@@ -121,15 +122,15 @@ QgsLayerTreeLayer *QgsLayerTreeLayer::readXml( QDomElement &element )
121122
return nodeLayer;
122123
}
123124

124-
QgsLayerTreeLayer *QgsLayerTreeLayer::readXml( QDomElement &element, const QgsProject *project )
125+
QgsLayerTreeLayer *QgsLayerTreeLayer::readXml( QDomElement &element, const QgsProject *project, const QgsReadWriteContext &context )
125126
{
126-
QgsLayerTreeLayer *node = readXml( element );
127+
QgsLayerTreeLayer *node = readXml( element, context );
127128
if ( node )
128129
node->resolveReferences( project );
129130
return node;
130131
}
131132

132-
void QgsLayerTreeLayer::writeXml( QDomElement &parentElement )
133+
void QgsLayerTreeLayer::writeXml( QDomElement &parentElement, const QgsReadWriteContext &context )
133134
{
134135
QDomDocument doc = parentElement.ownerDocument();
135136
QDomElement elem = doc.createElement( QStringLiteral( "layer-tree-layer" ) );
@@ -138,7 +139,7 @@ void QgsLayerTreeLayer::writeXml( QDomElement &parentElement )
138139

139140
if ( mRef )
140141
{
141-
elem.setAttribute( QStringLiteral( "source" ), mRef->publicSource() );
142+
elem.setAttribute( QStringLiteral( "source" ), context.pathResolver().writePath( mRef->publicSource() ) );
142143
elem.setAttribute( QStringLiteral( "providerKey" ), mRef->dataProvider() ? mRef->dataProvider()->name() : QString() );
143144
}
144145

0 commit comments

Comments
 (0)
Please sign in to comment.