Skip to content

Commit a3186f8

Browse files
committed
Fix layer tree expanded state when used expand/collapse all (fixes #15691)
(cherry picked from commit de85fdd)
1 parent 24fbe1a commit a3186f8

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
@@ -3104,11 +3104,11 @@ void QgisApp::initLayerTreeView()
31043104
QAction* actionExpandAll = new QAction( tr( "Expand All" ), this );
31053105
actionExpandAll->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionExpandTree.svg" ) ) );
31063106
actionExpandAll->setToolTip( tr( "Expand All" ) );
3107-
connect( actionExpandAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( expandAll() ) );
3107+
connect( actionExpandAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( expandAllNodes() ) );
31083108
QAction* actionCollapseAll = new QAction( tr( "Collapse All" ), this );
31093109
actionCollapseAll->setIcon( QgsApplication::getThemeIcon( QStringLiteral( "/mActionCollapseTree.svg" ) ) );
31103110
actionCollapseAll->setToolTip( tr( "Collapse All" ) );
3111-
connect( actionCollapseAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( collapseAll() ) );
3111+
connect( actionCollapseAll, SIGNAL( triggered( bool ) ), mLayerTreeView, SLOT( collapseAllNodes() ) );
31123112

31133113
QWidget* spacer = new QWidget();
31143114
spacer->setSizePolicy( QSizePolicy::Expanding, QSizePolicy::Expanding );

src/gui/layertree/qgslayertreeview.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -336,3 +336,49 @@ void QgsLayerTreeView::refreshLayerSymbology( const QString& layerId )
336336
if ( nodeLayer )
337337
layerTreeModel()->refreshLayerLegend( nodeLayer );
338338
}
339+
340+
341+
static void _expandAllLegendNodes( QgsLayerTreeLayer* nodeLayer, bool expanded, QgsLayerTreeModel* model )
342+
{
343+
// for layers we also need to find out with legend nodes contain some children and make them expanded/collapsed
344+
// if we are collapsing, we just write out an empty list
345+
QStringList lst;
346+
if ( expanded )
347+
{
348+
Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, model->layerLegendNodes( nodeLayer ) )
349+
{
350+
QString parentKey = legendNode->data( QgsLayerTreeModelLegendNode::ParentRuleKeyRole ).toString();
351+
if ( !parentKey.isEmpty() && !lst.contains( parentKey ) )
352+
lst << parentKey;
353+
}
354+
}
355+
nodeLayer->setCustomProperty( "expandedLegendNodes", lst );
356+
}
357+
358+
359+
static void _expandAllNodes( QgsLayerTreeGroup* parent, bool expanded, QgsLayerTreeModel* model )
360+
{
361+
Q_FOREACH ( QgsLayerTreeNode* node, parent->children() )
362+
{
363+
node->setExpanded( expanded );
364+
if ( QgsLayerTree::isGroup( node ) )
365+
_expandAllNodes( QgsLayerTree::toGroup( node ), expanded, model );
366+
else if ( QgsLayerTree::isLayer( node ) )
367+
_expandAllLegendNodes( QgsLayerTree::toLayer( node ), expanded, model );
368+
}
369+
}
370+
371+
372+
void QgsLayerTreeView::expandAllNodes()
373+
{
374+
// unfortunately expandAll() does not emit expanded() signals
375+
_expandAllNodes( layerTreeModel()->rootGroup(), true, layerTreeModel() );
376+
expandAll();
377+
}
378+
379+
void QgsLayerTreeView::collapseAllNodes()
380+
{
381+
// unfortunately collapseAll() does not emit collapsed() signals
382+
_expandAllNodes( layerTreeModel()->rootGroup(), false, layerTreeModel() );
383+
collapseAll();
384+
}

src/gui/layertree/qgslayertreeview.h

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

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

0 commit comments

Comments
 (0)