Skip to content

Commit 2c51dcb

Browse files
committedMay 25, 2014
Fix #10339 (crash when reordering layers)
This was caused by the recent addition of currentNode handling in model. Changed to use persistent indices which are auto-updated when model changes.
1 parent e4b2d43 commit 2c51dcb

File tree

4 files changed

+31
-29
lines changed

4 files changed

+31
-29
lines changed
 

‎src/gui/layertree/qgslayertreemodel.cpp

Lines changed: 8 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,6 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
3232
: QAbstractItemModel( parent )
3333
, mRootNode( rootNode )
3434
, mFlags( ShowSymbology )
35-
, mCurrentNode( 0 )
3635
{
3736
Q_ASSERT( mRootNode );
3837

@@ -242,7 +241,7 @@ QVariant QgsLayerTreeModel::data( const QModelIndex &index, int role ) const
242241
f.setItalic( true );
243242
if ( QgsLayerTree::isLayer( node ) )
244243
f.setBold( true );
245-
if ( node == mCurrentNode )
244+
if ( index == mCurrentIndex )
246245
f.setUnderline( true );
247246
return f;
248247
}
@@ -402,21 +401,15 @@ void QgsLayerTreeModel::refreshLayerSymbology( QgsLayerTreeLayer* nodeLayer )
402401
addSymbologyToLayer( nodeLayer );
403402
}
404403

405-
void QgsLayerTreeModel::setCurrentNode( QgsLayerTreeNode* currentNode )
404+
void QgsLayerTreeModel::setCurrentIndex( const QModelIndex& currentIndex )
406405
{
407-
if ( mCurrentNode )
408-
{
409-
QModelIndex idx = node2index( mCurrentNode );
410-
emit dataChanged( idx, idx );
411-
}
412-
413-
mCurrentNode = currentNode;
406+
QModelIndex oldIndex = mCurrentIndex;
407+
mCurrentIndex = currentIndex;
414408

415-
if ( mCurrentNode )
416-
{
417-
QModelIndex idx = node2index( mCurrentNode );
418-
emit dataChanged( idx, idx );
419-
}
409+
if ( oldIndex.isValid() )
410+
emit dataChanged( oldIndex, oldIndex );
411+
if ( currentIndex.isValid() )
412+
emit dataChanged( currentIndex, currentIndex );
420413
}
421414

422415
void QgsLayerTreeModel::nodeWillAddChildren( QgsLayerTreeNode* node, int indexFrom, int indexTo )

‎src/gui/layertree/qgslayertreemodel.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -96,8 +96,8 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
9696

9797
void refreshLayerSymbology( QgsLayerTreeLayer* nodeLayer );
9898

99-
QgsLayerTreeNode* currentNode() const { return mCurrentNode; }
100-
void setCurrentNode( QgsLayerTreeNode* currentNode );
99+
QModelIndex currentIndex() const { return mCurrentIndex; }
100+
void setCurrentIndex( const QModelIndex& currentIndex );
101101

102102
signals:
103103

@@ -132,7 +132,7 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
132132

133133
QMap<QgsLayerTreeLayer*, QList<QgsLayerTreeModelSymbologyNode*> > mSymbologyNodes;
134134

135-
QgsLayerTreeNode* mCurrentNode;
135+
QPersistentModelIndex mCurrentIndex;
136136
};
137137

138138
Q_DECLARE_OPERATORS_FOR_FLAGS( QgsLayerTreeModel::Flags )

‎src/gui/layertree/qgslayertreeview.cpp

Lines changed: 17 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -53,10 +53,11 @@ void QgsLayerTreeView::setModel( QAbstractItemModel* model )
5353
return;
5454

5555
connect( model, SIGNAL( rowsInserted( QModelIndex, int, int ) ), this, SLOT( modelRowsInserted( QModelIndex, int, int ) ) );
56+
connect( model, SIGNAL( rowsRemoved( QModelIndex, int, int ) ), this, SLOT( modelRowsRemoved( QModelIndex, int, int ) ) );
5657

5758
QTreeView::setModel( model );
5859

59-
connect( selectionModel(), SIGNAL( currentChanged( QModelIndex, QModelIndex ) ), this, SLOT( onCurrentChanged( QModelIndex, QModelIndex ) ) );
60+
connect( selectionModel(), SIGNAL( currentChanged( QModelIndex, QModelIndex ) ), this, SLOT( onCurrentChanged() ) );
6061

6162
updateExpandedStateFromNode( layerTreeModel()->rootGroup() );
6263
}
@@ -123,6 +124,15 @@ void QgsLayerTreeView::modelRowsInserted( QModelIndex index, int start, int end
123124
{
124125
updateExpandedStateFromNode( parentNode->children()[i] );
125126
}
127+
128+
// make sure we still have correct current layer
129+
onCurrentChanged();
130+
}
131+
132+
void QgsLayerTreeView::modelRowsRemoved()
133+
{
134+
// make sure we still have correct current layer
135+
onCurrentChanged();
126136
}
127137

128138
void QgsLayerTreeView::updateExpandedStateToNode( QModelIndex index )
@@ -134,19 +144,16 @@ void QgsLayerTreeView::updateExpandedStateToNode( QModelIndex index )
134144
node->setExpanded( isExpanded( index ) );
135145
}
136146

137-
void QgsLayerTreeView::onCurrentChanged( QModelIndex current, QModelIndex previous )
147+
void QgsLayerTreeView::onCurrentChanged()
138148
{
139-
QgsMapLayer* layerPrevious = layerForIndex( previous );
140-
QgsMapLayer* layerCurrent = layerForIndex( current );
141-
142-
if ( layerPrevious == layerCurrent )
149+
QgsMapLayer* layerCurrent = layerForIndex( currentIndex() );
150+
QModelIndex layerCurrentIndex = layerCurrent ? layerTreeModel()->node2index( layerTreeModel()->rootGroup()->findLayer( layerCurrent->id() ) ) : QModelIndex();
151+
if ( mCurrentIndex == layerCurrentIndex )
143152
return;
144153

145-
if ( layerCurrent )
146-
layerTreeModel()->setCurrentNode( layerTreeModel()->rootGroup()->findLayer( layerCurrent->id() ) );
147-
else
148-
layerTreeModel()->setCurrentNode( 0 );
154+
layerTreeModel()->setCurrentIndex( layerCurrentIndex );
149155

156+
mCurrentIndex = layerCurrentIndex;
150157
emit currentLayerChanged( layerCurrent );
151158
}
152159

‎src/gui/layertree/qgslayertreeview.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,14 +70,16 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
7070
protected slots:
7171

7272
void modelRowsInserted( QModelIndex index, int start, int end );
73+
void modelRowsRemoved();
7374

7475
void updateExpandedStateToNode( QModelIndex index );
7576

76-
void onCurrentChanged( QModelIndex current, QModelIndex previous );
77+
void onCurrentChanged();
7778

7879
protected:
7980
QgsLayerTreeViewDefaultActions* mDefaultActions;
8081
QgsLayerTreeViewMenuProvider* mMenuProvider;
82+
QPersistentModelIndex mCurrentIndex;
8183
};
8284

8385
/** interface to allow custom menus */

0 commit comments

Comments
 (0)