Skip to content

Commit ea910d8

Browse files
committedOct 22, 2014
Fix #11369 (New layers are not active with new legend)
1 parent c9e05f9 commit ea910d8

File tree

5 files changed

+36
-4
lines changed

5 files changed

+36
-4
lines changed
 

‎python/gui/layertree/qgslayertreeview.sip

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,13 @@ class QgsLayerTreeView : QTreeView
6363
//! Get list of selected layers
6464
QList<QgsMapLayer*> selectedLayers() const;
6565

66+
//! if enabled, current selection will be automatically changed to the newly added layer node.
67+
//! This is purely for user's convenience so they do not need to click on the layer explicitly.
68+
//! @note added in 2.6
69+
void setAutoSelectAddedLayers( bool enabled );
70+
//! @note added in 2.6
71+
bool autoSelectAddedLayers() const;
72+
6673
public slots:
6774
//! Force refresh of layer symbology. Normally not needed as the changes of layer's renderer are monitored by the model
6875
void refreshLayerSymbology( const QString& layerId );

‎src/app/qgisapp.cpp

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2315,6 +2315,7 @@ void QgisApp::initLayerTreeView()
23152315

23162316
mLayerTreeView->setModel( model );
23172317
mLayerTreeView->setMenuProvider( new QgsAppLayerTreeViewMenuProvider( mLayerTreeView, mMapCanvas ) );
2318+
mLayerTreeView->setAutoSelectAddedLayers( true );
23182319

23192320
setupLayerTreeViewFromSettings();
23202321

@@ -3797,6 +3798,11 @@ bool QgisApp::addProject( QString projectFile )
37973798
// close the previous opened project if any
37983799
closeProject();
37993800

3801+
// temporarily disable auto-select for project loading
3802+
// (having it on all the time would give inconsistent results,
3803+
// e.g. we select the first node if it is a layer, but not if it is a group)
3804+
mLayerTreeView->setAutoSelectAddedLayers( false );
3805+
38003806
if ( ! QgsProject::instance()->read( projectFile ) )
38013807
{
38023808
QApplication::restoreOverrideCursor();
@@ -3812,6 +3818,8 @@ bool QgisApp::addProject( QString projectFile )
38123818
return false;
38133819
}
38143820

3821+
mLayerTreeView->setAutoSelectAddedLayers( true );
3822+
38153823
setTitleBarText_( *this );
38163824
int myRedInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorRedPart", 255 );
38173825
int myGreenInt = QgsProject::instance()->readNumEntry( "Gui", "/CanvasColorGreenPart", 255 );

‎src/core/layertree/qgslayertreeregistrybridge.cpp

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,14 +49,13 @@ void QgsLayerTreeRegistryBridge::layersAdded( QList<QgsMapLayer*> layers )
4949
if ( !mEnabled )
5050
return;
5151

52-
int i = 0;
52+
QList<QgsLayerTreeNode*> nodes;
5353
foreach ( QgsMapLayer* layer, layers )
5454
{
5555
QgsLayerTreeLayer* nodeLayer = new QgsLayerTreeLayer( layer );
5656
nodeLayer->setVisible( mNewLayersVisible ? Qt::Checked : Qt::Unchecked );
5757

58-
// add new layer to the top
59-
mInsertionPointGroup->insertChildNode( mInsertionPointIndex + i++, nodeLayer );
58+
nodes << nodeLayer;
6059

6160
// check whether the layer is marked as embedded
6261
QString projectFile = QgsProject::instance()->layerIsEmbedded( nodeLayer->layerId() );
@@ -66,6 +65,9 @@ void QgsLayerTreeRegistryBridge::layersAdded( QList<QgsMapLayer*> layers )
6665
nodeLayer->setCustomProperty( "embedded_project", projectFile );
6766
}
6867
}
68+
69+
// add new layers to the right place
70+
mInsertionPointGroup->insertChildNodes( mInsertionPointIndex, nodes );
6971
}
7072

7173
void QgsLayerTreeRegistryBridge::layersWillBeRemoved( QStringList layerIds )

‎src/gui/layertree/qgslayertreeview.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ QgsLayerTreeView::QgsLayerTreeView( QWidget *parent )
2828
: QTreeView( parent )
2929
, mDefaultActions( 0 )
3030
, mMenuProvider( 0 )
31+
, mAutoSelectAddedLayers( false )
3132
{
3233
setHeaderHidden( true );
3334

@@ -131,11 +132,16 @@ void QgsLayerTreeView::modelRowsInserted( QModelIndex index, int start, int end
131132
if ( QgsLayerTree::isLayer( parentNode ) )
132133
return; // layers have only symbology nodes (no expanded/collapsed handling)
133134

135+
QList<QgsLayerTreeNode*> children = parentNode->children();
134136
for ( int i = start; i <= end; ++i )
135137
{
136-
updateExpandedStateFromNode( parentNode->children()[i] );
138+
updateExpandedStateFromNode( children[i] );
137139
}
138140

141+
// make newly added layer active (if auto-select is enabled)
142+
if ( mAutoSelectAddedLayers && QgsLayerTree::isLayer( children[start] ) )
143+
setCurrentIndex( layerTreeModel()->node2index( children[start] ) );
144+
139145
// make sure we still have correct current layer
140146
onCurrentChanged();
141147
}

‎src/gui/layertree/qgslayertreeview.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,13 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
8181
//! Get list of selected layers
8282
QList<QgsMapLayer*> selectedLayers() const;
8383

84+
//! if enabled, current selection will be automatically changed to the newly added layer node.
85+
//! This is purely for user's convenience so they do not need to click on the layer explicitly.
86+
//! @note added in 2.6
87+
void setAutoSelectAddedLayers( bool enabled ) { mAutoSelectAddedLayers = enabled; }
88+
//! @note added in 2.6
89+
bool autoSelectAddedLayers() const { return mAutoSelectAddedLayers; }
90+
8491
public slots:
8592
//! Force refresh of layer symbology. Normally not needed as the changes of layer's renderer are monitored by the model
8693
void refreshLayerSymbology( const QString& layerId );
@@ -114,6 +121,8 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
114121
QgsLayerTreeViewMenuProvider* mMenuProvider;
115122
//! Keeps track of current layer ID (to check when to emit signal about change of current layer)
116123
QString mCurrentLayerID;
124+
//! Indicates whether the view should select newly added layers when they are added to the model
125+
bool mAutoSelectAddedLayers;
117126
};
118127

119128

0 commit comments

Comments
 (0)
Please sign in to comment.