diff --git a/src/core/qgslegendrenderer.cpp b/src/core/qgslegendrenderer.cpp index 7b81d4be55d..9e6ae8390b2 100644 --- a/src/core/qgslegendrenderer.cpp +++ b/src/core/qgslegendrenderer.cpp @@ -38,7 +38,13 @@ QgsLegendRenderer::QgsLegendRenderer( QgsLayerTreeModel *legendModel, const QgsL QSizeF QgsLegendRenderer::minimumSize( QgsRenderContext *renderContext ) { - return paintAndDetermineSize( renderContext ); + QPainter *prevPainter = renderContext ? renderContext->painter() : nullptr; + if ( renderContext ) + renderContext->setPainter( nullptr ); + const QSizeF res = paintAndDetermineSize( renderContext ); + if ( renderContext ) + renderContext->setPainter( prevPainter ); + return res; } void QgsLegendRenderer::drawLegend( QPainter *painter ) diff --git a/tests/src/python/test_qgslayoutlegend.py b/tests/src/python/test_qgslayoutlegend.py index 0f95626aa13..986f9b412ca 100644 --- a/tests/src/python/test_qgslayoutlegend.py +++ b/tests/src/python/test_qgslayoutlegend.py @@ -37,6 +37,7 @@ from qgis.core import (QgsPrintLayout, QgsMapThemeCollection, QgsCategorizedSymbolRenderer, QgsRendererCategory, + QgsFillSymbol, QgsApplication) from qgis.testing import (start_app, unittest @@ -167,6 +168,47 @@ class TestQgsLayoutItemLegend(unittest.TestCase, LayoutItemTestCase): QgsProject.instance().removeMapLayers([point_layer.id()]) + def testResizeWithMapContentNoDoublePaint(self): + """Test test legend resizes to match map content""" + poly_path = os.path.join(TEST_DATA_DIR, 'polys.shp') + poly_layer = QgsVectorLayer(poly_path, 'polys', 'ogr') + p = QgsProject() + p.addMapLayers([poly_layer]) + + fill_symbol = QgsFillSymbol.createSimple({'color': '255,0,0,125', 'outline_style': 'no'}) + poly_layer.setRenderer(QgsSingleSymbolRenderer(fill_symbol)) + + s = QgsMapSettings() + s.setLayers([poly_layer]) + layout = QgsLayout(p) + layout.initializeDefaults() + + map = QgsLayoutItemMap(layout) + map.attemptSetSceneRect(QRectF(20, 20, 80, 80)) + map.setFrameEnabled(True) + map.setLayers([poly_layer]) + layout.addLayoutItem(map) + map.setExtent(poly_layer.extent()) + + legend = QgsLayoutItemLegend(layout) + legend.setTitle("Legend") + legend.attemptSetSceneRect(QRectF(120, 20, 80, 80)) + legend.setFrameEnabled(True) + legend.setFrameStrokeWidth(QgsLayoutMeasurement(2)) + legend.setBackgroundEnabled(False) + legend.setTitle('') + layout.addLayoutItem(legend) + legend.setLinkedMap(map) + + map.setExtent(QgsRectangle(-102.51, 41.16, -102.36, 41.30)) + + checker = QgsLayoutChecker( + 'composer_legend_size_content_no_double_paint', layout) + checker.setControlPathPrefix("composer_legend") + result, message = checker.testLayout() + self.report += checker.report() + self.assertTrue(result, message) + def testResizeDisabled(self): """Test that test legend does not resize if auto size is disabled""" point_path = os.path.join(TEST_DATA_DIR, 'points.shp') diff --git a/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint.png b/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint.png new file mode 100644 index 00000000000..6335666b898 Binary files /dev/null and b/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint.png differ diff --git a/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint_mask.png b/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint_mask.png new file mode 100644 index 00000000000..6a17af2b7c8 Binary files /dev/null and b/tests/testdata/control_images/composer_legend/expected_composer_legend_size_content_no_double_paint/expected_composer_legend_size_content_no_double_paint_mask.png differ