Skip to content

Commit

Permalink
[FEATURE] Add picture annotation item type
Browse files Browse the repository at this point in the history
Can render SVG or raster images as items in an annotation layer.
Options are present for:

- Locking the picture's aspect ratio
- Drawing with a background symbol
- Drawing with a border symbol
- Linked or embedded pictures
  • Loading branch information
nyalldawson committed Jul 16, 2024
1 parent 9c39636 commit 60489b5
Show file tree
Hide file tree
Showing 47 changed files with 1,990 additions and 6 deletions.
3 changes: 2 additions & 1 deletion python/PyQt6/core/auto_additions/qgis.py
Original file line number Diff line number Diff line change
Expand Up @@ -2065,7 +2065,8 @@
Qgis.Axis.baseClass = Qgis
# monkey patching scoped based enum
Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__ = "Item's bounding box will vary depending on map scale"
Qgis.AnnotationItemFlag.__doc__ = "Flags for annotation items.\n\n.. versionadded:: 3.22\n\n" + '* ``ScaleDependentBoundingBox``: ' + Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__
Qgis.AnnotationItemFlag.SupportsReferenceScale.__doc__ = "Item supports reference scale based rendering (since QGIS 3.40)"
Qgis.AnnotationItemFlag.__doc__ = "Flags for annotation items.\n\n.. versionadded:: 3.22\n\n" + '* ``ScaleDependentBoundingBox``: ' + Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__ + '\n' + '* ``SupportsReferenceScale``: ' + Qgis.AnnotationItemFlag.SupportsReferenceScale.__doc__
# --
Qgis.AnnotationItemFlags = lambda flags=0: Qgis.AnnotationItemFlag(flags)
Qgis.AnnotationItemFlag.baseClass = Qgis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ Abstract base class for annotation items which are drawn with :py:class:`QgsAnno
{
sipType = sipType_QgsAnnotationLineTextItem;
}
else if ( sipCpp->type() == QLatin1String( "picture" ) )
{
sipType = sipType_QgsAnnotationPictureItem;
}
else
{
sipType = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Constructor for QgsAnnotationLineItem, with the specified ``curve``.

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;

virtual Qgis::AnnotationItemFlags flags() const;


static QgsAnnotationLineItem *create() /Factory/;
%Docstring
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,195 @@
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/annotations/qgsannotationpictureitem.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/




class QgsAnnotationPictureItem : QgsAnnotationItem
{
%Docstring(signature="appended")
An annotation item which renders a picture.

.. versionadded:: 3.40
%End

%TypeHeaderCode
#include "qgsannotationpictureitem.h"
%End
public:

QgsAnnotationPictureItem( Qgis::PictureFormat format, const QString &path, const QgsRectangle &bounds );
%Docstring
Constructor for QgsAnnotationPictureItem, rendering the specified image ``path``
within the specified ``bounds`` geometry.
%End
~QgsAnnotationPictureItem();

virtual QString type() const;

virtual void render( QgsRenderContext &context, QgsFeedback *feedback );

virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual Qgis::AnnotationItemEditOperationResult applyEdit( QgsAbstractAnnotationItemEditOperation *operation );

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;


static QgsAnnotationPictureItem *create() /Factory/;
%Docstring
Creates a new polygon annotation item.
%End

virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context );

virtual QgsAnnotationPictureItem *clone() const /Factory/;

virtual QgsRectangle boundingBox() const;


QgsRectangle bounds() const;
%Docstring
Returns the bounds of the picture.

The coordinate reference system for the bounds will be the parent layer's :py:func:`QgsAnnotationLayer.crs()`.

.. seealso:: :py:func:`setBounds`
%End

void setBounds( const QgsRectangle &bounds );
%Docstring
Sets the ``bounds`` of the picture.

The coordinate reference system for the bounds will be the parent layer's :py:func:`QgsAnnotationLayer.crs()`.

.. seealso:: :py:func:`bounds`
%End

QString path() const;
%Docstring
Returns the path of the image used to render the item.

.. seealso:: :py:func:`setPath`
%End

Qgis::PictureFormat format() const;
%Docstring
Returns the picture format.
%End

void setPath( Qgis::PictureFormat format, const QString &path );
%Docstring
Sets the ``format`` and ``path`` of the image used to render the item.

.. seealso:: :py:func:`path`

.. seealso:: :py:func:`format`
%End

bool lockAspectRatio() const;
%Docstring
Returns ``True`` if the aspect ratio of the picture will be retained.

.. seealso:: :py:func:`setLockAspectRatio`
%End

void setLockAspectRatio( bool locked );
%Docstring
Sets whether the aspect ratio of the picture will be retained.

.. seealso:: :py:func:`lockAspectRatio`
%End

bool backgroundEnabled() const;
%Docstring
Returns ``True`` if the item's background should be rendered.

.. seealso:: :py:func:`setBackgroundEnabled`

.. seealso:: :py:func:`backgroundSymbol`
%End

void setBackgroundEnabled( bool enabled );
%Docstring
Sets whether the item's background should be rendered.

.. seealso:: :py:func:`backgroundEnabled`

.. seealso:: :py:func:`setBackgroundSymbol`
%End

const QgsFillSymbol *backgroundSymbol() const;
%Docstring
Returns the symbol used to render the item's background.

.. seealso:: :py:func:`backgroundEnabled`

.. seealso:: :py:func:`setBackgroundSymbol`
%End

void setBackgroundSymbol( QgsFillSymbol *symbol /Transfer/ );
%Docstring
Sets the ``symbol`` used to render the item's background.

The item takes ownership of the symbol.

.. seealso:: :py:func:`backgroundSymbol`

.. seealso:: :py:func:`setBackgroundEnabled`
%End

bool frameEnabled() const;
%Docstring
Returns ``True`` if the item's frame should be rendered.

.. seealso:: :py:func:`setFrameEnabled`

.. seealso:: :py:func:`frameSymbol`
%End

void setFrameEnabled( bool enabled );
%Docstring
Sets whether the item's frame should be rendered.

.. seealso:: :py:func:`frameEnabled`

.. seealso:: :py:func:`setFrameSymbol`
%End

const QgsFillSymbol *frameSymbol() const;
%Docstring
Returns the symbol used to render the item's frame.

.. seealso:: :py:func:`frameEnabled`

.. seealso:: :py:func:`setFrameSymbol`
%End

void setFrameSymbol( QgsFillSymbol *symbol /Transfer/ );
%Docstring
Sets the ``symbol`` used to render the item's frame.

The item takes ownership of the symbol.

.. seealso:: :py:func:`frameSymbol`

.. seealso:: :py:func:`setBackgroundEnabled`
%End

private:
QgsAnnotationPictureItem( const QgsAnnotationPictureItem &other );
};
/************************************************************************
* This file has been generated automatically from *
* *
* src/core/annotations/qgsannotationpictureitem.h *
* *
* Do not edit manually ! Edit header and run scripts/sipify.pl again *
************************************************************************/
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Constructor for QgsAnnotationPolygonItem, with the specified ``polygon`` geometr

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;

virtual Qgis::AnnotationItemFlags flags() const;


static QgsAnnotationPolygonItem *create() /Factory/;
%Docstring
Expand Down
1 change: 1 addition & 0 deletions python/PyQt6/core/auto_generated/qgis.sip.in
Original file line number Diff line number Diff line change
Expand Up @@ -1230,6 +1230,7 @@ The development version
enum class AnnotationItemFlag /BaseType=IntFlag/
{
ScaleDependentBoundingBox,
SupportsReferenceScale,
};
typedef QFlags<Qgis::AnnotationItemFlag> AnnotationItemFlags;

Expand Down
1 change: 1 addition & 0 deletions python/PyQt6/core/core_auto.sip
Original file line number Diff line number Diff line change
Expand Up @@ -232,6 +232,7 @@
%Include auto_generated/annotations/qgsannotationlinetextitem.sip
%Include auto_generated/annotations/qgsannotationmarkeritem.sip
%Include auto_generated/annotations/qgsannotationmanager.sip
%Include auto_generated/annotations/qgsannotationpictureitem.sip
%Include auto_generated/annotations/qgsannotationpointtextitem.sip
%Include auto_generated/annotations/qgsannotationpolygonitem.sip
%Include auto_generated/annotations/qgshtmlannotation.sip
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,7 @@ whenever this signal is emitted.
%End
public:


virtual ~QgsCreateAnnotationItemMapToolInterface();

virtual QgsCreateAnnotationItemMapToolHandler *handler() = 0;
Expand Down
3 changes: 2 additions & 1 deletion python/core/auto_additions/qgis.py
Original file line number Diff line number Diff line change
Expand Up @@ -2027,7 +2027,8 @@
Qgis.Axis.baseClass = Qgis
# monkey patching scoped based enum
Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__ = "Item's bounding box will vary depending on map scale"
Qgis.AnnotationItemFlag.__doc__ = "Flags for annotation items.\n\n.. versionadded:: 3.22\n\n" + '* ``ScaleDependentBoundingBox``: ' + Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__
Qgis.AnnotationItemFlag.SupportsReferenceScale.__doc__ = "Item supports reference scale based rendering (since QGIS 3.40)"
Qgis.AnnotationItemFlag.__doc__ = "Flags for annotation items.\n\n.. versionadded:: 3.22\n\n" + '* ``ScaleDependentBoundingBox``: ' + Qgis.AnnotationItemFlag.ScaleDependentBoundingBox.__doc__ + '\n' + '* ``SupportsReferenceScale``: ' + Qgis.AnnotationItemFlag.SupportsReferenceScale.__doc__
# --
Qgis.AnnotationItemFlag.baseClass = Qgis
Qgis.AnnotationItemFlags.baseClass = Qgis
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,10 @@ Abstract base class for annotation items which are drawn with :py:class:`QgsAnno
{
sipType = sipType_QgsAnnotationLineTextItem;
}
else if ( sipCpp->type() == QLatin1String( "picture" ) )
{
sipType = sipType_QgsAnnotationPictureItem;
}
else
{
sipType = 0;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ Constructor for QgsAnnotationLineItem, with the specified ``curve``.

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;

virtual Qgis::AnnotationItemFlags flags() const;


static QgsAnnotationLineItem *create() /Factory/;
%Docstring
Expand Down
Loading

0 comments on commit 60489b5

Please sign in to comment.