From d0aadde5950647b93fdf134147dc6e079e3a16f6 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Tue, 9 Jan 2024 11:26:13 +0100 Subject: [PATCH 1/6] add enabled state for annotation items --- .../annotations/qgsannotationitem.sip.in | 18 ++++++++++++++++++ .../annotations/qgsannotationitem.sip.in | 18 ++++++++++++++++++ src/core/annotations/qgsannotationitem.cpp | 3 +++ src/core/annotations/qgsannotationitem.h | 18 +++++++++++++++++- .../annotations/qgsannotationlayerrenderer.cpp | 3 +++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/python/PyQt6/core/auto_generated/annotations/qgsannotationitem.sip.in b/python/PyQt6/core/auto_generated/annotations/qgsannotationitem.sip.in index 0e5bfb6cee3e..40471f69201e 100644 --- a/python/PyQt6/core/auto_generated/annotations/qgsannotationitem.sip.in +++ b/python/PyQt6/core/auto_generated/annotations/qgsannotationitem.sip.in @@ -146,6 +146,24 @@ Sets the item's z ``index``, which controls the order in which annotation items are rendered in the layer. .. seealso:: :py:func:`zIndex` +%End + + bool enabled() const; +%Docstring +Returns ``True`` if the item is enabled and will be rendered in the layer. + +.. seealso:: :py:func:`setEnabled` + +.. versionadded:: 3.36 +%End + + void setEnabled( bool enabled ); +%Docstring +Sets if the item will be rendered or not in the layer. + +.. seealso:: :py:func:`enabled` + +.. versionadded:: 3.36 %End virtual QList< QgsAnnotationItemNode > nodes() const; diff --git a/python/core/auto_generated/annotations/qgsannotationitem.sip.in b/python/core/auto_generated/annotations/qgsannotationitem.sip.in index 0e5bfb6cee3e..40471f69201e 100644 --- a/python/core/auto_generated/annotations/qgsannotationitem.sip.in +++ b/python/core/auto_generated/annotations/qgsannotationitem.sip.in @@ -146,6 +146,24 @@ Sets the item's z ``index``, which controls the order in which annotation items are rendered in the layer. .. seealso:: :py:func:`zIndex` +%End + + bool enabled() const; +%Docstring +Returns ``True`` if the item is enabled and will be rendered in the layer. + +.. seealso:: :py:func:`setEnabled` + +.. versionadded:: 3.36 +%End + + void setEnabled( bool enabled ); +%Docstring +Sets if the item will be rendered or not in the layer. + +.. seealso:: :py:func:`enabled` + +.. versionadded:: 3.36 %End virtual QList< QgsAnnotationItemNode > nodes() const; diff --git a/src/core/annotations/qgsannotationitem.cpp b/src/core/annotations/qgsannotationitem.cpp index a19bc3d912a6..945226319277 100644 --- a/src/core/annotations/qgsannotationitem.cpp +++ b/src/core/annotations/qgsannotationitem.cpp @@ -40,6 +40,7 @@ QList QgsAnnotationItem::nodes() const void QgsAnnotationItem::copyCommonProperties( const QgsAnnotationItem *other ) { + setEnabled( other->enabled() ); setZIndex( other->zIndex() ); setUseSymbologyReferenceScale( other->useSymbologyReferenceScale() ); setSymbologyReferenceScale( other->symbologyReferenceScale() ); @@ -47,6 +48,7 @@ void QgsAnnotationItem::copyCommonProperties( const QgsAnnotationItem *other ) bool QgsAnnotationItem::writeCommonProperties( QDomElement &element, QDomDocument &, const QgsReadWriteContext & ) const { + element.setAttribute( QStringLiteral( "enabled" ), static_cast( enabled() ) ); element.setAttribute( QStringLiteral( "zIndex" ), zIndex() ); element.setAttribute( QStringLiteral( "useReferenceScale" ), useSymbologyReferenceScale() ? QStringLiteral( "1" ) : QStringLiteral( "0" ) ); element.setAttribute( QStringLiteral( "referenceScale" ), qgsDoubleToString( symbologyReferenceScale() ) ); @@ -55,6 +57,7 @@ bool QgsAnnotationItem::writeCommonProperties( QDomElement &element, QDomDocumen bool QgsAnnotationItem::readCommonProperties( const QDomElement &element, const QgsReadWriteContext & ) { + setEnabled( element.attribute( QStringLiteral( "enabled" ) ).toInt() ); setZIndex( element.attribute( QStringLiteral( "zIndex" ) ).toInt() ); setUseSymbologyReferenceScale( element.attribute( QStringLiteral( "useReferenceScale" ), QStringLiteral( "0" ) ).toInt() ); setSymbologyReferenceScale( element.attribute( QStringLiteral( "referenceScale" ) ).toDouble() ); diff --git a/src/core/annotations/qgsannotationitem.h b/src/core/annotations/qgsannotationitem.h index ad1125a8912a..170214f877fe 100644 --- a/src/core/annotations/qgsannotationitem.h +++ b/src/core/annotations/qgsannotationitem.h @@ -174,6 +174,22 @@ class CORE_EXPORT QgsAnnotationItem */ void setZIndex( int index ) { mZIndex = index; } + /** + * Returns TRUE if the item is enabled and will be rendered in the layer. + * + * \see setEnabled() + * \since QGIS 3.36 + */ + bool enabled() const { return mEnabled; } + + /** + * Sets if the item will be rendered or not in the layer. + * + * \see enabled() + * \since QGIS 3.36 + */ + void setEnabled( bool enabled ) { mEnabled = enabled; } + /** * Returns the nodes for the item, used for editing the item. * @@ -259,7 +275,7 @@ class CORE_EXPORT QgsAnnotationItem private: int mZIndex = 0; - + bool mEnabled = true; bool mUseReferenceScale = false; double mReferenceScale = 0; diff --git a/src/core/annotations/qgsannotationlayerrenderer.cpp b/src/core/annotations/qgsannotationlayerrenderer.cpp index 3b4e8bbdad89..ec7ef3af42f4 100644 --- a/src/core/annotations/qgsannotationlayerrenderer.cpp +++ b/src/core/annotations/qgsannotationlayerrenderer.cpp @@ -85,6 +85,9 @@ bool QgsAnnotationLayerRenderer::render() break; } + if ( !item.second->enabled() ) + continue; + std::optional< QgsScopedRenderContextReferenceScaleOverride > referenceScaleOverride; if ( item.second->useSymbologyReferenceScale() ) { From 4f365d8470d8cee1dbe0ca9d2326ac2af952041c Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Fri, 12 Jan 2024 16:50:41 +0100 Subject: [PATCH 2/6] add test --- tests/src/python/test_qgsannotationlayer.py | 85 ++++++++++++++++-- .../expected_layer_render_disabled.png | Bin 0 -> 1383 bytes .../expected_layer_render_disabled_mask.png | Bin 0 -> 973 bytes 3 files changed, 79 insertions(+), 6 deletions(-) create mode 100644 tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled.png create mode 100644 tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png diff --git a/tests/src/python/test_qgsannotationlayer.py b/tests/src/python/test_qgsannotationlayer.py index 3cb7578e985f..80b35b6abca2 100644 --- a/tests/src/python/test_qgsannotationlayer.py +++ b/tests/src/python/test_qgsannotationlayer.py @@ -11,7 +11,8 @@ __date__ = '29/07/2020' __copyright__ = 'Copyright 2020, The QGIS Project' -from qgis.PyQt.QtCore import QSize, QTemporaryDir +import qgis # NOQA +from qgis.PyQt.QtCore import QDir, QSize, QTemporaryDir from qgis.PyQt.QtGui import QColor, QImage, QPainter from qgis.PyQt.QtXml import QDomDocument from qgis.core import ( @@ -37,6 +38,7 @@ QgsProject, QgsReadWriteContext, QgsRectangle, + QgsRenderChecker, QgsRenderContext, QgsVertexId, ) @@ -52,8 +54,16 @@ class TestQgsAnnotationLayer(QgisTestCase): @classmethod - def control_path_prefix(cls): - return 'annotation_layer' + def setUpClass(cls): + super().setUpClass() + cls.report = "

Python QgsAnnotationLayer Tests

\n" + + @classmethod + def tearDownClass(cls): + report_file_path = f"{QDir.tempPath()}/qgistest.html" + with open(report_file_path, 'a') as report_file: + report_file.write(cls.report) + super().tearDownClass() def testItems(self): layer = QgsAnnotationLayer('test', QgsAnnotationLayer.LayerOptions(QgsProject.instance().transformContext())) @@ -347,7 +357,7 @@ def testRenderLayer(self): finally: painter.end() - self.assertTrue(self.image_check('layer_render', 'layer_render', image)) + self.assertTrue(self.imageCheck('layer_render', 'layer_render', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -407,7 +417,7 @@ def testRenderWithTransform(self): finally: painter.end() - self.assertTrue(self.image_check('layer_render_transform', 'layer_render_transform', image)) + self.assertTrue(self.imageCheck('layer_render_transform', 'layer_render_transform', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -472,7 +482,7 @@ def testRenderLayerWithReferenceScale(self): finally: painter.end() - self.assertTrue(self.image_check('layer_render_reference_scale', 'layer_render_reference_scale', image)) + self.assertTrue(self.imageCheck('layer_render_reference_scale', 'layer_render_reference_scale', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -597,6 +607,69 @@ def test_render_via_job_with_transform(self): self.assertTrue(compareWkt(result, expected, tol=1000), "mismatch Expected:\n{}\nGot:\n{}\n".format(expected, result)) + def testRenderWithDisabledItems(self): + layer = QgsAnnotationLayer('test', QgsAnnotationLayer.LayerOptions(QgsProject.instance().transformContext())) + self.assertTrue(layer.isValid()) + + item = QgsAnnotationPolygonItem( + QgsPolygon(QgsLineString([QgsPoint(11.5, 13), QgsPoint(12, 13), QgsPoint(12, 13.5), QgsPoint(11.5, 13)]))) + item.setSymbol( + QgsFillSymbol.createSimple({'color': '200,100,100', 'outline_color': 'black', 'outline_width': '2'})) + item.setZIndex(1) + i1_id = layer.addItem(item) + + item = QgsAnnotationLineItem(QgsLineString([QgsPoint(11, 13), QgsPoint(12, 13), QgsPoint(12, 15)])) + item.setSymbol(QgsLineSymbol.createSimple({'color': '#ffff00', 'line_width': '3'})) + item.setZIndex(2) + item.setEnabled(False) + i2_id = layer.addItem(item) + + layer.setCrs(QgsCoordinateReferenceSystem('EPSG:4326')) + + settings = QgsMapSettings() + settings.setDestinationCrs(QgsCoordinateReferenceSystem('EPSG:3857')) + settings.setExtent(QgsRectangle(1250958, 1386945, 1420709, 1532518)) + settings.setOutputSize(QSize(300, 300)) + + settings.setFlag(QgsMapSettings.Antialiasing, False) + + rc = QgsRenderContext.fromMapSettings(settings) + rc.setCoordinateTransform(QgsCoordinateTransform(layer.crs(), settings.destinationCrs(), QgsProject.instance())) + rc.setExtent( + rc.coordinateTransform().transformBoundingBox(settings.extent(), QgsCoordinateTransform.ReverseTransform)) + image = QImage(200, 200, QImage.Format_ARGB32) + image.setDotsPerMeterX(int(96 / 25.4 * 1000)) + image.setDotsPerMeterY(int(96 / 25.4 * 1000)) + image.fill(QColor(255, 255, 255)) + painter = QPainter(image) + rc.setPainter(painter) + + try: + renderer = layer.createMapRenderer(rc) + renderer.render() + finally: + painter.end() + + self.assertTrue(self.imageCheck('layer_render_disabled', 'layer_render_disabled', image)) + # also check details of rendered items + item_details = renderer.takeRenderedItemDetails() + self.assertEqual([i.layerId() for i in item_details], [layer.id()] * 3) + self.assertCountEqual([i.itemId() for i in item_details], [i1_id]) + + def imageCheck(self, name, reference_image, image): + TestQgsAnnotationLayer.report += f"

Render {name}

\n" + temp_dir = QDir.tempPath() + '/' + file_name = temp_dir + 'patch_' + name + ".png" + image.save(file_name, "PNG") + checker = QgsRenderChecker() + checker.setControlPathPrefix("annotation_layer") + checker.setControlName("expected_" + reference_image) + checker.setRenderedImage(file_name) + checker.setColorTolerance(2) + result = checker.compareImages(name, 20) + TestQgsAnnotationLayer.report += checker.report() + return result + if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled.png b/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..155536d99a920ebadf8a3ee1ae98dc44de4ab07f GIT binary patch literal 1383 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yaTa()7BevL9R^{>m~%E9@A(PhI8rQQ}5 zvA_+RjSq$GYv?_qI!iC&s2|TRF>j#)-554CSD#Ibs=u8(J@@xFo2PH;)A-N)vG{)O z3tRI+g@*6H7QA9yaE^tEv(dpxVS)gM$|w^{ICRcj#lB+sy$R3Rm-;w<%@Oe6U=dV*auxcdx`XJ39%J&)q!IEgQF_2Cs2f=vni&(1oK# zuvD>+qtT#g-4Q`Wfwn74EtFUe3G5PcZ*kCA(G60-v`Y%ex#2MVafbj$=b}Ozo7!DZ zJXa|T-1C7oOKn6?m2UUIK+X7E3W@G8BfmE10VHWpOS!b|lcY@yZm7SB?s%Dt*5MJkEA3j$;W@ zezZcq@k)!uD^CSeg}z@x9!HM^<}&v!%s4Uzv-{D?FY;3PTpL}2cvu9j$#of(0p7fsY zlk2^!?tg6E-{0mo+I{Z?JX~tZe-`bzv&~m#&th{49yZbbfVcbQn=GzkX{Xt&s{g=9_PX{27|B5qhwnf4GO_LJ z=l~|9j7jzP-|N>^&X`xdXM@1+Uw?mmdvsLO$93i(KBFbQk2*Sbm|08L>*yc9wl;dX zfne&YgKR77cc`7(Z*P>p2sn};u$x~-;@3}qaq-7Ld!;|Vew4&{ zIdH1fo#rd<`|tNVAMZOlf42GYgP)&s+rR(!r{>Lz?~m`DoxL&h@-iXylv^=LYYmN! zh3)U}m5!ISm%H94(|KP^Ea~ad?(g$zcWx2s7Z-bU>rKv_xwE@}m%r;++?q3?bj_MI zM|N_HKRW*Udh+dcu^)eZef^{2{k@8RF9LIJZc_bM^-aglzEEl3y!qwM_mY@2ADo=5 zzH!SIk<+J7Z>;_O?Z(dH^fxy*FMqXhM$>-Ajy3_;?Ui55fh8w{r>mdKI;Vst00I;v AKmY&$ literal 0 HcmV?d00001 diff --git a/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png b/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png new file mode 100644 index 0000000000000000000000000000000000000000..c0cded3f2532b9a78b1247ecfe8f325ca169b7fd GIT binary patch literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yaTa()7BevL9RXp+soH$f3=GWm zo-U3d6?5L+y5052L8R^CTZ8xiPtBaY@a49z<`-pNZMe3SMRVc4H%za?LcJOJ|L&|} zykOMmpdi4(!Zb=@3xeGd)1JOkm2pz2$%&k{>uw&u{rkIXSN-}g8uKhtX0d@|#qAe` zA)GDdX9e7+I#e9i0dacMx)ysWZoW5q^HqVIZA$#E;6@h&nkIfqcLLXJQDRd|coOp6%B4w=71Sg?ro;gawZOW-+oTtZ`Fd7C!!*#Ym&@jk5x?(D6DJ zBZ=4F##@0``1n_rOB#h+92Izl+^tzINfd5zRp1qLuV%T#QMkoZ zfmgtNH%pOW;TB&7aUu8LEJcEaUmO+01>Egfii`@sxGJa%x!1E42^D_vR8SXi-_KHH zQ251HfnCV`KTDB7VUME%yTEY^mQBWmJ+2DYLdPpuHVGH@cq&*69N)q6NwKiUSD}1b z>dh}}ERLy7$Ukz>w(*ZTpPZn_-=4=;)5MO)EaP{PQQ5vKs(#yy85Yk>{<1_m%X~I+ zjN9<=xtain%tn+nE|U;B&9{7a#&idTAJt!()@^&LcWv7H&(9x8_)N&RvlX)p>rMaV z@b3PX_j#Z8ste}Mu$!>zyt3f&9e0lYdKM|sZ}xX_`cXr<#ygeYJ5>7&IiGZHUC5D~ b^Piz}!-JBudBVqm`IEuZ)z4*}Q$iB}#gI5z literal 0 HcmV?d00001 From 269b24b8e9f964834e7b69c9a10b99c14fa42753 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Fri, 12 Jan 2024 22:01:48 +0100 Subject: [PATCH 3/6] remodernize --- tests/src/python/test_qgsannotationlayer.py | 39 ++++-------------- .../expected_layer_render_disabled.png | Bin 1383 -> 1018 bytes 2 files changed, 8 insertions(+), 31 deletions(-) diff --git a/tests/src/python/test_qgsannotationlayer.py b/tests/src/python/test_qgsannotationlayer.py index 80b35b6abca2..37b4bc681ca1 100644 --- a/tests/src/python/test_qgsannotationlayer.py +++ b/tests/src/python/test_qgsannotationlayer.py @@ -11,8 +11,7 @@ __date__ = '29/07/2020' __copyright__ = 'Copyright 2020, The QGIS Project' -import qgis # NOQA -from qgis.PyQt.QtCore import QDir, QSize, QTemporaryDir +from qgis.PyQt.QtCore import QSize, QTemporaryDir from qgis.PyQt.QtGui import QColor, QImage, QPainter from qgis.PyQt.QtXml import QDomDocument from qgis.core import ( @@ -38,7 +37,6 @@ QgsProject, QgsReadWriteContext, QgsRectangle, - QgsRenderChecker, QgsRenderContext, QgsVertexId, ) @@ -54,16 +52,8 @@ class TestQgsAnnotationLayer(QgisTestCase): @classmethod - def setUpClass(cls): - super().setUpClass() - cls.report = "

Python QgsAnnotationLayer Tests

\n" - - @classmethod - def tearDownClass(cls): - report_file_path = f"{QDir.tempPath()}/qgistest.html" - with open(report_file_path, 'a') as report_file: - report_file.write(cls.report) - super().tearDownClass() + def control_path_prefix(cls): + return 'annotation_layer' def testItems(self): layer = QgsAnnotationLayer('test', QgsAnnotationLayer.LayerOptions(QgsProject.instance().transformContext())) @@ -357,7 +347,7 @@ def testRenderLayer(self): finally: painter.end() - self.assertTrue(self.imageCheck('layer_render', 'layer_render', image)) + self.assertTrue(self.image_check('layer_render', 'layer_render', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -417,7 +407,7 @@ def testRenderWithTransform(self): finally: painter.end() - self.assertTrue(self.imageCheck('layer_render_transform', 'layer_render_transform', image)) + self.assertTrue(self.image_check('layer_render_transform', 'layer_render_transform', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -482,7 +472,7 @@ def testRenderLayerWithReferenceScale(self): finally: painter.end() - self.assertTrue(self.imageCheck('layer_render_reference_scale', 'layer_render_reference_scale', image)) + self.assertTrue(self.image_check('layer_render_reference_scale', 'layer_render_reference_scale', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() @@ -607,6 +597,7 @@ def test_render_via_job_with_transform(self): self.assertTrue(compareWkt(result, expected, tol=1000), "mismatch Expected:\n{}\nGot:\n{}\n".format(expected, result)) + def testRenderWithDisabledItems(self): layer = QgsAnnotationLayer('test', QgsAnnotationLayer.LayerOptions(QgsProject.instance().transformContext())) self.assertTrue(layer.isValid()) @@ -650,26 +641,12 @@ def testRenderWithDisabledItems(self): finally: painter.end() - self.assertTrue(self.imageCheck('layer_render_disabled', 'layer_render_disabled', image)) + self.assertTrue(self.image_check('layer_render_disabled', 'layer_render_disabled', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() self.assertEqual([i.layerId() for i in item_details], [layer.id()] * 3) self.assertCountEqual([i.itemId() for i in item_details], [i1_id]) - def imageCheck(self, name, reference_image, image): - TestQgsAnnotationLayer.report += f"

Render {name}

\n" - temp_dir = QDir.tempPath() + '/' - file_name = temp_dir + 'patch_' + name + ".png" - image.save(file_name, "PNG") - checker = QgsRenderChecker() - checker.setControlPathPrefix("annotation_layer") - checker.setControlName("expected_" + reference_image) - checker.setRenderedImage(file_name) - checker.setColorTolerance(2) - result = checker.compareImages(name, 20) - TestQgsAnnotationLayer.report += checker.report() - return result - if __name__ == '__main__': unittest.main() diff --git a/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled.png b/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled.png index 155536d99a920ebadf8a3ee1ae98dc44de4ab07f..0fff4975b9fc28f5b403d102ced22d45cdbd2c9f 100644 GIT binary patch literal 1018 zcmcgrX-^YT6dk9fOiigXtqbB)M?eq-BBo*`f}>1jO0f!JTp?f!Zn!)^EW{5!i>4UC zswiQJgkZE9+0+nY+|XA$0wy*QjUq8r6r(mS5d%h}!=LcOx##5G`|0GIinZpHpot+9 z34#bR3Vepd;y5UUG+Q>do|j0uU)WSc5bB5HnBdvxvJ!;ss*zujX>0Hgm`>L(oO~>O zX`jjO&fj1?ZT^+}R}syfEIM{#@7W))7H&D07j-}DUh6Dka|BJvNyM@Lm741M{Usw* zpR#;@lJDlg-sGd-OGbzvU$W`O#+aVM_xklO+1u79ogYe@sq%rcyQ906Uk@ zW^ynP{*I*Y(w+_E;B5FioKB7M*?86wMvFuEl+wD*XEU>BG@b;q)~SE46|K0VQnE$l z3r_mwi@!gdT}Q85pOwL&C@L8zDmFBsu1hA~K&23}}|X6#iUodEo_ zV8Pz0NXG*|BZOgZ1k!Q9uMyqY8;`b14_eWHy@6;e2ma9FW9*%V8U*l%5slazi5jG> zM(o1gB?#;=fg47)vOV!txYIs*BgD?B*(yj~SOiZP*eMm3W#nZZSTsU_FSv%w4zKD^ z4oR|+E75p>{F+_=evY#e$4x^8Y}FWLoeO)7>;i`+n=D-kinIc&mVZC2mux>+VV^{f ztpbN4oNI8`L2}FlUWYkD)wAl8Xy{Cv>CoHqUvaoAWSt^Z{k$%ghVAZ5m~%E9@A(PhI8rQQ}5 zvA_+RjSq$GYv?_qI!iC&s2|TRF>j#)-554CSD#Ibs=u8(J@@xFo2PH;)A-N)vG{)O z3tRI+g@*6H7QA9yaE^tEv(dpxVS)gM$|w^{ICRcj#lB+sy$R3Rm-;w<%@Oe6U=dV*auxcdx`XJ39%J&)q!IEgQF_2Cs2f=vni&(1oK# zuvD>+qtT#g-4Q`Wfwn74EtFUe3G5PcZ*kCA(G60-v`Y%ex#2MVafbj$=b}Ozo7!DZ zJXa|T-1C7oOKn6?m2UUIK+X7E3W@G8BfmE10VHWpOS!b|lcY@yZm7SB?s%Dt*5MJkEA3j$;W@ zezZcq@k)!uD^CSeg}z@x9!HM^<}&v!%s4Uzv-{D?FY;3PTpL}2cvu9j$#of(0p7fsY zlk2^!?tg6E-{0mo+I{Z?JX~tZe-`bzv&~m#&th{49yZbbfVcbQn=GzkX{Xt&s{g=9_PX{27|B5qhwnf4GO_LJ z=l~|9j7jzP-|N>^&X`xdXM@1+Uw?mmdvsLO$93i(KBFbQk2*Sbm|08L>*yc9wl;dX zfne&YgKR77cc`7(Z*P>p2sn};u$x~-;@3}qaq-7Ld!;|Vew4&{ zIdH1fo#rd<`|tNVAMZOlf42GYgP)&s+rR(!r{>Lz?~m`DoxL&h@-iXylv^=LYYmN! zh3)U}m5!ISm%H94(|KP^Ea~ad?(g$zcWx2s7Z-bU>rKv_xwE@}m%r;++?q3?bj_MI zM|N_HKRW*Udh+dcu^)eZef^{2{k@8RF9LIJZc_bM^-aglzEEl3y!qwM_mY@2ADo=5 zzH!SIk<+J7Z>;_O?Z(dH^fxy*FMqXhM$>-Ajy3_;?Ui55fh8w{r>mdKI;Vst00I;v AKmY&$ From c1b5d74bc46bda67a1ba807baff6476b0078f85c Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Mon, 15 Jan 2024 10:59:35 +0100 Subject: [PATCH 4/6] fix layout --- tests/src/python/test_qgsannotationlayer.py | 1 - 1 file changed, 1 deletion(-) diff --git a/tests/src/python/test_qgsannotationlayer.py b/tests/src/python/test_qgsannotationlayer.py index 37b4bc681ca1..a67fe0c787e6 100644 --- a/tests/src/python/test_qgsannotationlayer.py +++ b/tests/src/python/test_qgsannotationlayer.py @@ -597,7 +597,6 @@ def test_render_via_job_with_transform(self): self.assertTrue(compareWkt(result, expected, tol=1000), "mismatch Expected:\n{}\nGot:\n{}\n".format(expected, result)) - def testRenderWithDisabledItems(self): layer = QgsAnnotationLayer('test', QgsAnnotationLayer.LayerOptions(QgsProject.instance().transformContext())) self.assertTrue(layer.isValid()) From b68c9f868b825a7277140aa5dc3f2bf644ef4efd Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Tue, 16 Jan 2024 08:59:11 +0100 Subject: [PATCH 5/6] Update test_qgsannotationlayer.py --- tests/src/python/test_qgsannotationlayer.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/src/python/test_qgsannotationlayer.py b/tests/src/python/test_qgsannotationlayer.py index a67fe0c787e6..ee7f5f37ebb2 100644 --- a/tests/src/python/test_qgsannotationlayer.py +++ b/tests/src/python/test_qgsannotationlayer.py @@ -643,7 +643,7 @@ def testRenderWithDisabledItems(self): self.assertTrue(self.image_check('layer_render_disabled', 'layer_render_disabled', image)) # also check details of rendered items item_details = renderer.takeRenderedItemDetails() - self.assertEqual([i.layerId() for i in item_details], [layer.id()] * 3) + self.assertEqual([i.layerId() for i in item_details], [layer.id()] * 1) self.assertCountEqual([i.itemId() for i in item_details], [i1_id]) From a633cd5c4583aebc293e16dd93c6d7149bd00245 Mon Sep 17 00:00:00 2001 From: Denis Rouzaud Date: Wed, 17 Jan 2024 07:49:53 +0100 Subject: [PATCH 6/6] remove mask --- .../expected_layer_render_disabled_mask.png | Bin 973 -> 0 bytes 1 file changed, 0 insertions(+), 0 deletions(-) delete mode 100644 tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png diff --git a/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png b/tests/testdata/control_images/annotation_layer/expected_layer_render_disabled/expected_layer_render_disabled_mask.png deleted file mode 100644 index c0cded3f2532b9a78b1247ecfe8f325ca169b7fd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 973 zcmeAS@N?(olHy`uVBq!ia0vp^CqS5k4M?tyST_$yaTa()7BevL9RXp+soH$f3=GWm zo-U3d6?5L+y5052L8R^CTZ8xiPtBaY@a49z<`-pNZMe3SMRVc4H%za?LcJOJ|L&|} zykOMmpdi4(!Zb=@3xeGd)1JOkm2pz2$%&k{>uw&u{rkIXSN-}g8uKhtX0d@|#qAe` zA)GDdX9e7+I#e9i0dacMx)ysWZoW5q^HqVIZA$#E;6@h&nkIfqcLLXJQDRd|coOp6%B4w=71Sg?ro;gawZOW-+oTtZ`Fd7C!!*#Ym&@jk5x?(D6DJ zBZ=4F##@0``1n_rOB#h+92Izl+^tzINfd5zRp1qLuV%T#QMkoZ zfmgtNH%pOW;TB&7aUu8LEJcEaUmO+01>Egfii`@sxGJa%x!1E42^D_vR8SXi-_KHH zQ251HfnCV`KTDB7VUME%yTEY^mQBWmJ+2DYLdPpuHVGH@cq&*69N)q6NwKiUSD}1b z>dh}}ERLy7$Ukz>w(*ZTpPZn_-=4=;)5MO)EaP{PQQ5vKs(#yy85Yk>{<1_m%X~I+ zjN9<=xtain%tn+nE|U;B&9{7a#&idTAJt!()@^&LcWv7H&(9x8_)N&RvlX)p>rMaV z@b3PX_j#Z8ste}Mu$!>zyt3f&9e0lYdKM|sZ}xX_`cXr<#ygeYJ5>7&IiGZHUC5D~ b^Piz}!-JBudBVqm`IEuZ)z4*}Q$iB}#gI5z