Skip to content

Commit 6beb7d7

Browse files
committed
Deactivate old legend. Improve insertion of new layers into layer tree.
1 parent c9f9ea8 commit 6beb7d7

9 files changed

Lines changed: 70 additions & 2 deletions

File tree

‎src/app/legend/qgslegend.cpp‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -88,6 +88,7 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
8888
{
8989
setObjectName( name );
9090

91+
#if 0
9192
connect( this, SIGNAL( itemChanged( QTreeWidgetItem*, int ) ),
9293
this, SLOT( handleItemChange( QTreeWidgetItem*, int ) ) );
9394

@@ -117,6 +118,8 @@ QgsLegend::QgsLegend( QgsMapCanvas *canvas, QWidget * parent, const char *name )
117118

118119
connect( mMapCanvas, SIGNAL( layersChanged() ),
119120
this, SLOT( refreshCheckStates() ) );
121+
#endif
122+
120123
#if 0
121124
// too much
122125
connect( mMapCanvas, SIGNAL( extentsChanged() ),

‎src/app/qgisapp.cpp‎

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -135,8 +135,10 @@
135135
#include "qgsgpsinformationwidget.h"
136136
#include "qgsguivectorlayertools.h"
137137
#include "qgslabelinggui.h"
138+
#include "qgslayertreemapcanvasbridge.h"
138139
#include "qgslayertreemodel.h"
139140
#include "qgslayertreenode.h"
141+
#include "qgslayertreeregistrybridge.h"
140142
#include "qgslayertreeutils.h"
141143
#include "qgslayertreeview.h"
142144
#include "qgslayertreeviewdefaultactions.h"
@@ -2226,9 +2228,37 @@ void QgisApp::initLayerTreeView()
22262228

22272229
connect( mLayerTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(layerTreeViewDoubleClicked(QModelIndex)) );
22282230
connect( mLayerTreeView, SIGNAL(currentLayerChanged(QgsMapLayer*)), this, SLOT(activeLayerChanged(QgsMapLayer*)) );
2231+
connect( mLayerTreeView->selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(layerTreeViewCurrentChanged(QModelIndex,QModelIndex)));
22292232

22302233
mLayerTreeDock->setWidget( mLayerTreeView );
22312234
addDockWidget( Qt::LeftDockWidgetArea, mLayerTreeDock );
2235+
2236+
QgsLayerTreeMapCanvasBridge* bridge = new QgsLayerTreeMapCanvasBridge( QgsProject::instance()->layerTreeRoot(), mMapCanvas );
2237+
bridge->setParent(this);
2238+
}
2239+
2240+
2241+
void QgisApp::layerTreeViewCurrentChanged(const QModelIndex& current, const QModelIndex& previous)
2242+
{
2243+
Q_UNUSED(previous);
2244+
2245+
// defaults
2246+
QgsLayerTreeGroup* parentGroup = mLayerTreeView->layerTreeModel()->rootGroup();
2247+
int index = 0;
2248+
2249+
if (current.isValid())
2250+
{
2251+
if (QgsLayerTreeNode* currentNode = mLayerTreeView->currentNode())
2252+
{
2253+
QgsLayerTreeNode* parentNode = currentNode->parent();
2254+
if (parentNode && parentNode->nodeType() == QgsLayerTreeNode::NodeGroup)
2255+
parentGroup = static_cast<QgsLayerTreeGroup*>(parentNode);
2256+
}
2257+
2258+
index = current.row();
2259+
}
2260+
2261+
QgsProject::instance()->layerTreeRegistryBridge()->setLayerInsertionPoint(parentGroup, index);
22322262
}
22332263

22342264

‎src/app/qgisapp.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -469,6 +469,7 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
469469

470470
public slots:
471471
void layerTreeViewDoubleClicked(const QModelIndex& index);
472+
void layerTreeViewCurrentChanged(const QModelIndex& current, const QModelIndex& previous);
472473
void activeLayerChanged(QgsMapLayer* layer);
473474
//! Zoom to full extent
474475
void zoomFull();

‎src/core/layertree/qgslayertreenode.cpp‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -145,6 +145,13 @@ QgsLayerTreeGroup* QgsLayerTreeGroup::addGroup(const QString &name)
145145
return grp;
146146
}
147147

148+
QgsLayerTreeLayer*QgsLayerTreeGroup::insertLayer(int index, QgsMapLayer* layer)
149+
{
150+
QgsLayerTreeLayer* ll = new QgsLayerTreeLayer(layer);
151+
insertChildNode( index, ll );
152+
return ll;
153+
}
154+
148155
QgsLayerTreeLayer* QgsLayerTreeGroup::addLayer(QgsMapLayer* layer)
149156
{
150157
QgsLayerTreeLayer* ll = new QgsLayerTreeLayer(layer);

‎src/core/layertree/qgslayertreenode.h‎

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,7 @@ class QgsLayerTreeGroup : public QgsLayerTreeNode
148148
void setName(const QString& n) { mName = n; }
149149

150150
QgsLayerTreeGroup* addGroup(const QString& name);
151+
QgsLayerTreeLayer* insertLayer(int index, QgsMapLayer* layer);
151152
QgsLayerTreeLayer* addLayer(QgsMapLayer* layer);
152153

153154
void insertChildNodes(int index, QList<QgsLayerTreeNode*> nodes);

‎src/core/layertree/qgslayertreeregistrybridge.cpp‎

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,21 +10,30 @@ QgsLayerTreeRegistryBridge::QgsLayerTreeRegistryBridge(QgsLayerTreeGroup *root,
1010
: QObject(parent)
1111
, mRoot(root)
1212
, mEnabled(true)
13+
, mInsertionPointGroup(root)
14+
, mInsertionPointIndex(0)
1315
{
1416
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersAdded(QList<QgsMapLayer*>)), this, SLOT(layersAdded(QList<QgsMapLayer*>)));
1517
connect(QgsMapLayerRegistry::instance(), SIGNAL(layersWillBeRemoved(QStringList)), this, SLOT(layersWillBeRemoved(QStringList)));
1618

1719
connectToGroup(mRoot);
1820
}
1921

22+
void QgsLayerTreeRegistryBridge::setLayerInsertionPoint(QgsLayerTreeGroup* parentGroup, int index)
23+
{
24+
mInsertionPointGroup = parentGroup;
25+
mInsertionPointIndex = index;
26+
}
27+
2028
void QgsLayerTreeRegistryBridge::layersAdded(QList<QgsMapLayer*> layers)
2129
{
2230
if (!mEnabled)
2331
return;
2432

2533
foreach (QgsMapLayer* layer, layers)
2634
{
27-
QgsLayerTreeLayer* nodeLayer = mRoot->addLayer(layer);
35+
// add new layer to the top
36+
QgsLayerTreeLayer* nodeLayer = mInsertionPointGroup->insertLayer(mInsertionPointIndex, layer);
2837

2938
// check whether the layer is marked as embedded
3039
QString projectFile = QgsProject::instance()->layerIsEmbedded(nodeLayer->layerId());

‎src/core/layertree/qgslayertreeregistrybridge.h‎

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ class CORE_EXPORT QgsLayerTreeRegistryBridge : public QObject
2020
void setEnabled(bool enabled) { mEnabled = enabled; }
2121
bool isEnabled() const { return mEnabled; }
2222

23+
//! Set where the new layers should be inserted - can be used to follow current selection.
24+
//! By default it is root group with zero index.
25+
void setLayerInsertionPoint(QgsLayerTreeGroup* parentGroup, int index);
26+
2327
signals:
2428

2529
protected slots:
@@ -37,6 +41,9 @@ protected slots:
3741
QgsLayerTreeGroup* mRoot;
3842
QStringList mLayerIdsForRemoval;
3943
bool mEnabled;
44+
45+
QgsLayerTreeGroup* mInsertionPointGroup;
46+
int mInsertionPointIndex;
4047
};
4148

4249
#endif // QGSLAYERTREEREGISTRYBRIDGE_H

‎src/core/qgsproject.h‎

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,6 +336,9 @@ class CORE_EXPORT QgsProject : public QObject
336336
* @node added in 2.4 */
337337
QgsLayerTreeGroup* layerTreeRoot() const;
338338

339+
/** Return pointer to the helper class that synchronizes map layer registry with layer tree */
340+
QgsLayerTreeRegistryBridge* layerTreeRegistryBridge() const { return mLayerTreeRegistryBridge; }
341+
339342
protected:
340343

341344
/** Set error message from read/write operation

‎src/gui/layertree/qgslayertreeview.cpp‎

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -164,10 +164,17 @@ QgsLayerTreeNode* QgsLayerTreeView::currentNode() const
164164

165165
QgsLayerTreeGroup* QgsLayerTreeView::currentGroupNode() const
166166
{
167-
// TODO: also handle if a layer / symbology is selected within a group?
168167
QgsLayerTreeNode* node = currentNode();
169168
if (node && node->nodeType() == QgsLayerTreeNode::NodeGroup)
170169
return static_cast<QgsLayerTreeGroup*>(node);
170+
else if (node && node->nodeType() == QgsLayerTreeNode::NodeLayer)
171+
{
172+
QgsLayerTreeNode* parent = node->parent();
173+
if (parent && parent->nodeType() == QgsLayerTreeNode::NodeGroup)
174+
return static_cast<QgsLayerTreeGroup*>(node);
175+
}
176+
// TODO: also handle if symbology is selected?
177+
171178
return 0;
172179
}
173180

0 commit comments

Comments
 (0)