Skip to content

Commit eb6a45c

Browse files
committed
[layertree] Fix #10449 (auto-collapse layer if symbology has >= 10 items)
1 parent 378de25 commit eb6a45c

File tree

8 files changed

+40
-2
lines changed

8 files changed

+40
-2
lines changed

python/gui/layertree/qgslayertreemodel.sip

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,6 +100,11 @@ class QgsLayerTreeModel : QAbstractItemModel
100100
//! Get font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeType enumeration
101101
QFont layerTreeNodeFont( int nodeType ) const;
102102

103+
//! Set at what number of symbology nodes the layer node should be collapsed. Setting -1 disables the auto-collapse (default).
104+
void setAutoCollapseSymbologyNodes( int nodeCount );
105+
//! Return at what number of symbology nodes the layer node should be collapsed. -1 means no auto-collapse (default).
106+
int autoCollapseSymbologyNodes() const;
107+
103108
signals:
104109

105110
};

src/app/qgisapp.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2300,6 +2300,7 @@ void QgisApp::initLayerTreeView()
23002300
model->setFlag( QgsLayerTreeModel::AllowNodeReorder );
23012301
model->setFlag( QgsLayerTreeModel::AllowNodeRename );
23022302
model->setFlag( QgsLayerTreeModel::AllowNodeChangeVisibility );
2303+
model->setAutoCollapseSymbologyNodes( 10 );
23032304

23042305
mLayerTreeView->setModel( model );
23052306
mLayerTreeView->setMenuProvider( new QgsAppLayerTreeViewMenuProvider( mLayerTreeView, mMapCanvas ) );

src/core/layertree/qgslayertreegroup.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -214,15 +214,18 @@ void QgsLayerTreeGroup::writeXML( QDomElement& parentElement )
214214

215215
void QgsLayerTreeGroup::readChildrenFromXML( QDomElement& element )
216216
{
217+
QList<QgsLayerTreeNode*> nodes;
217218
QDomElement childElem = element.firstChildElement();
218219
while ( !childElem.isNull() )
219220
{
220221
QgsLayerTreeNode* newNode = QgsLayerTreeNode::readXML( childElem );
221222
if ( newNode )
222-
addChildNode( newNode );
223+
nodes << newNode;
223224

224225
childElem = childElem.nextSiblingElement();
225226
}
227+
228+
insertChildNodes( -1, nodes );
226229
}
227230

228231
QString QgsLayerTreeGroup::dump() const

src/core/layertree/qgslayertreenode.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,9 @@ void QgsLayerTreeNode::writeCommonXML( QDomElement& element )
110110

111111
void QgsLayerTreeNode::insertChildrenPrivate( int index, QList<QgsLayerTreeNode*> nodes )
112112
{
113+
if ( nodes.count() == 0 )
114+
return;
115+
113116
foreach ( QgsLayerTreeNode* node, nodes )
114117
{
115118
Q_ASSERT( node->mParent == 0 );

src/core/layertree/qgslayertreenode.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ class QDomElement;
5151
* file. The storage is not efficient for large amount of data.
5252
*
5353
* Custom properties that have already been used within QGIS:
54+
* - "loading" - whether the project is being currently loaded (root node only)
5455
* - "overview" - whether to show a layer in overview
5556
* - "showFeatureCount" - whether to show feature counts in layer tree (vector only)
5657
* - "embedded" - whether the node comes from an external project

src/core/qgsproject.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,8 @@ bool QgsProject::read()
903903

904904
// read the layer tree from project file
905905

906+
mRootGroup->setCustomProperty( "loading", 1 );
907+
906908
QDomElement layerTreeElem = doc->documentElement().firstChildElement( "layer-tree-group" );
907909
if ( !layerTreeElem.isNull() )
908910
{
@@ -945,6 +947,8 @@ bool QgsProject::read()
945947
// make sure the are just valid layers
946948
QgsLayerTreeUtils::removeInvalidLayers( mRootGroup );
947949

950+
mRootGroup->removeCustomProperty( "loading" );
951+
948952
// read the project: used by map canvas and legend
949953
emit readProject( *doc );
950954

src/gui/layertree/qgslayertreemodel.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ QgsLayerTreeModel::QgsLayerTreeModel( QgsLayerTreeGroup* rootNode, QObject *pare
3232
: QAbstractItemModel( parent )
3333
, mRootNode( rootNode )
3434
, mFlags( ShowSymbology )
35+
, mAutoCollapseSymNodesCount( -1 )
3536
{
3637
Q_ASSERT( mRootNode );
3738

@@ -429,11 +430,17 @@ void QgsLayerTreeModel::refreshLayerSymbology( QgsLayerTreeLayer* nodeLayer )
429430
emit dataChanged( idx, idx );
430431

431432
// update children
432-
beginRemoveRows( idx, 0, rowCount( idx ) - 1 );
433+
int oldNodeCount = rowCount( idx );
434+
beginRemoveRows( idx, 0, oldNodeCount - 1 );
433435
removeSymbologyFromLayer( nodeLayer );
434436
endRemoveRows();
435437

436438
addSymbologyToLayer( nodeLayer );
439+
int newNodeCount = rowCount( idx );
440+
441+
// automatic collapse of symbology nodes - useful if a layer has many symbology nodes
442+
if ( mAutoCollapseSymNodesCount != -1 && oldNodeCount != newNodeCount && newNodeCount >= mAutoCollapseSymNodesCount )
443+
nodeLayer->setExpanded( false );
437444
}
438445

439446
QModelIndex QgsLayerTreeModel::currentIndex() const
@@ -732,6 +739,13 @@ void QgsLayerTreeModel::connectToLayer( QgsLayerTreeLayer* nodeLayer )
732739
if ( testFlag( ShowSymbology ) )
733740
{
734741
addSymbologyToLayer( nodeLayer );
742+
743+
// automatic collapse of symbology nodes - useful if a layer has many symbology nodes
744+
if ( !mRootNode->customProperty( "loading" ).toBool() )
745+
{
746+
if ( mAutoCollapseSymNodesCount != -1 && rowCount( node2index( nodeLayer ) ) >= mAutoCollapseSymNodesCount )
747+
nodeLayer->setExpanded( false );
748+
}
735749
}
736750

737751
QgsMapLayer* layer = nodeLayer->layer();

src/gui/layertree/qgslayertreemodel.h

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -139,6 +139,11 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
139139
//! Get font for a particular type of layer tree node. nodeType should come from QgsLayerTreeNode::NodeType enumeration
140140
QFont layerTreeNodeFont( int nodeType ) const;
141141

142+
//! Set at what number of symbology nodes the layer node should be collapsed. Setting -1 disables the auto-collapse (default).
143+
void setAutoCollapseSymbologyNodes( int nodeCount ) { mAutoCollapseSymNodesCount = nodeCount; }
144+
//! Return at what number of symbology nodes the layer node should be collapsed. -1 means no auto-collapse (default).
145+
int autoCollapseSymbologyNodes() const { return mAutoCollapseSymNodesCount; }
146+
142147
signals:
143148

144149
protected slots:
@@ -180,6 +185,8 @@ class GUI_EXPORT QgsLayerTreeModel : public QAbstractItemModel
180185
QMap<QgsLayerTreeLayer*, QList<QgsLayerTreeModelSymbologyNode*> > mSymbologyNodes;
181186
//! Current index - will be underlined
182187
QPersistentModelIndex mCurrentIndex;
188+
//! Minimal number of nodes when symbology should be automatically collapsed. -1 = disabled
189+
int mAutoCollapseSymNodesCount;
183190

184191
QFont mFontLayer;
185192
QFont mFontGroup;

0 commit comments

Comments
 (0)