Skip to content

Commit 291dbb5

Browse files
committed
Handle legend node in parent gracefully with embedded widgets
1 parent 75e5da3 commit 291dbb5

File tree

2 files changed

+27
-9
lines changed

2 files changed

+27
-9
lines changed

src/core/layertree/qgslayertreemodel.cpp

+26-9
Original file line numberDiff line numberDiff line change
@@ -1196,7 +1196,7 @@ void QgsLayerTreeModel::addLegendToLayer( QgsLayerTreeLayer* nodeL )
11961196

11971197
QList<QgsLayerTreeModelLegendNode*> filteredLstNew = filterLegendNodes( lstNew );
11981198

1199-
bool isEmbedded = filteredLstNew.count() == 1 && filteredLstNew[0]->isEmbeddedInParent();
1199+
bool hasOnlyEmbedded = filteredLstNew.count() == 1 && filteredLstNew[0]->isEmbeddedInParent();
12001200

12011201
Q_FOREACH ( QgsLayerTreeModelLegendNode* n, lstNew )
12021202
{
@@ -1215,11 +1215,11 @@ void QgsLayerTreeModel::addLegendToLayer( QgsLayerTreeLayer* nodeL )
12151215

12161216
int count = data.tree ? data.tree->children[nullptr].count() : filteredLstNew.count();
12171217

1218-
if ( ! isEmbedded ) beginInsertRows( node2index( nodeL ), 0, count - 1 );
1218+
if ( ! hasOnlyEmbedded ) beginInsertRows( node2index( nodeL ), 0, count - 1 );
12191219

12201220
mLegend[nodeL] = data;
12211221

1222-
if ( ! isEmbedded ) endInsertRows();
1222+
if ( ! hasOnlyEmbedded ) endInsertRows();
12231223

12241224
if ( hasStyleOverride )
12251225
ml->styleManager()->restoreOverrideStyle();
@@ -1316,17 +1316,19 @@ int QgsLayerTreeModel::legendNodeRowCount( QgsLayerTreeModelLegendNode* node ) c
13161316

13171317
int QgsLayerTreeModel::legendRootRowCount( QgsLayerTreeLayer* nL ) const
13181318
{
1319-
if ( legendEmbeddedInParent( nL ) )
1320-
return 0;
1321-
13221319
if ( !mLegend.contains( nL ) )
13231320
return 0;
13241321

13251322
const LayerLegendData& data = mLegend[nL];
13261323
if ( data.tree )
13271324
return data.tree->children[nullptr].count();
13281325

1329-
return data.activeNodes.count();
1326+
int count = data.activeNodes.count();
1327+
1328+
if ( legendEmbeddedInParent( nL ) )
1329+
count--; // one item less -- it is embedded in parent
1330+
1331+
return count;
13301332
}
13311333

13321334

@@ -1390,14 +1392,29 @@ Qt::ItemFlags QgsLayerTreeModel::legendNodeFlags( QgsLayerTreeModelLegendNode* n
13901392

13911393
bool QgsLayerTreeModel::legendEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const
13921394
{
1395+
return legendNodeEmbeddedInParent( nodeLayer );
1396+
}
1397+
1398+
QgsLayerTreeModelLegendNode* QgsLayerTreeModel::legendNodeEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const
1399+
{
1400+
// legend node embedded in parent does not have to be the first one...
1401+
// there could be extra legend nodes generated for embedded widgets
13931402
const LayerLegendData& data = mLegend[nodeLayer];
1394-
return data.activeNodes.count() == 1 && data.activeNodes[0]->isEmbeddedInParent();
1403+
Q_FOREACH ( QgsLayerTreeModelLegendNode* legendNode, data.activeNodes )
1404+
{
1405+
if ( legendNode->isEmbeddedInParent() )
1406+
return legendNode;
1407+
}
1408+
return nullptr;
13951409
}
13961410

13971411

13981412
QIcon QgsLayerTreeModel::legendIconEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const
13991413
{
1400-
return QIcon( qvariant_cast<QPixmap>( mLegend[nodeLayer].activeNodes[0]->data( Qt::DecorationRole ) ) );
1414+
QgsLayerTreeModelLegendNode* legendNode = legendNodeEmbeddedInParent( nodeLayer );
1415+
if ( !legendNode )
1416+
return QIcon();
1417+
return QIcon( qvariant_cast<QPixmap>( legendNode->data( Qt::DecorationRole ) ) );
14011418
}
14021419

14031420

src/core/layertree/qgslayertreemodel.h

+1
Original file line numberDiff line numberDiff line change
@@ -277,6 +277,7 @@ class CORE_EXPORT QgsLayerTreeModel : public QAbstractItemModel
277277
QVariant legendNodeData( QgsLayerTreeModelLegendNode* node, int role ) const;
278278
Qt::ItemFlags legendNodeFlags( QgsLayerTreeModelLegendNode* node ) const;
279279
bool legendEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const;
280+
QgsLayerTreeModelLegendNode* legendNodeEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const;
280281
QIcon legendIconEmbeddedInParent( QgsLayerTreeLayer* nodeLayer ) const;
281282
void legendCleanup();
282283
void legendInvalidateMapBasedData();

0 commit comments

Comments
 (0)