Skip to content

Commit ff3200f

Browse files
committed
make vector joins work within layer-definition-files
1 parent 5a42728 commit ff3200f

File tree

1 file changed

+24
-0
lines changed

1 file changed

+24
-0
lines changed

src/core/qgslayerdefinition.cpp

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66

77
#include "qgslogger.h"
88
#include "qgsmaplayer.h"
9+
#include "qgsvectorlayer.h"
910
#include "qgslayertree.h"
1011
#include "qgsmaplayerregistry.h"
1112
#include "qgslayerdefinition.h"
@@ -62,6 +63,18 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsLayerTreeGrou
6263
layerNode.toElement().setAttribute( "id", newid );
6364
}
6465
}
66+
67+
// change layer IDs for vector joins
68+
QDomNodeList vectorJoinNodes = doc.elementsByTagName( "join" ); // TODO: Find a better way of searching for vectorjoins, there might be other <join> elements within the project.
69+
for ( int j = 0; j < vectorJoinNodes.size(); ++j )
70+
{
71+
QDomNode joinNode = vectorJoinNodes.at( j );
72+
QDomElement joinElement = joinNode.toElement();
73+
if ( joinElement.attribute( "joinLayerId" ) == oldid )
74+
{
75+
joinNode.toElement().setAttribute( "joinLayerId", newid );
76+
}
77+
}
6578
}
6679

6780
QDomElement layerTreeElem = doc.documentElement().firstChildElement( "layer-tree-group" );
@@ -75,6 +88,17 @@ bool QgsLayerDefinition::loadLayerDefinition( QDomDocument doc, QgsLayerTreeGrou
7588
QList<QgsMapLayer*> layers = QgsMapLayer::fromLayerDefinition( doc );
7689
QgsMapLayerRegistry::instance()->addMapLayers( layers, loadInLegend );
7790

91+
// Now that all layers are loaded, refresh the vectorjoins to get the joined fields
92+
Q_FOREACH ( QgsMapLayer* layer, layers )
93+
{
94+
QgsVectorLayer* vlayer = static_cast< QgsVectorLayer * >( layer );
95+
if ( vlayer )
96+
{
97+
vlayer->createJoinCaches();
98+
vlayer->updateFields();
99+
}
100+
}
101+
78102
QList<QgsLayerTreeNode*> nodes = root->children();
79103
Q_FOREACH ( QgsLayerTreeNode *node, nodes )
80104
root->takeChild( node );

0 commit comments

Comments
 (0)