Skip to content

Commit 4c9072e

Browse files
committed
Only render main annotation layer in main map canvas or docked maps
Don't show it in other map canvas instances, eg the coordinate bounds preview map Fixes qgis#58766
1 parent 5b47adf commit 4c9072e

File tree

12 files changed

+153
-2
lines changed

12 files changed

+153
-2
lines changed

python/PyQt6/core/auto_additions/qgis.py

+14
Original file line numberDiff line numberDiff line change
@@ -5972,6 +5972,20 @@
59725972
# --
59735973
Qgis.RendererUsage.baseClass = Qgis
59745974
# monkey patching scoped based enum
5975+
Qgis.MapCanvasFlag.ShowMainAnnotationLayer.__doc__ = "The project's main annotation layer should be rendered in the canvas"
5976+
Qgis.MapCanvasFlag.__doc__ = """Flags controlling behavior of map canvases.
5977+
5978+
.. versionadded:: 3.40
5979+
5980+
* ``ShowMainAnnotationLayer``: The project's main annotation layer should be rendered in the canvas
5981+
5982+
"""
5983+
# --
5984+
Qgis.MapCanvasFlag.baseClass = Qgis
5985+
Qgis.MapCanvasFlags = lambda flags=0: Qgis.MapCanvasFlag(flags)
5986+
Qgis.MapCanvasFlags.baseClass = Qgis
5987+
MapCanvasFlags = Qgis # dirty hack since SIP seems to introduce the flags in module
5988+
# monkey patching scoped based enum
59755989
Qgis.ViewSyncModeFlag.Sync3DTo2D.__doc__ = "Synchronize 3D view camera to the main map canvas extent"
59765990
Qgis.ViewSyncModeFlag.Sync2DTo3D.__doc__ = "Update the 2D main canvas extent to include the viewed area from the 3D view"
59775991
Qgis.ViewSyncModeFlag.__doc__ = """Synchronization of 2D map canvas and 3D view

python/PyQt6/core/auto_generated/qgis.sip.in

+10
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,14 @@ The development version
18581858
Unknown,
18591859
};
18601860

1861+
enum class MapCanvasFlag /BaseType=IntFlag/
1862+
{
1863+
ShowMainAnnotationLayer,
1864+
};
1865+
1866+
typedef QFlags<Qgis::MapCanvasFlag> MapCanvasFlags;
1867+
1868+
18611869
enum class ViewSyncModeFlag /BaseType=IntFlag/
18621870
{
18631871
Sync3DTo2D,
@@ -3376,6 +3384,8 @@ QFlags<Qgis::DataProviderReadFlag> operator|(Qgis::DataProviderReadFlag f1, QFla
33763384

33773385
QFlags<Qgis::VectorProviderCapability> operator|(Qgis::VectorProviderCapability f1, QFlags<Qgis::VectorProviderCapability> f2);
33783386

3387+
QFlags<Qgis::MapCanvasFlag> operator|(Qgis::MapCanvasFlag f1, QFlags<Qgis::MapCanvasFlag> f2);
3388+
33793389

33803390

33813391

python/PyQt6/gui/auto_generated/qgsmapcanvas.sip.in

+18
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,24 @@ to first clear the theme association by calling :py:func:`~QgsMapCanvas.setTheme
7676
empty string before :py:func:`~QgsMapCanvas.setLayers` calls can be made.
7777

7878
.. seealso:: :py:func:`layers`
79+
%End
80+
81+
void setFlags( Qgis::MapCanvasFlags flags );
82+
%Docstring
83+
Sets ``flags`` which control how the map canvas behaves.
84+
85+
.. seealso:: :py:func:`flags`
86+
87+
.. versionadded:: 3.40
88+
%End
89+
90+
Qgis::MapCanvasFlags flags() const;
91+
%Docstring
92+
Returns flags which control how the map canvas behaves.
93+
94+
.. seealso:: :py:func:`setFlags`
95+
96+
.. versionadded:: 3.40
7997
%End
8098

8199
void setCurrentLayer( QgsMapLayer *layer );

python/core/auto_additions/qgis.py

+13
Original file line numberDiff line numberDiff line change
@@ -5918,6 +5918,19 @@
59185918
# --
59195919
Qgis.RendererUsage.baseClass = Qgis
59205920
# monkey patching scoped based enum
5921+
Qgis.MapCanvasFlag.ShowMainAnnotationLayer.__doc__ = "The project's main annotation layer should be rendered in the canvas"
5922+
Qgis.MapCanvasFlag.__doc__ = """Flags controlling behavior of map canvases.
5923+
5924+
.. versionadded:: 3.40
5925+
5926+
* ``ShowMainAnnotationLayer``: The project's main annotation layer should be rendered in the canvas
5927+
5928+
"""
5929+
# --
5930+
Qgis.MapCanvasFlag.baseClass = Qgis
5931+
Qgis.MapCanvasFlags.baseClass = Qgis
5932+
MapCanvasFlags = Qgis # dirty hack since SIP seems to introduce the flags in module
5933+
# monkey patching scoped based enum
59215934
Qgis.ViewSyncModeFlag.Sync3DTo2D.__doc__ = "Synchronize 3D view camera to the main map canvas extent"
59225935
Qgis.ViewSyncModeFlag.Sync2DTo3D.__doc__ = "Update the 2D main canvas extent to include the viewed area from the 3D view"
59235936
Qgis.ViewSyncModeFlag.__doc__ = """Synchronization of 2D map canvas and 3D view

python/core/auto_generated/qgis.sip.in

+10
Original file line numberDiff line numberDiff line change
@@ -1858,6 +1858,14 @@ The development version
18581858
Unknown,
18591859
};
18601860

1861+
enum class MapCanvasFlag
1862+
{
1863+
ShowMainAnnotationLayer,
1864+
};
1865+
1866+
typedef QFlags<Qgis::MapCanvasFlag> MapCanvasFlags;
1867+
1868+
18611869
enum class ViewSyncModeFlag
18621870
{
18631871
Sync3DTo2D,
@@ -3376,6 +3384,8 @@ QFlags<Qgis::DataProviderReadFlag> operator|(Qgis::DataProviderReadFlag f1, QFla
33763384

33773385
QFlags<Qgis::VectorProviderCapability> operator|(Qgis::VectorProviderCapability f1, QFlags<Qgis::VectorProviderCapability> f2);
33783386

3387+
QFlags<Qgis::MapCanvasFlag> operator|(Qgis::MapCanvasFlag f1, QFlags<Qgis::MapCanvasFlag> f2);
3388+
33793389

33803390

33813391

python/gui/auto_generated/qgsmapcanvas.sip.in

+18
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,24 @@ to first clear the theme association by calling :py:func:`~QgsMapCanvas.setTheme
7676
empty string before :py:func:`~QgsMapCanvas.setLayers` calls can be made.
7777

7878
.. seealso:: :py:func:`layers`
79+
%End
80+
81+
void setFlags( Qgis::MapCanvasFlags flags );
82+
%Docstring
83+
Sets ``flags`` which control how the map canvas behaves.
84+
85+
.. seealso:: :py:func:`flags`
86+
87+
.. versionadded:: 3.40
88+
%End
89+
90+
Qgis::MapCanvasFlags flags() const;
91+
%Docstring
92+
Returns flags which control how the map canvas behaves.
93+
94+
.. seealso:: :py:func:`setFlags`
95+
96+
.. versionadded:: 3.40
7997
%End
8098

8199
void setCurrentLayer( QgsMapLayer *layer );

src/app/qgisapp.cpp

+2
Original file line numberDiff line numberDiff line change
@@ -1069,6 +1069,7 @@ QgisApp::QgisApp( QSplashScreen *splash, bool restorePlugins, bool skipBadLayers
10691069
startProfile( tr( "Creating map canvas" ) );
10701070
mMapCanvas = new QgsMapCanvas( centralWidget );
10711071
mMapCanvas->setObjectName( QStringLiteral( "theMapCanvas" ) );
1072+
mMapCanvas->setFlags( Qgis::MapCanvasFlag::ShowMainAnnotationLayer );
10721073

10731074
// before anything, let's freeze canvas redraws
10741075
QgsCanvasRefreshBlocker refreshBlocker;
@@ -2091,6 +2092,7 @@ QgisApp::QgisApp()
20912092

20922093
mInternalClipboard = new QgsClipboard;
20932094
mMapCanvas = new QgsMapCanvas();
2095+
mMapCanvas->setFlags( Qgis::MapCanvasFlag::ShowMainAnnotationLayer );
20942096
connect( mMapCanvas, &QgsMapCanvas::messageEmitted, this, &QgisApp::displayMessage );
20952097
QgsCanvasRefreshBlocker refreshBlocker;
20962098
mLayerTreeView = new QgsLayerTreeView( this );

src/app/qgsmapcanvasdockwidget.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,7 @@ QgsMapCanvasDockWidget::QgsMapCanvasDockWidget( const QString &name, QWidget *pa
5454
mToolbar->setIconSize( QgisApp::instance()->iconSize( true ) );
5555

5656
mMapCanvas = new QgsMapCanvas( this );
57+
mMapCanvas->setFlags( Qgis::MapCanvasFlag::ShowMainAnnotationLayer );
5758
mXyMarker = new QgsVertexMarker( mMapCanvas );
5859
mXyMarker->setIconType( QgsVertexMarker::ICON_CIRCLE );
5960
mXyMarker->setIconSize( 6 );

src/core/qgis.h

+20
Original file line numberDiff line numberDiff line change
@@ -3192,6 +3192,25 @@ class CORE_EXPORT Qgis
31923192
};
31933193
Q_ENUM( RendererUsage )
31943194

3195+
/**
3196+
* Flags controlling behavior of map canvases.
3197+
*
3198+
* \since QGIS 3.40
3199+
*/
3200+
enum class MapCanvasFlag : int SIP_ENUM_BASETYPE( IntFlag )
3201+
{
3202+
ShowMainAnnotationLayer = 1 << 0, //!< The project's main annotation layer should be rendered in the canvas
3203+
};
3204+
Q_ENUM( MapCanvasFlag )
3205+
3206+
/**
3207+
* Flags controlling behavior of map canvases.
3208+
*
3209+
* \since QGIS 3.40
3210+
*/
3211+
Q_DECLARE_FLAGS( MapCanvasFlags, MapCanvasFlag )
3212+
Q_FLAG( MapCanvasFlags )
3213+
31953214
/**
31963215
* Synchronization of 2D map canvas and 3D view
31973216
*
@@ -5728,6 +5747,7 @@ Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::DataItemProviderCapabilities )
57285747
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorRenderingSimplificationFlags )
57295748
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::DataProviderReadFlags )
57305749
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::VectorProviderCapabilities )
5750+
Q_DECLARE_OPERATORS_FOR_FLAGS( Qgis::MapCanvasFlags )
57315751

57325752
// hack to workaround warnings when casting void pointers
57335753
// retrieved from QLibrary::resolve to function pointers.

src/gui/qgsmapcanvas.cpp

+14-2
Original file line numberDiff line numberDiff line change
@@ -408,6 +408,16 @@ void QgsMapCanvas::setLayers( const QList<QgsMapLayer *> &layers )
408408
setLayersPrivate( layers );
409409
}
410410

411+
void QgsMapCanvas::setFlags( Qgis::MapCanvasFlags flags )
412+
{
413+
mFlags = flags;
414+
}
415+
416+
Qgis::MapCanvasFlags QgsMapCanvas::flags() const
417+
{
418+
return mFlags;
419+
}
420+
411421
void QgsMapCanvas::setLayersPrivate( const QList<QgsMapLayer *> &layers )
412422
{
413423
const QList<QgsMapLayer *> oldLayers = mSettings.layers();
@@ -825,7 +835,8 @@ void QgsMapCanvas::refreshMap()
825835
// render main annotation layer above all other layers
826836
QgsMapSettings renderSettings = mSettings;
827837
QList<QgsMapLayer *> allLayers = renderSettings.layers();
828-
allLayers.insert( 0, QgsProject::instance()->mainAnnotationLayer() );
838+
if ( mFlags & Qgis::MapCanvasFlag::ShowMainAnnotationLayer )
839+
allLayers.insert( 0, QgsProject::instance()->mainAnnotationLayer() );
829840

830841
renderSettings.setLayers( filterLayersForRender( allLayers ) );
831842

@@ -3590,7 +3601,8 @@ void QgsMapCanvas::startPreviewJob( int number )
35903601

35913602
previewLayers << layer;
35923603
}
3593-
if ( QgsProject::instance()->mainAnnotationLayer()->dataProvider()->renderInPreview( context ) )
3604+
if ( ( mFlags & Qgis::MapCanvasFlag::ShowMainAnnotationLayer )
3605+
&& QgsProject::instance()->mainAnnotationLayer()->dataProvider()->renderInPreview( context ) )
35943606
{
35953607
previewLayers.insert( 0, QgsProject::instance()->mainAnnotationLayer() );
35963608
}

src/gui/qgsmapcanvas.h

+18
Original file line numberDiff line numberDiff line change
@@ -141,6 +141,22 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView, public QgsExpressionContex
141141
*/
142142
void setLayers( const QList<QgsMapLayer *> &layers );
143143

144+
/**
145+
* Sets \a flags which control how the map canvas behaves.
146+
*
147+
* \see flags()
148+
* \since QGIS 3.40
149+
*/
150+
void setFlags( Qgis::MapCanvasFlags flags );
151+
152+
/**
153+
* Returns flags which control how the map canvas behaves.
154+
*
155+
* \see setFlags()
156+
* \since QGIS 3.40
157+
*/
158+
Qgis::MapCanvasFlags flags() const;
159+
144160
void setCurrentLayer( QgsMapLayer *layer );
145161

146162
/**
@@ -1306,6 +1322,8 @@ class GUI_EXPORT QgsMapCanvas : public QGraphicsView, public QgsExpressionContex
13061322

13071323
QgsOverlayWidgetLayout *mLayout = nullptr;
13081324

1325+
Qgis::MapCanvasFlags mFlags;
1326+
13091327
//! encompases all map settings necessary for map rendering
13101328
QgsMapSettings mSettings;
13111329

tests/src/python/test_qgsmapcanvas.py

+15
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717
from qgis.PyQt.QtGui import QImage
1818
from qgis.PyQt.QtXml import QDomDocument
1919
from qgis.core import (
20+
Qgis,
2021
QgsAnnotationLayer,
2122
QgsAnnotationLineItem,
2223
QgsAnnotationMarkerItem,
@@ -509,6 +510,20 @@ def testMainAnnotationLayerRendered(self):
509510

510511
# annotation must be rendered over other layers
511512
rendered_image = self.canvas_to_image(canvas)
513+
514+
# should NOT be shown, as ShowMainAnnotationLayer flag not set
515+
self.assertFalse(
516+
self.image_check('main_annotation_layer', 'main_annotation_layer', rendered_image,
517+
color_tolerance=2,
518+
allowed_mismatch=20,
519+
expect_fail=True)
520+
)
521+
522+
canvas.setFlags(Qgis.MapCanvasFlag.ShowMainAnnotationLayer)
523+
canvas.refresh()
524+
canvas.waitWhileRendering()
525+
rendered_image = self.canvas_to_image(canvas)
526+
# now annotation should be rendered
512527
self.assertTrue(
513528
self.image_check('main_annotation_layer', 'main_annotation_layer', rendered_image,
514529
color_tolerance=2,

0 commit comments

Comments
 (0)