@@ -672,12 +672,82 @@ QPair< bool, QList<QDomNode> > QgsProject::_getMapLayers( QDomDocument const &do
672
672
673
673
emit layerLoaded ( 0 , nl.count () );
674
674
675
+ // Determine a loading order of layers based on a graph of dependencies
676
+ QMap< QString, QVector< QString > > dependencies;
677
+ QVector<QString> sortedLayers;
678
+ QMap<QString, int > layerIdIdx;
679
+ QList<QString> layersToSort;
680
+
681
+ for ( int i = 0 ; i < nl.count (); i++ )
682
+ {
683
+ QVector<QString> deps;
684
+ QDomNode node = nl.item ( i );
685
+ QDomElement element = node.toElement ();
686
+
687
+ QString id = node.namedItem ( " id" ).toElement ().text ();
688
+
689
+ // dependencies for this layer
690
+ QDomElement layerDependenciesElem = node.firstChildElement ( " layerDependencies" );
691
+ if ( !layerDependenciesElem.isNull () )
692
+ {
693
+ QDomNodeList dependencyList = layerDependenciesElem.elementsByTagName ( " layer" );
694
+ for ( int j = 0 ; j < dependencyList.size (); ++j )
695
+ {
696
+ QDomElement depElem = dependencyList.at ( j ).toElement ();
697
+ deps << depElem.attribute ( " id" );
698
+ }
699
+ }
700
+ dependencies[id] = deps;
701
+
702
+ if ( deps.empty () )
703
+ sortedLayers << id;
704
+ else
705
+ layersToSort << id;
706
+ layerIdIdx[id] = i;
707
+ }
708
+
709
+ bool hasCycle = false ;
710
+ while ( !layersToSort.empty () && !hasCycle )
711
+ {
712
+ QList<QString>::iterator it = layersToSort.begin ();
713
+ while ( it != layersToSort.end () )
714
+ {
715
+ hasCycle = true ;
716
+ bool resolved = true ;
717
+ foreach ( QString dep, dependencies[*it] )
718
+ {
719
+ if ( !sortedLayers.contains ( dep ) )
720
+ {
721
+ resolved = false ;
722
+ break ;
723
+ }
724
+ }
725
+ if ( resolved ) // dependencies for this layer are resolved
726
+ {
727
+ sortedLayers << *it;
728
+ it = layersToSort.erase ( it ); // erase and go to the next
729
+ hasCycle = false ;
730
+ }
731
+ else
732
+ {
733
+ it++;
734
+ }
735
+ }
736
+ }
737
+
738
+ if ( hasCycle )
739
+ {
740
+ // should not happen, since layers with cyclic dependencies may only be created by
741
+ // manually modifying the project file
742
+ return qMakePair ( false , QList<QDomNode>() );
743
+ }
744
+
675
745
// Collect vector layers with joins.
676
746
// They need to refresh join caches and symbology infos after all layers are loaded
677
747
QList< QPair< QgsVectorLayer*, QDomElement > > vLayerList;
678
-
679
- for ( int i = 0 ; i < nl.count (); i++ )
748
+ foreach ( QString id, sortedLayers )
680
749
{
750
+ int i = layerIdIdx[id];
681
751
QDomNode node = nl.item ( i );
682
752
QDomElement element = node.toElement ();
683
753
0 commit comments