Fix double-rendering of layout legends on some circumstances

This commit is contained in:
Nyall Dawson 2020-04-21 13:22:06 +10:00
parent a2cbd9ceea
commit 99d50bb17a
4 changed files with 49 additions and 1 deletions

View File

@ -38,7 +38,13 @@ QgsLegendRenderer::QgsLegendRenderer( QgsLayerTreeModel *legendModel, const QgsL
QSizeF QgsLegendRenderer::minimumSize( QgsRenderContext *renderContext ) 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 ) void QgsLegendRenderer::drawLegend( QPainter *painter )

View File

@ -37,6 +37,7 @@ from qgis.core import (QgsPrintLayout,
QgsMapThemeCollection, QgsMapThemeCollection,
QgsCategorizedSymbolRenderer, QgsCategorizedSymbolRenderer,
QgsRendererCategory, QgsRendererCategory,
QgsFillSymbol,
QgsApplication) QgsApplication)
from qgis.testing import (start_app, from qgis.testing import (start_app,
unittest unittest
@ -167,6 +168,47 @@ class TestQgsLayoutItemLegend(unittest.TestCase, LayoutItemTestCase):
QgsProject.instance().removeMapLayers([point_layer.id()]) 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): def testResizeDisabled(self):
"""Test that test legend does not resize if auto size is disabled""" """Test that test legend does not resize if auto size is disabled"""
point_path = os.path.join(TEST_DATA_DIR, 'points.shp') point_path = os.path.join(TEST_DATA_DIR, 'points.shp')