Skip to content

Commit

Permalink
Fix double-rendering of layout legends on some circumstances
Browse files Browse the repository at this point in the history
  • Loading branch information
github-actions[bot] authored and nirvn committed Apr 22, 2020
1 parent a38e715 commit 6e02084
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 6e02084

Please sign in to comment.