From b31dc5af3bda06d706bb1f1b744359ae547456cd Mon Sep 17 00:00:00 2001 From: Julien Cabieces Date: Thu, 19 Sep 2024 09:43:46 +0200 Subject: [PATCH] fix(LayoutLegend): Correctly fix position while painting While painting, it happens that other code can modify current item position, but this new position will be really used on the new draw, not the current one. So we have to backup it early enough (at the very beginning of paint) so we can translate to this new position at the end of the paint method. Fixes #37566 (Again) --- src/core/layout/qgslayoutitemlegend.cpp | 4 ++-- tests/src/python/test_qgslayoutlegend.py | 13 +++++++++++++ ..._composer_legend_reference_point_newsize.png | Bin 0 -> 13222 bytes 3 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 tests/testdata/control_images/composer_legend/expected_composer_legend_reference_point_newsize/expected_composer_legend_reference_point_newsize.png diff --git a/src/core/layout/qgslayoutitemlegend.cpp b/src/core/layout/qgslayoutitemlegend.cpp index 3c2803e2f653..eb5a0c6b224c 100644 --- a/src/core/layout/qgslayoutitemlegend.cpp +++ b/src/core/layout/qgslayoutitemlegend.cpp @@ -106,6 +106,8 @@ void QgsLayoutItemLegend::paint( QPainter *painter, const QStyleOptionGraphicsIt if ( !painter ) return; + const QPointF oldPos = pos(); + ensureModelIsInitialized(); if ( mFilterAskedForUpdate ) @@ -157,8 +159,6 @@ void QgsLayoutItemLegend::paint( QPainter *painter, const QStyleOptionGraphicsIt QgsLegendRenderer legendRenderer = createRenderer(); legendRenderer.setLegendSize( mForceResize && mSizeToContents ? QSize() : rect().size() ); - const QPointF oldPos = pos(); - //adjust box if width or height is too small if ( mSizeToContents ) { diff --git a/tests/src/python/test_qgslayoutlegend.py b/tests/src/python/test_qgslayoutlegend.py index 1ab07f27c2a6..953fa8742b05 100644 --- a/tests/src/python/test_qgslayoutlegend.py +++ b/tests/src/python/test_qgslayoutlegend.py @@ -1098,6 +1098,19 @@ def testReferencePoint(self): ) ) + # re-render with filtering to trigger mapHitTest which ends up by calling adjustBoxSize(). + # These last change the box size and therefore position (because our reference point is lower left) + # So check that the legend position is according to what we expect (change also marker size + # so we are sure that it's size and position have correcly been updated) + legend.setLegendFilterByMapEnabled(True) + marker_symbol.setSize(10) + + self.assertTrue( + self.render_layout_check( + 'composer_legend_reference_point_newsize', layout + ) + ) + QgsProject.instance().clear() def test_rulebased_child_filter(self): diff --git a/tests/testdata/control_images/composer_legend/expected_composer_legend_reference_point_newsize/expected_composer_legend_reference_point_newsize.png b/tests/testdata/control_images/composer_legend/expected_composer_legend_reference_point_newsize/expected_composer_legend_reference_point_newsize.png new file mode 100644 index 0000000000000000000000000000000000000000..bb15a0192439c11b5b3204167155be447ea2b057 GIT binary patch literal 13222 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 NoHREsJbv-|{{wS-=|cbj literal 0 HcmV?d00001