Skip to content

Commit 636653d

Browse files
committedSep 1, 2020
Always render main annotation layer above map layers in layout maps
1 parent 4d51e48 commit 636653d

File tree

4 files changed

+59
-1
lines changed

4 files changed

+59
-1
lines changed
 

‎src/core/layout/qgslayoutitemmap.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "qgsapplication.h"
3434
#include "qgsexpressioncontextutils.h"
3535
#include "qgsstyleentityvisitor.h"
36+
#include "qgsannotationlayer.h"
3637

3738
#include <QPainter>
3839
#include <QStyleOptionGraphicsItem>
@@ -1467,6 +1468,10 @@ QgsMapSettings QgsLayoutItemMap::mapSettings( const QgsRectangle &extent, QSizeF
14671468
{
14681469
//set layers to render
14691470
QList<QgsMapLayer *> layers = layersToRender( &expressionContext );
1471+
1472+
// render main annotation layer above all other layers
1473+
layers.insert( 0, mLayout->project()->mainAnnotationLayer() );
1474+
14701475
jobMapSettings.setLayers( layers );
14711476
jobMapSettings.setLayerStyleOverrides( layerStyleOverridesToRender( expressionContext ) );
14721477
}

‎tests/src/python/test_qgslayoutmap.py

Lines changed: 54 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,8 @@
4646
QgsGeometry,
4747
QgsLayoutItemShape,
4848
QgsMapClippingRegion,
49-
QgsLayoutItemMapOverview)
49+
QgsLayoutItemMapOverview,
50+
QgsAnnotationPolygonItem)
5051

5152
from qgis.testing import start_app, unittest
5253
from utilities import unitTestDataPath
@@ -769,6 +770,58 @@ def testClippingBackgroundFrame(self):
769770
TestQgsLayoutMap.report += checker.report()
770771
self.assertTrue(result, message)
771772

773+
def testMainAnnotationLayer(self):
774+
"""
775+
Make sure main annotation layer is rendered in maps above all other layers
776+
"""
777+
p = QgsProject()
778+
779+
vl = QgsVectorLayer("Polygon?crs=epsg:4326&field=fldtxt:string",
780+
"layer", "memory")
781+
sym3 = QgsFillSymbol.createSimple({'color': '#b200b2'})
782+
vl.renderer().setSymbol(sym3)
783+
784+
p.addMapLayer(vl)
785+
layout = QgsLayout(p)
786+
layout.initializeDefaults()
787+
p.setCrs(QgsCoordinateReferenceSystem('EPSG:4326'))
788+
map = QgsLayoutItemMap(layout)
789+
map.attemptSetSceneRect(QRectF(10, 10, 180, 180))
790+
map.setFrameEnabled(True)
791+
map.setFrameStrokeWidth(QgsLayoutMeasurement(2, QgsUnitTypes.LayoutMillimeters))
792+
map.setBackgroundEnabled(True)
793+
map.setBackgroundColor(QColor(200, 255, 200))
794+
map.zoomToExtent(QgsRectangle(10, 30, 20, 35))
795+
map.setLayers([vl])
796+
layout.addLayoutItem(map)
797+
798+
# add polygon to layer
799+
f = QgsFeature()
800+
f.setGeometry(QgsGeometry.fromRect(QgsRectangle(5, 25, 25, 45)))
801+
self.assertTrue(vl.dataProvider().addFeatures([f]))
802+
803+
# no annotation yet...
804+
checker = QgsLayoutChecker('composermap_annotation_empty', layout)
805+
checker.setControlPathPrefix("composer_map")
806+
result, message = checker.testLayout()
807+
TestQgsLayoutMap.report += checker.report()
808+
self.assertTrue(result, message)
809+
810+
annotation_layer = p.mainAnnotationLayer()
811+
annotation_layer.setCrs(QgsCoordinateReferenceSystem(4326))
812+
annotation_geom = QgsGeometry.fromRect(QgsRectangle(12, 30, 18, 33))
813+
annotation = QgsAnnotationPolygonItem(annotation_geom.constGet().clone())
814+
sym3 = QgsFillSymbol.createSimple({'color': '#ff0000', 'outline_style': 'no'})
815+
annotation.setSymbol(sym3)
816+
annotation_layer.addItem(annotation)
817+
818+
# annotation must be drawn above map layers
819+
checker = QgsLayoutChecker('composermap_annotation_item', layout)
820+
checker.setControlPathPrefix("composer_map")
821+
result, message = checker.testLayout()
822+
TestQgsLayoutMap.report += checker.report()
823+
self.assertTrue(result, message)
824+
772825

773826
if __name__ == '__main__':
774827
unittest.main()

0 commit comments

Comments
 (0)
Please sign in to comment.