Skip to content

Commit d6860f3

Browse files
committedOct 31, 2016
Fix layer tree expanded state when used expand/collapse all (fixes #15691)
(cherry picked from commit de85fdd)
1 parent afd04eb commit d6860f3

File tree

4 files changed

+64
-2
lines changed

4 files changed

+64
-2
lines changed
 

‎python/gui/layertree/qgslayertreeview.sip

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,14 @@ class QgsLayerTreeView : QTreeView
7272
//! Force refresh of layer symbology. Normally not needed as the changes of layer's renderer are monitored by the model
7373
void refreshLayerSymbology( const QString& layerId );
7474

75+
//! Enhancement of QTreeView::expandAll() that also records expanded state in layer tree nodes
76+
//! @note added in QGIS 2.18
77+
void expandAllNodes();
78+
79+
//! Enhancement of QTreeView::collapseAll() that also records expanded state in layer tree nodes
80+
//! @note added in QGIS 2.18
81+
void collapseAllNodes();
82+
7583
signals:
7684
//! Emitted when a current layer is changed
7785
void currentLayerChanged( QgsMapLayer* layer );

‎src/app/qgisapp.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2757,11 +2757,11 @@ void QgisApp::initLayerTreeView()
27572757
QAction* actionExpandAll = new QAction( tr( "Expand All" ), this );
27582758
actionExpandAll->setIcon( QgsApplication::getThemeIcon( "/mActionExpandTree.svg" ) );
27592759
actionExpandAll->setToolTip( tr( "Expand All" ) );
2760-
connect( actionExpandAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( expandAll() ) );
2760+
connect( actionExpandAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( expandAllNodes() ) );
27612761
QAction* actionCollapseAll = new QAction( tr( "Collapse All" ), this );
27622762
actionCollapseAll->setIcon( QgsApplication::getThemeIcon( "/mActionCollapseTree.svg" ) );
27632763
actionCollapseAll->setToolTip( tr( "Collapse All" ) );
2764-
connect( actionCollapseAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( collapseAll() ) );
2764+
connect( actionCollapseAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( collapseAllNodes() ) );
27652765

27662766
QToolBar* toolbar = new QToolBar();
27672767
toolbar->setIconSize( QSize( 16, 16 ) );

‎src/gui/layertree/qgslayertreeview.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -313,3 +313,49 @@ void QgsLayerTreeView::refreshLayerSymbology( const QString& layerId )
313313
if ( nodeLayer )
314314
layerTreeModel()->refreshLayerLegend( nodeLayer );
315315
}
316+
317+
318+
static void _expandAllLegendNodes( QgsLayerTreeLayer* nodeLayer, bool expanded, QgsLayerTreeModel* model )
319+
{
320+
// for layers we also need to find out with legend nodes contain some children and make them expanded/collapsed
321+
// if we are collapsing, we just write out an empty list
322+
QStringList lst;
323+
if ( expanded )
324+
{
325+
Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, model->layerLegendNodes( nodeLayer ) )
326+
{
327+
QString parentKey = legendNode->data( QgsLayerTreeModelLegendNode::ParentRuleKeyRole ).toString();
328+
if ( !parentKey.isEmpty() && !lst.contains( parentKey ) )
329+
lst << parentKey;
330+
}
331+
}
332+
nodeLayer->setCustomProperty( "expandedLegendNodes", lst );
333+
}
334+
335+
336+
static void _expandAllNodes( QgsLayerTreeGroup* parent, bool expanded, QgsLayerTreeModel* model )
337+
{
338+
Q_FOREACH ( QgsLayerTreeNode* node, parent->children() )
339+
{
340+
node->setExpanded( expanded );
341+
if ( QgsLayerTree::isGroup( node ) )
342+
_expandAllNodes( QgsLayerTree::toGroup( node ), expanded, model );
343+
else if ( QgsLayerTree::isLayer( node ) )
344+
_expandAllLegendNodes( QgsLayerTree::toLayer( node ), expanded, model );
345+
}
346+
}
347+
348+
349+
void QgsLayerTreeView::expandAllNodes()
350+
{
351+
// unfortunately expandAll() does not emit expanded() signals
352+
_expandAllNodes( layerTreeModel()->rootGroup(), true, layerTreeModel() );
353+
expandAll();
354+
}
355+
356+
void QgsLayerTreeView::collapseAllNodes()
357+
{
358+
// unfortunately collapseAll() does not emit collapsed() signals
359+
_expandAllNodes( layerTreeModel()->rootGroup(), false, layerTreeModel() );
360+
collapseAll();
361+
}

‎src/gui/layertree/qgslayertreeview.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -91,6 +91,14 @@ class GUI_EXPORT QgsLayerTreeView : public QTreeView
9191
//! Force refresh of layer symbology. Normally not needed as the changes of layer's renderer are monitored by the model
9292
void refreshLayerSymbology( const QString& layerId );
9393

94+
//! Enhancement of QTreeView::expandAll() that also records expanded state in layer tree nodes
95+
//! @note added in QGIS 2.18
96+
void expandAllNodes();
97+
98+
//! Enhancement of QTreeView::collapseAll() that also records expanded state in layer tree nodes
99+
//! @note added in QGIS 2.18
100+
void collapseAllNodes();
101+
94102
signals:
95103
//! Emitted when a current layer is changed
96104
void currentLayerChanged( QgsMapLayer* layer );

0 commit comments

Comments
 (0)
Please sign in to comment.