Skip to content

Commit

Permalink
Use an edit operation for annotation item translation, instead of
Browse files Browse the repository at this point in the history
transform

Will make it easier to add undo/redo support in future
  • Loading branch information
nyalldawson committed Sep 10, 2021
1 parent f76b262 commit a7d299d
Show file tree
Hide file tree
Showing 26 changed files with 255 additions and 165 deletions.
3 changes: 2 additions & 1 deletion python/core/auto_additions/qgsannotationitemeditoperation.py
Expand Up @@ -2,5 +2,6 @@
# monkey patching scoped based enum
QgsAbstractAnnotationItemEditOperation.Type.MoveNode.__doc__ = "Move a node"
QgsAbstractAnnotationItemEditOperation.Type.DeleteNode.__doc__ = "Delete a node"
QgsAbstractAnnotationItemEditOperation.Type.__doc__ = 'Operation type\n\n' + '* ``MoveNode``: ' + QgsAbstractAnnotationItemEditOperation.Type.MoveNode.__doc__ + '\n' + '* ``DeleteNode``: ' + QgsAbstractAnnotationItemEditOperation.Type.DeleteNode.__doc__
QgsAbstractAnnotationItemEditOperation.Type.TranslateItem.__doc__ = "Translate (move) an item"
QgsAbstractAnnotationItemEditOperation.Type.__doc__ = 'Operation type\n\n' + '* ``MoveNode``: ' + QgsAbstractAnnotationItemEditOperation.Type.MoveNode.__doc__ + '\n' + '* ``DeleteNode``: ' + QgsAbstractAnnotationItemEditOperation.Type.DeleteNode.__doc__ + '\n' + '* ``TranslateItem``: ' + QgsAbstractAnnotationItemEditOperation.Type.TranslateItem.__doc__
# --
19 changes: 0 additions & 19 deletions python/core/auto_generated/annotations/qgsannotationitem.sip.in
Expand Up @@ -82,15 +82,6 @@ Returns the bounding box of the item's geographic location, in the parent layer'
virtual QgsRectangle boundingBox( QgsRenderContext &context ) const;
%Docstring
Returns the bounding box of the item's geographic location, in the parent layer's coordinate reference system.
%End

virtual bool transform( const QTransform &transform ) = 0;
%Docstring
Transforms the item's geometry using the specified ``transform``.

Returns ``True`` if the transformation was successful.

.. versionadded:: 3.22
%End

virtual void render( QgsRenderContext &context, QgsFeedback *feedback ) = 0;
Expand Down Expand Up @@ -212,16 +203,6 @@ 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 @@ -26,6 +26,7 @@ Abstract base class for annotation item edit operations
{
MoveNode,
DeleteNode,
TranslateItem,
};

QgsAbstractAnnotationItemEditOperation( const QString &itemId );
Expand Down Expand Up @@ -128,6 +129,50 @@ Returns the node position before the delete occurred (in layer coordinates).

};


class QgsAnnotationItemEditOperationTranslateItem : QgsAbstractAnnotationItemEditOperation
{
%Docstring(signature="appended")
Annotation item edit operation consisting of translating (moving) an item

.. versionadded:: 3.22
%End

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

QgsAnnotationItemEditOperationTranslateItem( const QString &itemId, double translateX, double translateY );
%Docstring
Constructor for QgsAnnotationItemEditOperationTranslateItem, where the node with the specified ``id`` and translation
(in map units)
%End

virtual Type type() const;


QgsVertexId nodeId() const;
%Docstring
Returns the deleted node ID.
%End

double translationX() const;
%Docstring
Returns the x-axis translation, in layer units.

\since :py:func:`~QgsAnnotationItemEditOperationTranslateItem.translationY`
%End

double translationY() const;
%Docstring
Returns the y-axis translation, in layer units.

\since :py:func:`~QgsAnnotationItemEditOperationTranslateItem.translationX`
%End

};

class QgsAnnotationItemEditOperationTransientResults
{
%Docstring(signature="appended")
Expand Down
Expand Up @@ -37,10 +37,6 @@ Constructor for QgsAnnotationLineItem, with the specified ``linestring``.

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual QgsGeometry rubberBandGeometry() const;

virtual bool transform( const QTransform &transform );

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

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;
Expand Down
Expand Up @@ -57,8 +57,6 @@ Creates a new marker annotation item.

virtual QgsRectangle boundingBox( QgsRenderContext &context ) const;

virtual bool transform( const QTransform &transform );


QgsPointXY geometry() const;
%Docstring
Expand Down
Expand Up @@ -53,8 +53,6 @@ Creates a new text at point annotation item.

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual bool transform( const QTransform &transform );

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

virtual QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) /Factory/;
Expand Down
Expand Up @@ -37,10 +37,6 @@ Constructor for QgsAnnotationPolygonItem, with the specified ``polygon`` geometr

virtual QList< QgsAnnotationItemNode > nodes() const;

virtual QgsGeometry rubberBandGeometry() const;

virtual bool transform( const QTransform &transform );

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

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

QgsGeometry QgsAnnotationItem::rubberBandGeometry() const
{
return QgsGeometry();
}
19 changes: 0 additions & 19 deletions src/core/annotations/qgsannotationitem.h
Expand Up @@ -113,15 +113,6 @@ class CORE_EXPORT QgsAnnotationItem
*/
virtual QgsRectangle boundingBox( QgsRenderContext &context ) const { Q_UNUSED( context ) return boundingBox();}

/**
* Transforms the item's geometry using the specified \a transform.
*
* Returns TRUE if the transformation was successful.
*
* \since QGIS 3.22
*/
virtual bool transform( const QTransform &transform ) = 0;

/**
* Renders the item to the specified render \a context.
*
Expand Down Expand Up @@ -237,16 +228,6 @@ 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
17 changes: 17 additions & 0 deletions src/core/annotations/qgsannotationitemeditoperation.cpp
Expand Up @@ -62,3 +62,20 @@ QgsAbstractAnnotationItemEditOperation::Type QgsAnnotationItemEditOperationDelet
{
return Type::DeleteNode;
}

//
// QgsAnnotationItemEditOperationTranslateItem
//

QgsAnnotationItemEditOperationTranslateItem::QgsAnnotationItemEditOperationTranslateItem( const QString &itemId, double translateX, double translateY )
: QgsAbstractAnnotationItemEditOperation( itemId )
, mTranslateX( translateX )
, mTranslateY( translateY )
{

}

QgsAbstractAnnotationItemEditOperation::Type QgsAnnotationItemEditOperationTranslateItem::type() const
{
return Type::TranslateItem;
}
47 changes: 47 additions & 0 deletions src/core/annotations/qgsannotationitemeditoperation.h
Expand Up @@ -40,6 +40,7 @@ class CORE_EXPORT QgsAbstractAnnotationItemEditOperation
{
MoveNode, //!< Move a node
DeleteNode, //!< Delete a node
TranslateItem, //!< Translate (move) an item
};

/**
Expand Down Expand Up @@ -144,6 +145,52 @@ class CORE_EXPORT QgsAnnotationItemEditOperationDeleteNode : public QgsAbstractA

};


/**
* \ingroup core
* \brief Annotation item edit operation consisting of translating (moving) an item
* \since QGIS 3.22
*/
class CORE_EXPORT QgsAnnotationItemEditOperationTranslateItem : public QgsAbstractAnnotationItemEditOperation
{
public:

/**
* Constructor for QgsAnnotationItemEditOperationTranslateItem, where the node with the specified \a id and translation
* (in map units)
*/
QgsAnnotationItemEditOperationTranslateItem( const QString &itemId, double translateX, double translateY );

Type type() const override;

/**
* Returns the deleted node ID.
*/
QgsVertexId nodeId() const { return mNodeId; }

/**
* Returns the x-axis translation, in layer units.
*
* \since translationY()
*/
double translationX() const { return mTranslateX; }

/**
* Returns the y-axis translation, in layer units.
*
* \since translationX()
*/
double translationY() const { return mTranslateY; }

private:

QgsVertexId mNodeId;
double mTranslateX = 0;
double mTranslateY = 0;


};

/**
* \ingroup core
* \brief Encapsulates the transient results of an in-progress annotation edit operation.
Expand Down
28 changes: 17 additions & 11 deletions src/core/annotations/qgsannotationlineitem.cpp
Expand Up @@ -92,17 +92,6 @@ QList<QgsAnnotationItemNode> QgsAnnotationLineItem::nodes() const
return res;
}

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

bool QgsAnnotationLineItem::transform( const QTransform &transform )
{
mCurve->transform( transform );
return true;
}

Qgis::AnnotationItemEditOperationResult QgsAnnotationLineItem::applyEdit( QgsAbstractAnnotationItemEditOperation *operation )
{
switch ( operation->type() )
Expand All @@ -122,6 +111,14 @@ Qgis::AnnotationItemEditOperationResult QgsAnnotationLineItem::applyEdit( QgsAbs
return mCurve->isEmpty() ? Qgis::AnnotationItemEditOperationResult::ItemCleared : Qgis::AnnotationItemEditOperationResult::Success;
break;
}

case QgsAbstractAnnotationItemEditOperation::Type::TranslateItem:
{
QgsAnnotationItemEditOperationTranslateItem *moveOperation = qgis::down_cast< QgsAnnotationItemEditOperationTranslateItem * >( operation );
const QTransform transform = QTransform::fromTranslate( moveOperation->translationX(), moveOperation->translationY() );
mCurve->transform( transform );
return Qgis::AnnotationItemEditOperationResult::Success;
}
}

return Qgis::AnnotationItemEditOperationResult::Invalid;
Expand All @@ -142,6 +139,15 @@ QgsAnnotationItemEditOperationTransientResults *QgsAnnotationLineItem::transient
break;
}

case QgsAbstractAnnotationItemEditOperation::Type::TranslateItem:
{
QgsAnnotationItemEditOperationTranslateItem *moveOperation = qgis::down_cast< QgsAnnotationItemEditOperationTranslateItem * >( operation );
const QTransform transform = QTransform::fromTranslate( moveOperation->translationX(), moveOperation->translationY() );
std::unique_ptr< QgsCurve > modifiedCurve( mCurve->clone() );
modifiedCurve->transform( transform );
return new QgsAnnotationItemEditOperationTransientResults( QgsGeometry( std::move( modifiedCurve ) ) );
}

case QgsAbstractAnnotationItemEditOperation::Type::DeleteNode:
break;
}
Expand Down
2 changes: 0 additions & 2 deletions src/core/annotations/qgsannotationlineitem.h
Expand Up @@ -44,8 +44,6 @@ 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;
Qgis::AnnotationItemEditOperationResult applyEdit( QgsAbstractAnnotationItemEditOperation *operation ) override;
QgsAnnotationItemEditOperationTransientResults *transientEditResults( QgsAbstractAnnotationItemEditOperation *operation ) override SIP_FACTORY;

Expand Down
20 changes: 14 additions & 6 deletions src/core/annotations/qgsannotationmarkeritem.cpp
Expand Up @@ -95,6 +95,14 @@ Qgis::AnnotationItemEditOperationResult QgsAnnotationMarkerItem::applyEdit( QgsA
{
return Qgis::AnnotationItemEditOperationResult::ItemCleared;
}

case QgsAbstractAnnotationItemEditOperation::Type::TranslateItem:
{
QgsAnnotationItemEditOperationTranslateItem *moveOperation = qgis::down_cast< QgsAnnotationItemEditOperationTranslateItem * >( operation );
mPoint.setX( mPoint.x() + moveOperation->translationX() );
mPoint.setY( mPoint.y() + moveOperation->translationY() );
return Qgis::AnnotationItemEditOperationResult::Success;
}
}

return Qgis::AnnotationItemEditOperationResult::Invalid;
Expand All @@ -110,6 +118,12 @@ QgsAnnotationItemEditOperationTransientResults *QgsAnnotationMarkerItem::transie
return new QgsAnnotationItemEditOperationTransientResults( QgsGeometry( moveOperation->after().clone() ) );
}

case QgsAbstractAnnotationItemEditOperation::Type::TranslateItem:
{
QgsAnnotationItemEditOperationTranslateItem *moveOperation = qgis::down_cast< QgsAnnotationItemEditOperationTranslateItem * >( operation );
return new QgsAnnotationItemEditOperationTransientResults( QgsGeometry( new QgsPoint( mPoint.x() + moveOperation->translationX(), mPoint.y() + moveOperation->translationY() ) ) );
}

case QgsAbstractAnnotationItemEditOperation::Type::DeleteNode:
break;
}
Expand Down Expand Up @@ -177,12 +191,6 @@ QgsRectangle QgsAnnotationMarkerItem::boundingBox( QgsRenderContext &context ) c
return context.coordinateTransform().transformBoundingBox( boundsMapUnits, QgsCoordinateTransform::ReverseTransform );
}

bool QgsAnnotationMarkerItem::transform( const QTransform &transform )
{
mPoint.transform( transform );
return true;
}

const QgsMarkerSymbol *QgsAnnotationMarkerItem::symbol() const
{
return mSymbol.get();
Expand Down
1 change: 0 additions & 1 deletion src/core/annotations/qgsannotationmarkeritem.h
Expand Up @@ -56,7 +56,6 @@ class CORE_EXPORT QgsAnnotationMarkerItem : public QgsAnnotationItem
QgsAnnotationMarkerItem *clone() override SIP_FACTORY;
QgsRectangle boundingBox() const override;
QgsRectangle boundingBox( QgsRenderContext &context ) const override;
bool transform( const QTransform &transform ) override;

/**
* Returns the point geometry of the marker.
Expand Down

0 comments on commit a7d299d

Please sign in to comment.