Skip to content

Commit 7e5915e

Browse files
author
Hugo Mercier
committed
Allow to embed layers with dependencies
1 parent 1a1af37 commit 7e5915e

File tree

4 files changed

+53
-6
lines changed

4 files changed

+53
-6
lines changed

python/core/qgslayerdefinition.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,17 @@ class QgsLayerDefinition
3131
*/
3232
DependencySorter( QDomDocument doc );
3333

34+
/** Constructor
35+
* @param fileName The filename where the XML document is stored
36+
*/
37+
DependencySorter( const QString& fileName );
38+
3439
/** Get the layer nodes in an order where they can be loaded incrementally without dependency break */
3540
QVector<QDomNode> sortedLayerNodes() const;
3641

42+
/** Get the layer IDs in an order where they can be loaded incrementally without dependency break */
43+
QStringList sortedLayerIds() const;
44+
3745
/** Whether some cyclic dependency has been detected */
3846
bool hasCycle() const;
3947

src/app/qgisapp.cpp

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8467,11 +8467,18 @@ void QgisApp::embedLayers()
84678467
//layer ids
84688468
QList<QDomNode> brokenNodes;
84698469
QList< QPair< QgsVectorLayer*, QDomElement > > vectorLayerList;
8470+
8471+
// resolve dependencies
8472+
QgsLayerDefinition::DependencySorter depSorter( projectFile );
8473+
QStringList sortedIds = depSorter.sortedLayerIds();
84708474
QStringList layerIds = d.selectedLayerIds();
8471-
QStringList::const_iterator layerIt = layerIds.constBegin();
8472-
for ( ; layerIt != layerIds.constEnd(); ++layerIt )
8475+
foreach ( QString id, sortedIds )
84738476
{
8474-
QgsProject::instance()->createEmbeddedLayer( *layerIt, projectFile, brokenNodes, vectorLayerList );
8477+
foreach ( QString selId, layerIds )
8478+
{
8479+
if ( selId == id )
8480+
QgsProject::instance()->createEmbeddedLayer( selId, projectFile, brokenNodes, vectorLayerList );
8481+
}
84758482
}
84768483

84778484
mMapCanvas->freeze( false );

src/core/qgslayerdefinition.cpp

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -186,13 +186,13 @@ bool QgsLayerDefinition::exportLayerDefinition( QDomDocument doc, const QList<Qg
186186
return true;
187187
}
188188

189-
QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
190-
mHasCycle( false ), mHasMissingDependency( false )
189+
void QgsLayerDefinition::DependencySorter::init( QDomDocument doc )
191190
{
192191
// Determine a loading order of layers based on a graph of dependencies
193192
QMap< QString, QVector< QString > > dependencies;
194-
QVector<QString> sortedLayers;
193+
QStringList sortedLayers;
195194
QList< QPair<QString, QDomNode> > layersToSort;
195+
QStringList layerIds;
196196

197197
QDomNodeList nl = doc.elementsByTagName( "maplayer" );
198198
for ( int i = 0; i < nl.count(); i++ )
@@ -202,6 +202,7 @@ QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
202202
QDomElement element = node.toElement();
203203

204204
QString id = node.namedItem( "id" ).toElement().text();
205+
layerIds << id;
205206

206207
// dependencies for this layer
207208
QDomElement layerDependenciesElem = node.firstChildElement( "layerDependencies" );
@@ -234,6 +235,9 @@ QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
234235
{
235236
// some dependencies are not satisfied
236237
mHasMissingDependency = true;
238+
for ( int i = 0; i < nl.size(); i++ )
239+
mSortedLayerNodes << nl.at( i );
240+
mSortedLayerIds = layerIds;
237241
return;
238242
}
239243
}
@@ -264,6 +268,7 @@ QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
264268
{
265269
sortedLayers << idToSort;
266270
mSortedLayerNodes << node;
271+
mSortedLayerIds << idToSort;
267272
it = layersToSort.erase( it ); // erase and go to the next
268273
mHasCycle = false;
269274
}
@@ -275,3 +280,20 @@ QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
275280
}
276281
}
277282

283+
QgsLayerDefinition::DependencySorter::DependencySorter( QDomDocument doc ) :
284+
mHasCycle( false ), mHasMissingDependency( false )
285+
{
286+
init( doc );
287+
}
288+
289+
QgsLayerDefinition::DependencySorter::DependencySorter( const QString& fileName ) :
290+
mHasCycle( false ), mHasMissingDependency( false )
291+
{
292+
QDomDocument doc;
293+
QFile pFile( fileName );
294+
pFile.open( QIODevice::ReadOnly );
295+
doc.setContent( &pFile );
296+
init( doc );
297+
}
298+
299+

src/core/qgslayerdefinition.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,17 @@ class CORE_EXPORT QgsLayerDefinition
3333
*/
3434
DependencySorter( QDomDocument doc );
3535

36+
/** Constructor
37+
* @param fileName The filename where the XML document is stored
38+
*/
39+
DependencySorter( const QString& fileName );
40+
3641
/** Get the layer nodes in an order where they can be loaded incrementally without dependency break */
3742
QVector<QDomNode> sortedLayerNodes() const { return mSortedLayerNodes; }
3843

44+
/** Get the layer IDs in an order where they can be loaded incrementally without dependency break */
45+
QStringList sortedLayerIds() const { return mSortedLayerIds; }
46+
3947
/** Whether some cyclic dependency has been detected */
4048
bool hasCycle() const { return mHasCycle; }
4149

@@ -44,8 +52,10 @@ class CORE_EXPORT QgsLayerDefinition
4452

4553
private:
4654
QVector<QDomNode> mSortedLayerNodes;
55+
QStringList mSortedLayerIds;
4756
bool mHasCycle;
4857
bool mHasMissingDependency;
58+
void init( QDomDocument doc );
4959
};
5060
};
5161

0 commit comments

Comments
 (0)