Skip to content

Commit c3315c4

Browse files
committed
Add support for embedded layers and groups into layer tree
1 parent 2972768 commit c3315c4

File tree

8 files changed

+254
-14
lines changed

8 files changed

+254
-14
lines changed

src/app/qgisapp.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7320,7 +7320,7 @@ void QgisApp::embedLayers()
73207320
QStringList::const_iterator groupIt = groups.constBegin();
73217321
for ( ; groupIt != groups.constEnd(); ++groupIt )
73227322
{
7323-
mMapLegend->addEmbeddedGroup( *groupIt, projectFile );
7323+
QgsProject::instance()->createEmbeddedGroup( *groupIt, projectFile );
73247324
}
73257325

73267326
//layer ids

src/core/layertree/qgslayertreenode.cpp

Lines changed: 94 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,26 @@
55
#include "qgslayertreeutils.h"
66

77

8+
QgsLayerTreeNode::QgsLayerTreeNode(QgsLayerTreeNode::NodeType t)
9+
: mNodeType(t)
10+
, mParent(0)
11+
, mExpanded(true)
12+
{
13+
}
14+
15+
QgsLayerTreeNode::QgsLayerTreeNode(const QgsLayerTreeNode& other)
16+
: QObject()
17+
, mNodeType(other.mNodeType)
18+
, mParent(0)
19+
, mExpanded(other.mExpanded)
20+
, mProperties(other.mProperties)
21+
{
22+
QList<QgsLayerTreeNode*> clonedChildren;
23+
foreach (QgsLayerTreeNode* child, other.mChildren)
24+
clonedChildren << child->clone();
25+
insertChildren(-1, clonedChildren);
26+
}
27+
828
QgsLayerTreeNode* QgsLayerTreeNode::readXML(QDomElement& element)
929
{
1030
QgsLayerTreeNode* node = 0;
@@ -109,6 +129,14 @@ QgsLayerTreeGroup::QgsLayerTreeGroup(const QString& name, Qt::CheckState checked
109129
{
110130
}
111131

132+
QgsLayerTreeGroup::QgsLayerTreeGroup(const QgsLayerTreeGroup& other)
133+
: QgsLayerTreeNode(other)
134+
, mName(other.mName)
135+
, mChecked(other.mChecked)
136+
, mChangingChildVisibility(false)
137+
{
138+
}
139+
112140

113141
QgsLayerTreeGroup* QgsLayerTreeGroup::addGroup(const QString &name)
114142
{
@@ -214,6 +242,26 @@ QgsLayerTreeLayer *QgsLayerTreeGroup::findLayer(const QString& layerId)
214242
return 0;
215243
}
216244

245+
QgsLayerTreeGroup* QgsLayerTreeGroup::findGroup(const QString& name)
246+
{
247+
foreach (QgsLayerTreeNode* child, mChildren)
248+
{
249+
if (child->nodeType() == QgsLayerTreeNode::NodeGroup)
250+
{
251+
QgsLayerTreeGroup* childGroup = static_cast<QgsLayerTreeGroup*>(child);
252+
if (childGroup->name() == name)
253+
return childGroup;
254+
else
255+
{
256+
QgsLayerTreeGroup* grp = childGroup->findGroup(name);
257+
if (grp)
258+
return grp;
259+
}
260+
}
261+
}
262+
return 0;
263+
}
264+
217265
QgsLayerTreeGroup* QgsLayerTreeGroup::readXML(QDomElement& element)
218266
{
219267
if (element.tagName() != "layer-tree-group")
@@ -273,6 +321,11 @@ QString QgsLayerTreeGroup::dump() const
273321
return header + childrenDump.join( "\n" );
274322
}
275323

324+
QgsLayerTreeNode* QgsLayerTreeGroup::clone() const
325+
{
326+
return new QgsLayerTreeGroup(*this);
327+
}
328+
276329
void QgsLayerTreeGroup::setVisible(Qt::CheckState state)
277330
{
278331
if (mChecked == state)
@@ -298,6 +351,19 @@ void QgsLayerTreeGroup::setVisible(Qt::CheckState state)
298351
}
299352
}
300353

354+
QStringList QgsLayerTreeGroup::childLayerIds() const
355+
{
356+
QStringList lst;
357+
foreach (QgsLayerTreeNode* child, mChildren)
358+
{
359+
if (child->nodeType() == NodeGroup)
360+
lst << static_cast<QgsLayerTreeGroup*>(child)->childLayerIds();
361+
else if (child->nodeType() == NodeLayer)
362+
lst << static_cast<QgsLayerTreeLayer*>(child)->layerId();
363+
}
364+
return lst;
365+
}
366+
301367

302368
void QgsLayerTreeGroup::layerDestroyed()
303369
{
@@ -353,18 +419,38 @@ QgsLayerTreeLayer::QgsLayerTreeLayer(QgsMapLayer *layer)
353419
}
354420

355421
QgsLayerTreeLayer::QgsLayerTreeLayer(QString layerId, QString name)
356-
: QgsLayerTreeNode(NodeLayer), mLayerId(layerId), mLayer(0), mVisible(true)
422+
: QgsLayerTreeNode(NodeLayer)
423+
, mLayerId(layerId)
424+
, mLayerName(name)
425+
, mLayer(0)
426+
, mVisible(true)
427+
{
428+
attachToLayer();
429+
}
430+
431+
QgsLayerTreeLayer::QgsLayerTreeLayer(const QgsLayerTreeLayer& other)
432+
: QgsLayerTreeNode(other)
433+
, mLayerId(other.mLayerId)
434+
, mLayerName(other.mLayerName)
435+
, mLayer(0)
436+
, mVisible(other.mVisible)
437+
{
438+
attachToLayer();
439+
}
440+
441+
void QgsLayerTreeLayer::attachToLayer()
357442
{
358443
// layer is not necessarily already loaded
359-
QgsMapLayer* l = QgsMapLayerRegistry::instance()->mapLayer(layerId);
444+
QgsMapLayer* l = QgsMapLayerRegistry::instance()->mapLayer(mLayerId);
360445
if (l)
361446
{
362447
mLayer = l;
363448
mLayerName = l->name();
364449
}
365450
else
366451
{
367-
mLayerName = name.isEmpty() ? "(?)" : name;
452+
if (mLayerName.isEmpty())
453+
mLayerName = "(?)";
368454
// wait for the layer to be eventually loaded
369455
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersAdded(QList<QgsMapLayer*>)), this, SLOT(registryLayersAdded(QList<QgsMapLayer*>)));
370456
}
@@ -425,6 +511,11 @@ QString QgsLayerTreeLayer::dump() const
425511
return QString( "LAYER: %1 visible=%2 expanded=%3 id=%4\n" ).arg( layerName() ).arg( mVisible ).arg( mExpanded ).arg( layerId() );
426512
}
427513

514+
QgsLayerTreeNode* QgsLayerTreeLayer::clone() const
515+
{
516+
return new QgsLayerTreeLayer(*this);
517+
}
518+
428519
void QgsLayerTreeLayer::registryLayersAdded(QList<QgsMapLayer*> layers)
429520
{
430521
foreach (QgsMapLayer* l, layers)

src/core/layertree/qgslayertreenode.h

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
2020
NodeLayer
2121
};
2222

23-
QgsLayerTreeNode(NodeType t): mNodeType(t), mParent(0), mExpanded(true) {}
2423
~QgsLayerTreeNode() { qDeleteAll(mChildren); }
2524

2625
NodeType nodeType() { return mNodeType; }
@@ -32,6 +31,8 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
3231

3332
virtual QString dump() const = 0;
3433

34+
virtual QgsLayerTreeNode* clone() const = 0;
35+
3536
bool isExpanded() const { return mExpanded; }
3637
void setExpanded(bool expanded) { mExpanded = expanded; }
3738

@@ -58,6 +59,9 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject
5859

5960
protected:
6061

62+
QgsLayerTreeNode(NodeType t);
63+
QgsLayerTreeNode(const QgsLayerTreeNode& other);
64+
6165
// low-level utility functions
6266

6367
void readCommonXML(QDomElement& element);
@@ -95,6 +99,7 @@ class QgsLayerTreeLayer : public QgsLayerTreeNode
9599
Q_OBJECT
96100
public:
97101
explicit QgsLayerTreeLayer(QgsMapLayer* layer);
102+
QgsLayerTreeLayer(const QgsLayerTreeLayer& other);
98103

99104
explicit QgsLayerTreeLayer(QString layerId, QString name = QString());
100105

@@ -113,10 +118,13 @@ class QgsLayerTreeLayer : public QgsLayerTreeNode
113118

114119
virtual QString dump() const;
115120

121+
virtual QgsLayerTreeNode* clone() const;
122+
116123
protected slots:
117124
void registryLayersAdded(QList<QgsMapLayer*> layers);
118125

119126
protected:
127+
void attachToLayer();
120128

121129
QString mLayerId;
122130
QString mLayerName; // only used if layer does not exist
@@ -130,6 +138,7 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
130138
Q_OBJECT
131139
public:
132140
QgsLayerTreeGroup(const QString& name = QString(), Qt::CheckState checked = Qt::Checked);
141+
QgsLayerTreeGroup(const QgsLayerTreeGroup& other);
133142

134143
QString name() const { return mName; }
135144
void setName(const QString& n) { mName = n; }
@@ -150,6 +159,7 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
150159
void removeAllChildren();
151160

152161
QgsLayerTreeLayer* findLayer(const QString& layerId);
162+
QgsLayerTreeGroup* findGroup(const QString& name);
153163

154164
static QgsLayerTreeGroup* readXML(QDomElement& element);
155165
virtual void writeXML(QDomElement& parentElement);
@@ -158,9 +168,13 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
158168

159169
virtual QString dump() const;
160170

171+
virtual QgsLayerTreeNode* clone() const;
172+
161173
Qt::CheckState isVisible() const { return mChecked; }
162174
void setVisible(Qt::CheckState state);
163175

176+
QStringList childLayerIds() const;
177+
164178
protected slots:
165179
void layerDestroyed();
166180
void updateVisibilityFromChildren();

src/core/layertree/qgslayertreeregistrybridge.cpp

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@
44

55
#include "qgslayertreenode.h"
66

7+
#include "qgsproject.h"
8+
79
QgsLayerTreeRegistryBridge::QgsLayerTreeRegistryBridge(QgsLayerTreeGroup *root, QObject *parent)
810
: QObject(parent)
911
, mRoot(root)
@@ -22,7 +24,15 @@ void QgsLayerTreeRegistryBridge::layersAdded(QList<QgsMapLayer*> layers)
2224

2325
foreach (QgsMapLayer* layer, layers)
2426
{
25-
mRoot->addLayer(layer);
27+
QgsLayerTreeLayer* nodeLayer = mRoot->addLayer(layer);
28+
29+
// check whether the layer is marked as embedded
30+
QString projectFile = QgsProject::instance()->layerIsEmbedded(nodeLayer->layerId());
31+
if (!projectFile.isEmpty())
32+
{
33+
nodeLayer->setCustomProperty("embedded", true);
34+
nodeLayer->setCustomProperty("embedded_project", projectFile);
35+
}
2636
}
2737
}
2838

src/core/layertree/qgslayertreeutils.cpp

Lines changed: 16 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -53,13 +53,17 @@ void QgsLayerTreeUtils::addLegendGroupToTreeWidget( const QDomElement& groupElem
5353
{
5454
QDomNodeList groupChildren = groupElem.childNodes();
5555

56-
// TODO: embedded
57-
//if ( !mShowEmbeddedContent && groupElem.attribute( "embedded" ) == "1" )
58-
// return;
59-
6056
QgsLayerTreeGroup* groupNode = new QgsLayerTreeGroup(groupElem.attribute( "name" ));
6157
parent->addChildNode(groupNode);
6258

59+
groupNode->setVisible(checkStateFromXml(groupElem.attribute("checked")));
60+
61+
if (groupElem.attribute("embedded") == "1")
62+
{
63+
groupNode->setCustomProperty("embedded", true);
64+
groupNode->setCustomProperty("embedded_project", groupElem.attribute("project"));
65+
}
66+
6367
for ( int i = 0; i < groupChildren.size(); ++i )
6468
{
6569
QDomElement currentChildElem = groupChildren.at( i ).toElement();
@@ -76,11 +80,15 @@ void QgsLayerTreeUtils::addLegendGroupToTreeWidget( const QDomElement& groupElem
7680

7781
void QgsLayerTreeUtils::addLegendLayerToTreeWidget( const QDomElement& layerElem, QgsLayerTreeGroup* parent )
7882
{
79-
// TODO: embedded
80-
//if ( !mShowEmbeddedContent && layerElem.attribute( "embedded" ) == "1" )
81-
// return;
82-
8383
QString layerId = layerElem.firstChildElement( "filegroup" ).firstChildElement( "legendlayerfile" ).attribute( "layerid" );
8484
QgsLayerTreeLayer* layerNode = new QgsLayerTreeLayer(layerId, layerElem.attribute( "name" ) );
85+
86+
layerNode->setVisible(checkStateFromXml(layerElem.attribute("checked")));
87+
88+
if (layerElem.attribute("embedded") == "1")
89+
layerNode->setCustomProperty("embedded", true);
90+
91+
// TODO: is in overview, drawing order, show feature count
92+
8593
parent->addChildNode(layerNode);
8694
}

0 commit comments

Comments
 (0)