Skip to content

Commit

Permalink
fix(layoutlegendwidget): correctly move legend nodes when they are fi…
Browse files Browse the repository at this point in the history
…ltered

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.
  • Loading branch information
Djedouas committed Feb 21, 2025
1 parent c82aace commit 9da1bef
Showing 1 changed file with 24 additions and 5 deletions.
29 changes: 24 additions & 5 deletions src/gui/layout/qgslayoutlegendwidget.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -726,9 +726,10 @@ void QgsLayoutLegendWidget::mColumnSpaceSpinBox_valueChanged( double d )
}
}

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

if ( legendNodeIndex < 0 || legendNodeIndex >= order.count() )
return;
Expand Down Expand Up @@ -770,8 +771,17 @@ void QgsLayoutLegendWidget::mMoveDownToolButton_clicked()
}
else // legend node
{
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), 1 );
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
// get the next index, the one that will have to be above our index,
const QModelIndex nextIndex = index.siblingAtRow( index.row() + 1 );
if ( nextIndex.isValid() )
{
QgsLayerTreeModelLegendNode *nextLegendNode = mItemTreeView->index2legendNode( nextIndex );
if ( nextLegendNode )
{
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), _unfilteredLegendNodeIndex( nextLegendNode ) );
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
}
}
}

mItemTreeView->setCurrentIndex( mItemTreeView->proxyModel()->mapFromSource( mItemTreeView->layerTreeModel()->index( sourceIndex.row() + 1, 0, parentIndex ) ) );
Expand Down Expand Up @@ -808,8 +818,17 @@ void QgsLayoutLegendWidget::mMoveUpToolButton_clicked()
}
else // legend node
{
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), -1 );
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
// get the previous index, the one that will have to be below our index,
const QModelIndex prevIndex = index.siblingAtRow( index.row() - 1 );
if ( prevIndex.isValid() )
{
QgsLayerTreeModelLegendNode *prevLegendNode = mItemTreeView->index2legendNode( prevIndex );
if ( prevLegendNode )
{
_moveLegendNode( legendNode->layerNode(), _unfilteredLegendNodeIndex( legendNode ), _unfilteredLegendNodeIndex( prevLegendNode ) );
mItemTreeView->layerTreeModel()->refreshLayerLegend( legendNode->layerNode() );
}
}
}

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

0 comments on commit 9da1bef

Please sign in to comment.