Skip to content
Permalink
Browse files
Propagate added/removed children signals to the root for easier manip…
…ulation
  • Loading branch information
wonder-sk committed May 21, 2014
1 parent 36d8d88 commit 1a61c154ab164cc11c9b19c5539c82bdde91675c
@@ -51,8 +51,6 @@ void QgsLayerTreeGroup::connectToChildNode(QgsLayerTreeNode* node)
}

connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(updateVisibilityFromChildren()));
// forward the signal towards the root
connect(node, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)));
}

void QgsLayerTreeGroup::insertChildNode(int index, QgsLayerTreeNode* node)
@@ -92,10 +92,19 @@ void QgsLayerTreeNode::insertChildren(int index, QList<QgsLayerTreeNode*> nodes)
index = mChildren.count();

int indexTo = index+nodes.count()-1;
emit willAddChildren(index, indexTo);
emit willAddChildren(this, index, indexTo);
for (int i = 0; i < nodes.count(); ++i)
{
mChildren.insert(index+i, nodes[i]);
emit addedChildren(index, indexTo);

// forward the signal towards the root
connect(nodes[i], SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)));
connect(nodes[i], SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)));
connect(nodes[i], SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)));
connect(nodes[i], SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)));
connect(nodes[i], SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)));
}
emit addedChildren(this, index, indexTo);
}

void QgsLayerTreeNode::removeChildAt(int i)
@@ -109,12 +118,12 @@ void QgsLayerTreeNode::removeChildrenRange(int from, int count)
return;

int to = from+count-1;
emit willRemoveChildren(from, to);
emit willRemoveChildren(this, from, to);
while (--count >= 0)
{
QgsLayerTreeNode* node = mChildren.takeAt(from);
node->mParent = 0;
delete node;
}
emit removedChildren(from, to);
emit removedChildren(this, from, to);
}
@@ -49,11 +49,11 @@ class CORE_EXPORT QgsLayerTreeNode : public QObject

// low-level signals (mainly for the model)

void willAddChildren(int indexFrom, int indexTo);
void addedChildren(int indexFrom, int indexTo);
void willAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void addedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);

void willRemoveChildren(int indexFrom, int indexTo);
void removedChildren(int indexFrom, int indexTo);
void willRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void removedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);

void visibilityChanged(Qt::CheckState state);

@@ -16,7 +16,8 @@ QgsLayerTreeRegistryBridge::QgsLayerTreeRegistryBridge(QgsLayerTreeGroup *root,
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersAdded(QList<QgsMapLayer*>)), this, SLOT(layersAdded(QList<QgsMapLayer*>)));
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersWillBeRemoved(QStringList)), this, SLOT(layersWillBeRemoved(QStringList)));

connectToGroup(mRoot);
connect(mRoot, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SLOT(groupWillRemoveChildren(QgsLayerTreeNode*,int,int)));
connect(mRoot, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(groupRemovedChildren()));
}

void QgsLayerTreeRegistryBridge::setLayerInsertionPoint(QgsLayerTreeGroup* parentGroup, int index)
@@ -59,19 +60,6 @@ void QgsLayerTreeRegistryBridge::layersWillBeRemoved(QStringList layerIds)
}


void QgsLayerTreeRegistryBridge::groupAddedChildren(int indexFrom, int indexTo)
{
QgsLayerTreeGroup* group = qobject_cast<QgsLayerTreeGroup*>(sender());
Q_ASSERT(group);

for (int i = indexFrom; i <= indexTo; ++i)
{
QgsLayerTreeNode* child = group->children()[i];
if (QgsLayerTree::isGroup(child))
connectToGroup(QgsLayerTree::toGroup(child));
}
}

static void _collectLayerIdsInGroup(QgsLayerTreeGroup* group, int indexFrom, int indexTo, QStringList& lst)
{
for (int i = indexFrom; i <= indexTo; ++i)
@@ -88,12 +76,12 @@ static void _collectLayerIdsInGroup(QgsLayerTreeGroup* group, int indexFrom, int
}
}

void QgsLayerTreeRegistryBridge::groupWillRemoveChildren(int indexFrom, int indexTo)
void QgsLayerTreeRegistryBridge::groupWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
{
Q_ASSERT(mLayerIdsForRemoval.isEmpty());

QgsLayerTreeGroup* group = qobject_cast<QgsLayerTreeGroup*>(sender());
Q_ASSERT(group);
Q_ASSERT(QgsLayerTree::isGroup(node));
QgsLayerTreeGroup* group = QgsLayerTree::toGroup(node);

_collectLayerIdsInGroup(group, indexFrom, indexTo, mLayerIdsForRemoval);
}
@@ -110,17 +98,3 @@ void QgsLayerTreeRegistryBridge::groupRemovedChildren()

QgsMapLayerRegistry::instance()->removeMapLayers(toRemove);
}

void QgsLayerTreeRegistryBridge::connectToGroup(QgsLayerTreeGroup* group)
{
connect(group, SIGNAL(addedChildren(int,int)), this, SLOT(groupAddedChildren(int,int)));
connect(group, SIGNAL(willRemoveChildren(int,int)), this, SLOT(groupWillRemoveChildren(int,int)));
connect(group, SIGNAL(removedChildren(int,int)), this, SLOT(groupRemovedChildren()));

foreach (QgsLayerTreeNode* child, group->children())
{
if (QgsLayerTree::isGroup(child))
connectToGroup(QgsLayerTree::toGroup(child));
}
}

@@ -5,6 +5,7 @@
#include <QStringList>

class QgsLayerTreeGroup;
class QgsLayerTreeNode;

class QgsMapLayer;

@@ -30,12 +31,10 @@ protected slots:
void layersAdded(QList<QgsMapLayer*> layers);
void layersWillBeRemoved(QStringList layerIds);

void groupAddedChildren(int indexFrom, int indexTo);
void groupWillRemoveChildren(int indexFrom, int indexTo);
void groupWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void groupRemovedChildren();

protected:
void connectToGroup(QgsLayerTreeGroup* group);

protected:
QgsLayerTreeGroup* mRoot;
@@ -11,7 +11,9 @@ QgsLayerTreeMapCanvasBridge::QgsLayerTreeMapCanvasBridge(QgsLayerTreeGroup *root
, mHasCustomLayerOrder(false)
{
connectToNode(root);
connect(root, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
connect(root, SIGNAL(customPropertyChanged(QgsLayerTreeNode*,QString)), this, SLOT(nodeCustomPropertyChanged(QgsLayerTreeNode*,QString)));
connect(root, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));

setCanvasLayers();
}
@@ -69,8 +71,6 @@ void QgsLayerTreeMapCanvasBridge::setCustomLayerOrder(const QStringList& order)

void QgsLayerTreeMapCanvasBridge::connectToNode(QgsLayerTreeNode *node)
{
connect(node, SIGNAL(addedChildren(int,int)), this, SLOT(nodeAddedChildren(int,int)));
connect(node, SIGNAL(removedChildren(int,int)), this, SLOT(nodeRemovedChildren()));
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanged()));

if (QgsLayerTree::isLayer(node))
@@ -126,11 +126,10 @@ void QgsLayerTreeMapCanvasBridge::deferredSetCanvasLayers()
QMetaObject::invokeMethod(this, "setCanvasLayers", Qt::QueuedConnection);
}

void QgsLayerTreeMapCanvasBridge::nodeAddedChildren(int indexFrom, int indexTo)
void QgsLayerTreeMapCanvasBridge::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
{
// connect to new children
Q_ASSERT(sender() && qobject_cast<QgsLayerTreeNode*>(sender()));
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
Q_ASSERT(node);
for (int i = indexFrom; i <= indexTo; ++i)
connectToNode(node->children()[i]);

@@ -40,7 +40,7 @@ public slots:
void deferredSetCanvasLayers();

protected slots:
void nodeAddedChildren(int indexFrom, int indexTo);
void nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void nodeRemovedChildren();
void nodeVisibilityChanged();
void nodeCustomPropertyChanged(QgsLayerTreeNode* node, QString key);
@@ -22,6 +22,11 @@ QgsLayerTreeModel::QgsLayerTreeModel(QgsLayerTreeGroup* rootNode, QObject *paren

// connect to all existing nodes
connectToNode(mRootNode);

connect(mRootNode, SIGNAL(willAddChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillAddChildren(QgsLayerTreeNode*,int,int)));
connect(mRootNode, SIGNAL(addedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeAddedChildren(QgsLayerTreeNode*,int,int)));
connect(mRootNode, SIGNAL(willRemoveChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeWillRemoveChildren(QgsLayerTreeNode*,int,int)));
connect(mRootNode, SIGNAL(removedChildren(QgsLayerTreeNode*,int,int)), this, SLOT(nodeRemovedChildren()));
}

QgsLayerTreeModel::~QgsLayerTreeModel()
@@ -33,10 +38,6 @@ QgsLayerTreeModel::~QgsLayerTreeModel()

void QgsLayerTreeModel::connectToNode(QgsLayerTreeNode* node)
{
connect(node, SIGNAL(willAddChildren(int,int)), this, SLOT(nodeWillAddChildren(int,int)));
connect(node, SIGNAL(addedChildren(int,int)), this, SLOT(nodeAddedChildren(int,int)));
connect(node, SIGNAL(willRemoveChildren(int,int)), this, SLOT(nodeWillRemoveChildren(int,int)));
connect(node, SIGNAL(removedChildren(int,int)), this, SLOT(nodeRemovedChildren()));
connect(node, SIGNAL(visibilityChanged(Qt::CheckState)), this, SLOT(nodeVisibilityChanded()));

if (QgsLayerTree::isLayer(node) && testFlag(ShowSymbology))
@@ -365,16 +366,14 @@ void QgsLayerTreeModel::refreshLayerSymbology(QgsLayerTreeLayer* nodeLayer)
addSymbologyToLayer(nodeLayer);
}

void QgsLayerTreeModel::nodeWillAddChildren(int indexFrom, int indexTo)
void QgsLayerTreeModel::nodeWillAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
{
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
Q_ASSERT(node);
beginInsertRows(node2index(node), indexFrom, indexTo);
}

void QgsLayerTreeModel::nodeAddedChildren(int indexFrom, int indexTo)
void QgsLayerTreeModel::nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
{
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
Q_ASSERT(node);

endInsertRows();
@@ -383,9 +382,8 @@ void QgsLayerTreeModel::nodeAddedChildren(int indexFrom, int indexTo)
connectToNode( node->children()[i] );
}

void QgsLayerTreeModel::nodeWillRemoveChildren(int indexFrom, int indexTo)
void QgsLayerTreeModel::nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo)
{
QgsLayerTreeNode* node = qobject_cast<QgsLayerTreeNode*>(sender());
Q_ASSERT(node);

beginRemoveRows(node2index(node), indexFrom, indexTo);
@@ -79,9 +79,9 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
signals:

protected slots:
void nodeWillAddChildren(int indexFrom, int indexTo);
void nodeAddedChildren(int indexFrom, int indexTo);
void nodeWillRemoveChildren(int indexFrom, int indexTo);
void nodeWillAddChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void nodeAddedChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void nodeWillRemoveChildren(QgsLayerTreeNode* node, int indexFrom, int indexTo);
void nodeRemovedChildren();

void nodeVisibilityChanded();

0 comments on commit 1a61c15

Please sign in to comment.