Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Fix double-rendering of layout legends on some circumstances
  • Loading branch information
nyalldawson committed Apr 21, 2020
1 parent a2cbd9c commit 99d50bb
Show file tree
Hide file tree
Showing 4 changed files with 49 additions and 1 deletion.
8 changes: 7 additions & 1 deletion src/core/qgslegendrenderer.cpp
Expand Up @@ -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 )
Expand Down
42 changes: 42 additions & 0 deletions tests/src/python/test_qgslayoutlegend.py
Expand Up @@ -37,6 +37,7 @@
QgsMapThemeCollection,
QgsCategorizedSymbolRenderer,
QgsRendererCategory,
QgsFillSymbol,
QgsApplication)
from qgis.testing import (start_app,
unittest
Expand Down Expand Up @@ -167,6 +168,47 @@ def testResizeWithMapContent(self):

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')
Expand Down
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.

0 comments on commit 99d50bb

Please sign in to comment.