Skip to content

Commit bbdf144

Browse files
committed
Double-click handling, changed current layer handling
1 parent ca97459 commit bbdf144

File tree

4 files changed

+65
-18
lines changed

4 files changed

+65
-18
lines changed

src/app/qgisapp.cpp

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -375,6 +375,30 @@ void QgisApp::emitCustomSrsValidation( QgsCoordinateReferenceSystem &srs )
375375
emit customSrsValidation( srs );
376376
}
377377

378+
void QgisApp::layerTreeViewDoubleClicked(const QModelIndex& index)
379+
{
380+
Q_UNUSED( index );
381+
382+
QSettings settings;
383+
switch ( settings.value( "/qgis/legendDoubleClickAction", 0 ).toInt() )
384+
{
385+
case 0:
386+
QgisApp::instance()->layerProperties();
387+
break;
388+
case 1:
389+
QgisApp::instance()->attributeTable();
390+
break;
391+
default:
392+
break;
393+
}
394+
}
395+
396+
void QgisApp::activeLayerChanged(QgsMapLayer* layer)
397+
{
398+
if ( mMapCanvas )
399+
mMapCanvas->setCurrentLayer( layer );
400+
}
401+
378402
/**
379403
* This function contains forced validation of CRS used in QGIS.
380404
* There are 3 options depending on the settings:
@@ -2359,6 +2383,9 @@ void QgisApp::initLayerTreeView()
23592383
mLayerTreeView->setModel( model );
23602384
mLayerTreeView->setMenuProvider( new QgsAppLayerTreeViewMenuProvider(mLayerTreeView, mMapCanvas) );
23612385

2386+
connect( mLayerTreeView, SIGNAL(doubleClicked(QModelIndex)), this, SLOT(layerTreeViewDoubleClicked(QModelIndex)) );
2387+
connect( mLayerTreeView, SIGNAL(currentLayerChanged(QgsMapLayer*)), this, SLOT(activeLayerChanged(QgsMapLayer*)) );
2388+
23622389
mLayerTreeDock->setWidget( mLayerTreeView );
23632390
addDockWidget( Qt::LeftDockWidgetArea, mLayerTreeDock );
23642391
}
@@ -7474,7 +7501,7 @@ void QgisApp::openURL( QString url, bool useQgisDocDirectory )
74747501
/** Get a pointer to the currently selected map layer */
74757502
QgsMapLayer *QgisApp::activeLayer()
74767503
{
7477-
return mMapLegend ? mMapLegend->currentLayer() : 0;
7504+
return mLayerTreeView ? mLayerTreeView->currentLayer() : 0;
74787505
}
74797506

74807507
/** set the current layer */

src/app/qgisapp.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -466,6 +466,8 @@ class APP_EXPORT QgisApp : public QMainWindow, private Ui::MainWindow
466466
#endif
467467

468468
public slots:
469+
void layerTreeViewDoubleClicked(const QModelIndex& index);
470+
void activeLayerChanged(QgsMapLayer* layer);
469471
//! Zoom to full extent
470472
void zoomFull();
471473
//! Zoom to the previous extent

src/gui/layertree/qgslayertreeview.cpp

Lines changed: 32 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,6 @@
99

1010
QgsLayerTreeView::QgsLayerTreeView(QWidget *parent)
1111
: QTreeView(parent)
12-
, mCurrentLayer(0)
1312
, mDefaultActions(0)
1413
, mMenuProvider(0)
1514
{
@@ -18,6 +17,7 @@ QgsLayerTreeView::QgsLayerTreeView(QWidget *parent)
1817
setDragEnabled(true);
1918
setAcceptDrops(true);
2019
setDropIndicatorShown(true);
20+
setEditTriggers(EditKeyPressed | SelectedClicked);
2121

2222
setSelectionMode(ExtendedSelection);
2323

@@ -39,7 +39,7 @@ void QgsLayerTreeView::setModel(QAbstractItemModel* model)
3939

4040
QTreeView::setModel(model);
4141

42-
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onCurrentChanged(QModelIndex)));
42+
connect(selectionModel(), SIGNAL(currentChanged(QModelIndex,QModelIndex)), this, SLOT(onCurrentChanged(QModelIndex,QModelIndex)));
4343

4444
updateExpandedStateFromNode(layerTreeModel()->rootGroup());
4545
}
@@ -64,16 +64,16 @@ void QgsLayerTreeView::setMenuProvider(QgsLayerTreeViewMenuProvider* menuProvide
6464

6565
QgsMapLayer* QgsLayerTreeView::currentLayer() const
6666
{
67-
return mCurrentLayer;
67+
return layerForIndex( currentIndex() );
6868
}
6969

7070
void QgsLayerTreeView::setCurrentLayer(QgsMapLayer* layer)
7171
{
72-
if (mCurrentLayer == layer)
72+
QgsLayerTreeLayer* nodeLayer = layerTreeModel()->rootGroup()->findLayer(layer->id());
73+
if (!nodeLayer)
7374
return;
7475

75-
mCurrentLayer = layer;
76-
emit currentLayerChanged(mCurrentLayer);
76+
setCurrentIndex( layerTreeModel()->node2index(nodeLayer) );
7777
}
7878

7979

@@ -117,17 +117,16 @@ void QgsLayerTreeView::updateExpandedStateToNode(QModelIndex index)
117117
node->setExpanded(isExpanded(index));
118118
}
119119

120-
void QgsLayerTreeView::onCurrentChanged(QModelIndex current)
120+
void QgsLayerTreeView::onCurrentChanged(QModelIndex current, QModelIndex previous)
121121
{
122-
QgsLayerTreeNode* node = layerTreeModel()->index2node(current);
123-
if (!node)
124-
return; // TODO: maybe also support symbology nodes
122+
QgsMapLayer* layerPrevious = layerForIndex(previous);
123+
QgsMapLayer* layerCurrent = layerForIndex(current);
125124

126-
QgsMapLayer* layer = 0;
127-
if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
128-
layer = static_cast<QgsLayerTreeLayer*>(node)->layer();
125+
if (layerPrevious == layerCurrent)
126+
return;
129127

130-
setCurrentLayer(layer);
128+
qDebug("current layer changed!");
129+
emit currentLayerChanged(layerCurrent);
131130
}
132131

133132
void QgsLayerTreeView::updateExpandedStateFromNode(QgsLayerTreeNode* node)
@@ -139,6 +138,25 @@ void QgsLayerTreeView::updateExpandedStateFromNode(QgsLayerTreeNode* node)
139138
updateExpandedStateFromNode(child);
140139
}
141140

141+
QgsMapLayer* QgsLayerTreeView::layerForIndex(const QModelIndex& index) const
142+
{
143+
QgsLayerTreeNode* node = layerTreeModel()->index2node(index);
144+
if (node)
145+
{
146+
if (node->nodeType() == QgsLayerTreeNode::NodeLayer)
147+
return static_cast<QgsLayerTreeLayer*>(node)->layer();
148+
}
149+
else
150+
{
151+
// possibly a symbology node
152+
QgsLayerTreeModelSymbologyNode* symnode = layerTreeModel()->index2symnode(index);
153+
if (symnode)
154+
return symnode->parent()->layer();
155+
}
156+
157+
return 0;
158+
}
159+
142160
QgsLayerTreeNode* QgsLayerTreeView::currentNode() const
143161
{
144162
return layerTreeModel()->index2node(selectionModel()->currentIndex());

src/gui/layertree/qgslayertreeview.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -41,6 +41,8 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
4141

4242
void updateExpandedStateFromNode(QgsLayerTreeNode* node);
4343

44+
QgsMapLayer* layerForIndex(const QModelIndex& index) const;
45+
4446
signals:
4547
void currentLayerChanged(QgsMapLayer* layer);
4648

@@ -52,11 +54,9 @@ protected slots:
5254

5355
void updateExpandedStateToNode(QModelIndex index);
5456

55-
void onCurrentChanged(QModelIndex current);
57+
void onCurrentChanged(QModelIndex current, QModelIndex previous);
5658

5759
protected:
58-
QgsMapLayer* mCurrentLayer;
59-
6060
QgsLayerTreeViewDefaultActions* mDefaultActions;
6161
QgsLayerTreeViewMenuProvider* mMenuProvider;
6262
};

0 commit comments

Comments
 (0)