Skip to content

Commit 0e8b79f

Browse files
committedMay 21, 2014
Loading of embedded groups and layer from project file
1 parent f83a11f commit 0e8b79f

File tree

8 files changed

+83
-24
lines changed

8 files changed

+83
-24
lines changed
 

‎src/app/qgisapp.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7512,7 +7512,10 @@ void QgisApp::embedLayers()
75127512
QStringList::const_iterator groupIt = groups.constBegin();
75137513
for ( ; groupIt != groups.constEnd(); ++groupIt )
75147514
{
7515-
QgsProject::instance()->createEmbeddedGroup( *groupIt, projectFile );
7515+
QgsLayerTreeGroup* newGroup = QgsProject::instance()->createEmbeddedGroup( *groupIt, projectFile );
7516+
7517+
if ( newGroup )
7518+
QgsProject::instance()->layerTreeRoot()->addChildNode( newGroup );
75167519
}
75177520

75187521
//layer ids

‎src/app/qgsapplayertreeviewmenuprovider.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
6060
menu->addAction( actions->actionZoomToLayer(mCanvas, menu) );
6161
menu->addAction( actions->actionShowInOverview(menu) );
6262

63-
if ( layer->type() == QgsMapLayer::RasterLayer )
63+
if ( layer && layer->type() == QgsMapLayer::RasterLayer )
6464
{
6565
menu->addAction( tr( "&Zoom to Best Scale (100%)" ), QgisApp::instance(), SLOT( legendLayerZoomNative() ) );
6666

@@ -82,7 +82,7 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
8282

8383
menu->addSeparator();
8484

85-
if ( layer->type() == QgsMapLayer::VectorLayer )
85+
if ( layer && layer->type() == QgsMapLayer::VectorLayer )
8686
{
8787
QgsVectorLayer* vlayer = qobject_cast<QgsVectorLayer *>( layer );
8888

@@ -127,12 +127,12 @@ QMenu* QgsAppLayerTreeViewMenuProvider::createContextMenu()
127127

128128
menu->addSeparator();
129129
}
130-
else if ( layer->type() == QgsMapLayer::RasterLayer )
130+
else if ( layer && layer->type() == QgsMapLayer::RasterLayer )
131131
{
132132
menu->addAction( tr( "Save As..." ), QgisApp::instance(), SLOT( saveAsRasterFile() ) );
133133
menu->addAction( tr( "Save As Layer Definition File..." ), QgisApp::instance(), SLOT( saveAsLayerDefinition() ) );
134134
}
135-
else if ( layer->type() == QgsMapLayer::PluginLayer && mView->selectedLayerNodes().count() == 1 )
135+
else if ( layer && layer->type() == QgsMapLayer::PluginLayer && mView->selectedLayerNodes().count() == 1 )
136136
{
137137
// disable duplication of plugin layers
138138
duplicateLayersAction->setEnabled( false );

‎src/app/qgsprojectlayergroupdialog.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -186,7 +186,7 @@ void QgsProjectLayerGroupDialog::removeEmbeddedNodes( QgsLayerTreeGroup* node )
186186
QList<QgsLayerTreeNode*> childrenToRemove;
187187
foreach ( QgsLayerTreeNode* child, node->children() )
188188
{
189-
if ( child->customProperty("embedded").toBool() )
189+
if ( child->customProperty("embedded").toInt() )
190190
childrenToRemove << child;
191191
else if ( QgsLayerTree::isGroup(child) )
192192
removeEmbeddedNodes( QgsLayerTree::toGroup( child ) );

‎src/core/layertree/qgslayertreeregistrybridge.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ void QgsLayerTreeRegistryBridge::layersAdded(QList<QgsMapLayer*> layers)
4040
QString projectFile = QgsProject::instance()->layerIsEmbedded(nodeLayer->layerId());
4141
if (!projectFile.isEmpty())
4242
{
43-
nodeLayer->setCustomProperty("embedded", true);
43+
nodeLayer->setCustomProperty("embedded", 1);
4444
nodeLayer->setCustomProperty("embedded_project", projectFile);
4545
}
4646
}

‎src/core/layertree/qgslayertreeutils.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ void QgsLayerTreeUtils::addLegendGroupToTreeWidget( const QDomElement& groupElem
6262

6363
if (groupElem.attribute("embedded") == "1")
6464
{
65-
groupNode->setCustomProperty("embedded", true);
65+
groupNode->setCustomProperty("embedded", 1);
6666
groupNode->setCustomProperty("embedded_project", groupElem.attribute("project"));
6767
}
6868

@@ -88,7 +88,7 @@ void QgsLayerTreeUtils::addLegendLayerToTreeWidget( const QDomElement& layerElem
8888
layerNode->setVisible(checkStateFromXml(layerElem.attribute("checked")));
8989

9090
if (layerElem.attribute("embedded") == "1")
91-
layerNode->setCustomProperty("embedded", true);
91+
layerNode->setCustomProperty("embedded", 1);
9292

9393
// TODO: is in overview, drawing order, show feature count
9494

‎src/core/qgsproject.cpp

Lines changed: 65 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -939,7 +939,8 @@ bool QgsProject::read()
939939

940940
mLayerTreeRegistryBridge->setEnabled( true );
941941

942-
// TODO: load embedded groups / layers
942+
// load embedded groups and layers
943+
loadEmbeddedNodes(mRootGroup);
943944

944945
// read the project: used by map canvas and legend
945946
emit readProject( *doc );
@@ -953,6 +954,57 @@ bool QgsProject::read()
953954
} // QgsProject::read
954955

955956

957+
void QgsProject::loadEmbeddedNodes(QgsLayerTreeGroup* group)
958+
{
959+
foreach (QgsLayerTreeNode* child, group->children())
960+
{
961+
if (QgsLayerTree::isGroup(child))
962+
{
963+
QgsLayerTreeGroup* childGroup = QgsLayerTree::toGroup(child);
964+
if (childGroup->customProperty("embedded").toInt())
965+
{
966+
QgsLayerTreeGroup* newGroup = createEmbeddedGroup(childGroup->name(), childGroup->customProperty("embedded_project").toString());
967+
if (newGroup)
968+
{
969+
QList<QgsLayerTreeNode*> clonedChildren;
970+
foreach (QgsLayerTreeNode* newGroupChild, newGroup->children())
971+
clonedChildren << newGroupChild->clone();
972+
delete newGroup;
973+
974+
childGroup->insertChildNodes(0, clonedChildren);
975+
}
976+
}
977+
else
978+
{
979+
loadEmbeddedNodes(childGroup);
980+
}
981+
}
982+
else if (QgsLayerTree::isLayer(child))
983+
{
984+
if (child->customProperty("embedded").toInt())
985+
{
986+
QList<QDomNode> brokenNodes;
987+
QList< QPair< QgsVectorLayer*, QDomElement > > vectorLayerList;
988+
createEmbeddedLayer(QgsLayerTree::toLayer(child)->layerId(), child->customProperty("embedded_project").toString(), brokenNodes, vectorLayerList);
989+
}
990+
}
991+
992+
}
993+
}
994+
995+
void QgsProject::removeChildrenOfEmbeddedGroups(QgsLayerTreeGroup* group)
996+
{
997+
foreach (QgsLayerTreeNode* child, group->children())
998+
{
999+
if (QgsLayerTree::isGroup(child))
1000+
{
1001+
if (child->customProperty("embedded").toInt())
1002+
QgsLayerTree::toGroup(child)->removeAllChildren();
1003+
else
1004+
removeChildrenOfEmbeddedGroups(QgsLayerTree::toGroup(child));
1005+
}
1006+
}
1007+
}
9561008

9571009

9581010

@@ -1033,8 +1085,11 @@ bool QgsProject::write()
10331085
QDomText titleText = doc->createTextNode( title() ); // XXX why have title TWICE?
10341086
titleNode.appendChild( titleText );
10351087

1036-
// write layer tree
1037-
mRootGroup->writeXML( qgisNode );
1088+
// write layer tree - make sure it is without embedded subgroups
1089+
QgsLayerTreeNode* clonedRoot = mRootGroup->clone();
1090+
removeChildrenOfEmbeddedGroups(QgsLayerTree::toGroup(clonedRoot));
1091+
clonedRoot->writeXML( qgisNode );
1092+
delete clonedRoot;
10381093

10391094
// let map canvas and legend write their information
10401095
emit writeProject( *doc );
@@ -1720,19 +1775,19 @@ bool QgsProject::createEmbeddedLayer( const QString& layerId, const QString& pro
17201775
}
17211776

17221777

1723-
bool QgsProject::createEmbeddedGroup( const QString& groupName, const QString& projectFilePath )
1778+
QgsLayerTreeGroup* QgsProject::createEmbeddedGroup( const QString& groupName, const QString& projectFilePath )
17241779
{
17251780
//open project file, get layer ids in group, add the layers
17261781
QFile projectFile( projectFilePath );
17271782
if ( !projectFile.open( QIODevice::ReadOnly ) )
17281783
{
1729-
return false;
1784+
return 0;
17301785
}
17311786

17321787
QDomDocument projectDocument;
17331788
if ( !projectDocument.setContent( &projectFile ) )
17341789
{
1735-
return false;
1790+
return 0;
17361791
}
17371792

17381793
//store identify disabled layers of the embedded project
@@ -1764,15 +1819,15 @@ bool QgsProject::createEmbeddedGroup( const QString& groupName, const QString& p
17641819
{
17651820
// embedded groups cannot be embedded again
17661821
delete root;
1767-
return false;
1822+
return 0;
17681823
}
17691824

17701825
// clone the group sub-tree (it is used already in a tree, we cannot just tear it off)
17711826
QgsLayerTreeGroup* newGroup = QgsLayerTree::toGroup( group->clone() );
17721827
delete root;
17731828
root = 0;
17741829

1775-
newGroup->setCustomProperty( "embedded", true );
1830+
newGroup->setCustomProperty( "embedded", 1 );
17761831
newGroup->setCustomProperty( "embedded_project", projectFilePath );
17771832

17781833
// set "embedded" to all children + load embedded layers
@@ -1791,18 +1846,15 @@ bool QgsProject::createEmbeddedGroup( const QString& groupName, const QString& p
17911846
}
17921847
}
17931848

1794-
// add to the project
1795-
mRootGroup->addChildNode( newGroup );
1796-
1797-
return true;
1849+
return newGroup;
17981850
}
17991851

18001852
void QgsProject::initializeEmbeddedSubtree( const QString& projectFilePath, QgsLayerTreeGroup* group )
18011853
{
18021854
foreach ( QgsLayerTreeNode* child, group->children() )
18031855
{
18041856
// all nodes in the subtree will have "embedded" custom property set
1805-
child->setCustomProperty( "embedded", true );
1857+
child->setCustomProperty( "embedded", 1 );
18061858

18071859
if ( QgsLayerTree::isGroup( child ) )
18081860
{

‎src/core/qgsproject.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -305,7 +305,7 @@ class CORE_EXPORT QgsProject : public QObject
305305
/** Create layer group instance defined in an arbitrary project file.
306306
* @note: added in version 2.4
307307
*/
308-
bool createEmbeddedGroup( const QString& groupName, const QString& projectFilePath );
308+
QgsLayerTreeGroup* createEmbeddedGroup( const QString& groupName, const QString& projectFilePath );
309309

310310
/** Convenience function to set snap settings per layer
311311
@note added in version 1.9*/
@@ -355,6 +355,10 @@ class CORE_EXPORT QgsProject : public QObject
355355

356356
void initializeEmbeddedSubtree( const QString& projectFilePath, QgsLayerTreeGroup* group );
357357

358+
void loadEmbeddedNodes(QgsLayerTreeGroup* group);
359+
360+
void removeChildrenOfEmbeddedGroups(QgsLayerTreeGroup* group);
361+
358362
signals:
359363
//! emitted when project is being read
360364
void readProject( const QDomDocument & );

‎src/gui/layertree/qgslayertreemodel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ QVariant QgsLayerTreeModel::data(const QModelIndex &index, int role) const
209209
else if ( role == Qt::FontRole )
210210
{
211211
QFont f;
212-
if (node->customProperty("embedded", false).toBool())
212+
if (node->customProperty("embedded").toInt())
213213
f.setItalic(true);
214214
if (QgsLayerTree::isLayer(node))
215215
f.setBold(true);

0 commit comments

Comments
 (0)