Skip to content

Commit 89f77b1

Browse files
committed
fix(layoutlegendwidget): correctly move legend nodes when they are filtered
Fixes #60383. In a layout, when moving a legend node on a filtered legend, the computed offset was wrong if some nodes were hidden between the node to move and its destination. The offset is now computed with the next/previous visible index.
1 parent 98b36d1 commit 89f77b1

File tree

1 file changed

+24
-5
lines changed

1 file changed

+24
-5
lines changed

src/gui/layout/qgslayoutlegendwidget.cpp

+24-5
Original file line numberDiff line numberDiff line change
@@ -726,9 +726,10 @@ void QgsLayoutLegendWidget::mColumnSpaceSpinBox_valueChanged( double d )
726726
}
727727
}
728728

729-
static void _moveLegendNode( QgsLayerTreeLayer *nodeLayer, int legendNodeIndex, int offset )
729+
static void _moveLegendNode( QgsLayerTreeLayer *nodeLayer, int legendNodeIndex, int destLegendNodeIndex )
730730
{
731731
QList<int> order = QgsMapLayerLegendUtils::legendNodeOrder( nodeLayer );
732+
const int offset = destLegendNodeIndex - legendNodeIndex;
732733

733734
if ( legendNodeIndex < 0 || legendNodeIndex >= order.count() )
734735
return;
@@ -770,8 +771,17 @@ void QgsLayoutLegendWidget::mMoveDownToolButton_clicked()
770771
}
771772
else // legend node
772773
{
773-
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), 1 );
774-
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
774+
// get the next index, the one that will have to be above our index,
775+
const QModelIndex nextIndex = index.siblingAtRow( index.row() + 1 );
776+
if ( nextIndex.isValid() )
777+
{
778+
QgsLayerTreeModelLegendNode *nextLegendNode = mItemTreeView->index2legendNode( nextIndex );
779+
if ( nextLegendNode )
780+
{
781+
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), _unfilteredLegendNodeIndex( nextLegendNode ) );
782+
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
783+
}
784+
}
775785
}
776786

777787
mItemTreeView->setCurrentIndex( mItemTreeView->proxyModel()->mapFromSource( mItemTreeView->layerTreeModel()->index( sourceIndex.row() + 1, 0, parentIndex ) ) );
@@ -808,8 +818,17 @@ void QgsLayoutLegendWidget::mMoveUpToolButton_clicked()
808818
}
809819
else // legend node
810820
{
811-
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), -1 );
812-
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
821+
// get the previous index, the one that will have to be below our index,
822+
const QModelIndex prevIndex = index.siblingAtRow( index.row() - 1 );
823+
if ( prevIndex.isValid() )
824+
{
825+
QgsLayerTreeModelLegendNode *prevLegendNode = mItemTreeView->index2legendNode( prevIndex );
826+
if ( prevLegendNode )
827+
{
828+
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), _unfilteredLegendNodeIndex( prevLegendNode ) );
829+
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
830+
}
831+
}
813832
}
814833

815834
mItemTreeView->setCurrentIndex( mItemTreeView->proxyModel()->mapFromSource( mItemTreeView->layerTreeModel()->index( sourceIndex.row() - 1, 0, parentIndex ) ) );

0 commit comments

Comments
 (0)