Skip to content

Commit f4e1e6f

Browse files
committedOct 20, 2016
Fix reordering and removal of legend nodes in composer legend
1 parent 10cab93 commit f4e1e6f

File tree

1 file changed

+21
-8
lines changed

1 file changed

+21
-8
lines changed
 

‎src/app/composer/qgscomposerlegendwidget.cpp

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,23 @@
4343
#include <QInputDialog>
4444

4545

46+
static int _unfilteredLegendNodeIndex( QgsLayerTreeModelLegendNode* legendNode )
47+
{
48+
return legendNode->model()->layerOriginalLegendNodes( legendNode->layerNode() ).indexOf( legendNode );
49+
}
50+
51+
static int _originalLegendNodeIndex( QgsLayerTreeModelLegendNode* legendNode )
52+
{
53+
// figure out index of the legend node as it comes out of the map layer legend.
54+
// first legend nodes may be reordered, output of that is available in layerOriginalLegendNodes().
55+
// next the nodes may be further filtered (by scale, map content etc).
56+
// so here we go in reverse order: 1. find index before filtering, 2. find index before reorder
57+
int unfilteredNodeIndex = _unfilteredLegendNodeIndex( legendNode );
58+
QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( legendNode->layerNode() );
59+
return ( unfilteredNodeIndex >= 0 && unfilteredNodeIndex < order.count() ? order[unfilteredNodeIndex] : -1 );
60+
}
61+
62+
4663
QgsComposerLegendWidget::QgsComposerLegendWidget( QgsComposerLegend* legend )
4764
: QgsComposerItemBaseWidget( nullptr, legend )
4865
, mLegend( legend )
@@ -480,7 +497,7 @@ void QgsComposerLegendWidget::on_mMoveDownToolButton_clicked()
480497
}
481498
else // legend node
482499
{
483-
_moveLegendNode( legendNode->layerNode(), index.row(), 1 );
500+
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), 1 );
484501
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
485502
}
486503

@@ -517,7 +534,7 @@ void QgsComposerLegendWidget::on_mMoveUpToolButton_clicked()
517534
}
518535
else // legend node
519536
{
520-
_moveLegendNode( legendNode->layerNode(), index.row(), -1 );
537+
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), -1 );
521538
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
522539
}
523540

@@ -688,7 +705,7 @@ void QgsComposerLegendWidget::on_mRemoveToolButton_clicked()
688705
if ( QgsLayerTreeModelLegendNode* legendNode = mItemTreeView->layerTreeModel()->index2legendNode( index ) )
689706
{
690707
QgsLayerTreeLayer* nodeLayer = legendNode->layerNode();
691-
nodesWithRemoval[nodeLayer].append( index.row() );
708+
nodesWithRemoval[nodeLayer].append( _unfilteredLegendNodeIndex( legendNode ) );
692709
}
693710
}
694711
Q_FOREACH ( QgsLayerTreeLayer* nodeLayer, nodesWithRemoval.keys() )
@@ -1011,11 +1028,7 @@ void QgsComposerLegendWidget::on_mItemTreeView_doubleClicked( const QModelIndex
10111028
}
10121029
else if ( legendNode )
10131030
{
1014-
QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( legendNode->layerNode() );
1015-
//find unfiltered row number
1016-
QList<QgsLayerTreeModelLegendNode*> layerLegendNodes = model->layerOriginalLegendNodes( legendNode->layerNode() );
1017-
int unfilteredRowIndex = layerLegendNodes.indexOf( legendNode );
1018-
int originalIndex = ( unfilteredRowIndex >= 0 && unfilteredRowIndex < order.count() ? order[unfilteredRowIndex] : -1 );
1031+
int originalIndex = _originalLegendNodeIndex( legendNode );
10191032
QgsMapLayerLegendUtils::setLegendNodeUserLabel( legendNode->layerNode(), originalIndex, newText );
10201033
model->refreshLayerLegend( legendNode->layerNode() );
10211034
}

0 commit comments

Comments
 (0)
Please sign in to comment.