Skip to content

Commit

Permalink
Add method to create rubber band geometry for an annotation item
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Sep 7, 2021
1 parent 8d1f2bf commit 6d926d4
Show file tree
Hide file tree
Showing 11 changed files with 57 additions and 0 deletions.
10 changes: 10 additions & 0 deletions python/core/auto_generated/annotations/qgsannotationitem.sip.in
Expand Up @@ -198,6 +198,16 @@ exactly 2mm thick when a map is rendered at 1:1000, or 1mm thick when rendered a
.. seealso:: :py:func:`symbologyReferenceScale`

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

virtual QgsGeometry rubberBandGeometry() const;
%Docstring
Returns the geometry to use as a rubber band for map tools which manipulate the item.

The default implementation returns a null geometry, which indicates that the item bounds should
be used as the rubber band.

.. versionadded:: 3.22
%End

protected:
Expand Down
Expand Up @@ -37,6 +37,8 @@ Constructor for QgsAnnotationLineItem, with the specified ``linestring``.

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual QgsGeometry rubberBandGeometry() const;

virtual bool transform( const QTransform &transform );


Expand Down
Expand Up @@ -37,6 +37,8 @@ Constructor for QgsAnnotationPolygonItem, with the specified ``polygon`` geometr

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual QgsGeometry rubberBandGeometry() const;

virtual bool transform( const QTransform &transform );


Expand Down
5 changes: 5 additions & 0 deletions src/core/annotations/qgsannotationitem.cpp
Expand Up @@ -50,3 +50,8 @@ bool QgsAnnotationItem::readCommonProperties( const QDomElement &element, const
setSymbologyReferenceScale( element.attribute( QStringLiteral( "referenceScale" ) ).toDouble() );
return true;
}

QgsGeometry QgsAnnotationItem::rubberBandGeometry() const
{
return QgsGeometry();
}
10 changes: 10 additions & 0 deletions src/core/annotations/qgsannotationitem.h
Expand Up @@ -221,6 +221,16 @@ class CORE_EXPORT QgsAnnotationItem
*/
void setSymbologyReferenceScale( double scale ) { mReferenceScale = scale; }

/**
* Returns the geometry to use as a rubber band for map tools which manipulate the item.
*
* The default implementation returns a null geometry, which indicates that the item bounds should
* be used as the rubber band.
*
* \since QGIS 3.22
*/
virtual QgsGeometry rubberBandGeometry() const;

protected:

/**
Expand Down
5 changes: 5 additions & 0 deletions src/core/annotations/qgsannotationlineitem.cpp
Expand Up @@ -90,6 +90,11 @@ QList<QgsAnnotationItemNode> QgsAnnotationLineItem::nodes() const
return res;
}

QgsGeometry QgsAnnotationLineItem::rubberBandGeometry() const
{
return QgsGeometry( mCurve->clone() );
}

bool QgsAnnotationLineItem::transform( const QTransform &transform )
{
mCurve->transform( transform );
Expand Down
1 change: 1 addition & 0 deletions src/core/annotations/qgsannotationlineitem.h
Expand Up @@ -44,6 +44,7 @@ class CORE_EXPORT QgsAnnotationLineItem : public QgsAnnotationItem
void render( QgsRenderContext &context, QgsFeedback *feedback ) override;
bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
QList< QgsAnnotationItemNode > nodes() const override;
QgsGeometry rubberBandGeometry() const override;
bool transform( const QTransform &transform ) override;

/**
Expand Down
5 changes: 5 additions & 0 deletions src/core/annotations/qgsannotationpolygonitem.cpp
Expand Up @@ -121,6 +121,11 @@ QList<QgsAnnotationItemNode> QgsAnnotationPolygonItem::nodes() const
return res;
}

QgsGeometry QgsAnnotationPolygonItem::rubberBandGeometry() const
{
return QgsGeometry( mPolygon->clone() );
}

bool QgsAnnotationPolygonItem::transform( const QTransform &transform )
{
mPolygon->transform( transform );
Expand Down
1 change: 1 addition & 0 deletions src/core/annotations/qgsannotationpolygonitem.h
Expand Up @@ -43,6 +43,7 @@ class CORE_EXPORT QgsAnnotationPolygonItem : public QgsAnnotationItem
void render( QgsRenderContext &context, QgsFeedback *feedback ) override;
bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
QList< QgsAnnotationItemNode > nodes() const override;
QgsGeometry rubberBandGeometry() const override;
bool transform( const QTransform &transform ) override;

/**
Expand Down
8 changes: 8 additions & 0 deletions tests/src/python/test_qgsannotationlineitem.py
Expand Up @@ -88,6 +88,14 @@ def test_transform(self):
item.transform(transform)
self.assertEqual(item.geometry().asWkt(), 'LineString (112 213, 114 213, 114 215)')

def test_rubberbandgeometry(self):
"""
Test creating rubber band geometry
"""
item = QgsAnnotationLineItem(QgsLineString([QgsPoint(12, 13), QgsPoint(14, 13), QgsPoint(14, 15)]))
band = item.rubberBandGeometry()
self.assertEqual(band.asWkt(), 'LineString (12 13, 14 13, 14 15)')

def testReadWriteXml(self):
doc = QDomDocument("testdoc")
elem = doc.createElement('test')
Expand Down
8 changes: 8 additions & 0 deletions tests/src/python/test_qgsannotationpolygonitem.py
Expand Up @@ -83,6 +83,14 @@ def test_nodes(self):
QgsAnnotationItemNode(QgsPointXY(14, 13), Qgis.AnnotationItemNodeType.VertexHandle),
QgsAnnotationItemNode(QgsPointXY(14, 15), Qgis.AnnotationItemNodeType.VertexHandle)])

def test_rubberbandgeometry(self):
"""
Test creating rubber band geometry
"""
item = QgsAnnotationPolygonItem(QgsPolygon(QgsLineString([QgsPoint(12, 13), QgsPoint(14, 13), QgsPoint(14, 15), QgsPoint(12, 13)])))
band = item.rubberBandGeometry()
self.assertEqual(band.asWkt(), 'Polygon ((12 13, 14 13, 14 15, 12 13))')

def test_transform(self):
item = QgsAnnotationPolygonItem(QgsPolygon(QgsLineString([QgsPoint(12, 13), QgsPoint(14, 13), QgsPoint(14, 15), QgsPoint(12, 13)])))
self.assertEqual(item.geometry().asWkt(), 'Polygon ((12 13, 14 13, 14 15, 12 13))')
Expand Down

0 comments on commit 6d926d4

Please sign in to comment.