Skip to content

Commit

Permalink
Tweak api, add tests for annotation item registry
Browse files Browse the repository at this point in the history
  • Loading branch information
nyalldawson committed Aug 5, 2020
1 parent 649cd47 commit e6c8113
Show file tree
Hide file tree
Showing 9 changed files with 270 additions and 109 deletions.
23 changes: 20 additions & 3 deletions python/core/auto_generated/annotations/qgsannotationitem.sip.in
Expand Up @@ -45,6 +45,15 @@ Returns a unique (untranslated) string identifying the type of item.
QgsCoordinateReferenceSystem crs() const;
%Docstring
Returns the CRS used for storing the location of the item.

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

void setCrs( const QgsCoordinateReferenceSystem &crs );
%Docstring
Sets the ``crs`` used for storing the location of the item.

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

virtual void render( QgsRenderContext &context, QgsFeedback *feedback ) = 0;
Expand All @@ -58,6 +67,11 @@ render operations.
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const = 0;
%Docstring
Writes the item's state the an XML ``element``.
%End

virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) = 0;
%Docstring
Reads the item's state from the given DOM ``element``.
%End

int zIndex() const;
Expand Down Expand Up @@ -88,7 +102,8 @@ class QgsMarkerItem : QgsAnnotationItem
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;

static QgsMarkerItem *create() /Factory/;
static QgsMarkerItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context );


virtual QgsMarkerItem *clone() /Factory/;

Expand Down Expand Up @@ -119,7 +134,8 @@ class QgsLineStringItem : QgsAnnotationItem
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;

static QgsLineStringItem *create() /Factory/;
static QgsLineStringItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context );


virtual QgsLineStringItem *clone() /Factory/;

Expand Down Expand Up @@ -150,7 +166,8 @@ class QgsPolygonItem : QgsAnnotationItem
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const;

static QgsPolygonItem *create() /Factory/;
static QgsPolygonItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) /Factory/;
virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context );


virtual QgsPolygonItem *clone() /Factory/;

Expand Down
Expand Up @@ -53,12 +53,6 @@ Returns a translated, user visible name for the annotation item class.
QString visiblePluralName() const;
%Docstring
Returns a translated, user visible name for plurals of the annotation item class (e.g. "Labels" for a "Label" item).
%End

virtual QgsAnnotationItem *createItem( const QDomElement &element, const QgsReadWriteContext &context ) = 0 /Factory/;
%Docstring
Creates an annotation item of this class using the state present in the specified
DOM ``element``.
%End

virtual QgsAnnotationItem *createItem() = 0 /Factory/;
Expand All @@ -71,7 +65,6 @@ Creates a new, default, annotation item of this class.




class QgsAnnotationItemRegistry : QObject
{
%Docstring
Expand Down
42 changes: 24 additions & 18 deletions src/core/annotations/qgsannotationitem.cpp
Expand Up @@ -25,6 +25,15 @@ QgsAnnotationItem::QgsAnnotationItem( const QgsCoordinateReferenceSystem &crs )

}

void QgsAnnotationItem::setCrs( const QgsCoordinateReferenceSystem &crs )
{
mCrs = crs;
}

//
// QgsMarkerItem
//

QgsMarkerItem::QgsMarkerItem( QgsPointXY point, const QgsCoordinateReferenceSystem &crs )
: QgsAnnotationItem( crs )
, mPoint( point )
Expand Down Expand Up @@ -77,21 +86,21 @@ QgsMarkerItem *QgsMarkerItem::create()
return new QgsMarkerItem( QgsPointXY(), QgsCoordinateReferenceSystem() );
}

QgsMarkerItem *QgsMarkerItem::createFromElement( const QDomElement &element, const QgsReadWriteContext &context )
bool QgsMarkerItem::readXml( const QDomElement &element, const QgsReadWriteContext &context )
{
const double x = element.attribute( QStringLiteral( "x" ) ).toDouble();
const double y = element.attribute( QStringLiteral( "y" ) ).toDouble();
mPoint = QgsPointXY( x, y );

QgsCoordinateReferenceSystem crs;
crs.readXml( element );

std::unique_ptr< QgsMarkerItem > item = qgis::make_unique< QgsMarkerItem >( QgsPointXY( x, y ), crs );
setCrs( crs );

const QDomElement symbolElem = element.firstChildElement( QStringLiteral( "symbol" ) );
if ( !symbolElem.isNull() )
item->setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );
setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsMarkerSymbol >( symbolElem, context ) );

return item.release();
return true;
}

QgsMarkerItem *QgsMarkerItem::clone()
Expand Down Expand Up @@ -179,22 +188,21 @@ QgsLineStringItem *QgsLineStringItem::create()
return new QgsLineStringItem( QgsLineString(), QgsCoordinateReferenceSystem() );
}

QgsLineStringItem *QgsLineStringItem::createFromElement( const QDomElement &element, const QgsReadWriteContext &context )
bool QgsLineStringItem::readXml( const QDomElement &element, const QgsReadWriteContext &context )
{
const QString wkt = element.attribute( QStringLiteral( "wkt" ) );
QgsLineString ls;
ls.fromWkt( wkt );
mLineString.fromWkt( wkt );

QgsCoordinateReferenceSystem crs;
crs.readXml( element );

std::unique_ptr< QgsLineStringItem > item = qgis::make_unique< QgsLineStringItem >( ls, crs );
setCrs( crs );

const QDomElement symbolElem = element.firstChildElement( QStringLiteral( "symbol" ) );
if ( !symbolElem.isNull() )
item->setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsLineSymbol >( symbolElem, context ) );
setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsLineSymbol >( symbolElem, context ) );

return item.release();
return true;
}

QgsLineStringItem *QgsLineStringItem::clone()
Expand Down Expand Up @@ -294,22 +302,20 @@ QgsPolygonItem *QgsPolygonItem::create()
return new QgsPolygonItem( QgsPolygon(), QgsCoordinateReferenceSystem() );
}

QgsPolygonItem *QgsPolygonItem::createFromElement( const QDomElement &element, const QgsReadWriteContext &context )
bool QgsPolygonItem::readXml( const QDomElement &element, const QgsReadWriteContext &context )
{
const QString wkt = element.attribute( QStringLiteral( "wkt" ) );
QgsPolygon poly;
poly.fromWkt( wkt );
mPolygon.fromWkt( wkt );

QgsCoordinateReferenceSystem crs;
crs.readXml( element );

std::unique_ptr< QgsPolygonItem > item = qgis::make_unique< QgsPolygonItem >( poly, crs );
setCrs( crs );

const QDomElement symbolElem = element.firstChildElement( QStringLiteral( "symbol" ) );
if ( !symbolElem.isNull() )
item->setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsFillSymbol >( symbolElem, context ) );
setSymbol( QgsSymbolLayerUtils::loadSymbol< QgsFillSymbol >( symbolElem, context ) );

return item.release();
return true;
}

QgsPolygonItem *QgsPolygonItem::clone()
Expand Down
20 changes: 17 additions & 3 deletions src/core/annotations/qgsannotationitem.h
Expand Up @@ -66,9 +66,18 @@ class CORE_EXPORT QgsAnnotationItem

/**
* Returns the CRS used for storing the location of the item.
*
* \see setCrs()
*/
QgsCoordinateReferenceSystem crs() const { return mCrs; }

/**
* Sets the \a crs used for storing the location of the item.
*
* \see crs()
*/
void setCrs( const QgsCoordinateReferenceSystem &crs );

/**
* Renders the item to the specified render \a context.
*
Expand All @@ -82,6 +91,11 @@ class CORE_EXPORT QgsAnnotationItem
*/
virtual bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const = 0;

/**
* Reads the item's state from the given DOM \a element.
*/
virtual bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) = 0;

/**
* Returns the item's z index, which controls the order in which annotation items
* are rendered in the layer.
Expand Down Expand Up @@ -109,7 +123,7 @@ class CORE_EXPORT QgsMarkerItem : public QgsAnnotationItem
void render( QgsRenderContext &context, QgsFeedback *feedback ) override;
bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
static QgsMarkerItem *create() SIP_FACTORY;
static QgsMarkerItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) override;

QgsMarkerItem *clone() override SIP_FACTORY;

Expand Down Expand Up @@ -139,7 +153,7 @@ class CORE_EXPORT QgsLineStringItem : public QgsAnnotationItem
void render( QgsRenderContext &context, QgsFeedback *feedback ) override;
bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
static QgsLineStringItem *create() SIP_FACTORY;
static QgsLineStringItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) override;

QgsLineStringItem *clone() override SIP_FACTORY;

Expand Down Expand Up @@ -169,7 +183,7 @@ class CORE_EXPORT QgsPolygonItem : public QgsAnnotationItem
void render( QgsRenderContext &context, QgsFeedback *feedback ) override;
bool writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const override;
static QgsPolygonItem *create() SIP_FACTORY;
static QgsPolygonItem *createFromElement( const QDomElement &element, const QgsReadWriteContext &context ) SIP_FACTORY;
bool readXml( const QDomElement &element, const QgsReadWriteContext &context ) override;

QgsPolygonItem *clone() override SIP_FACTORY;

Expand Down
11 changes: 7 additions & 4 deletions src/core/annotations/qgsannotationitemregistry.cpp
Expand Up @@ -34,11 +34,11 @@ bool QgsAnnotationItemRegistry::populate()
return false;

mMetadata.insert( QStringLiteral( "marker" ), new QgsAnnotationItemMetadata( QStringLiteral( "marker" ), QObject::tr( "Marker" ), QObject::tr( "Markers" ),
QgsMarkerItem::create, QgsMarkerItem::createFromElement ) );
QgsMarkerItem::create ) );
mMetadata.insert( QStringLiteral( "linestring" ), new QgsAnnotationItemMetadata( QStringLiteral( "linestring" ), QObject::tr( "Polyline" ), QObject::tr( "Polylines" ),
QgsLineStringItem::create, QgsLineStringItem::createFromElement ) );
QgsLineStringItem::create ) );
mMetadata.insert( QStringLiteral( "polygon" ), new QgsAnnotationItemMetadata( QStringLiteral( "polygon" ), QObject::tr( "Polygon" ), QObject::tr( "Polygons" ),
QgsPolygonItem::create, QgsPolygonItem::createFromElement ) );
QgsPolygonItem::create ) );
return true;
}

Expand Down Expand Up @@ -71,7 +71,10 @@ QgsAnnotationItem *QgsAnnotationItemRegistry::createItem( const QDomElement &ele
if ( !mMetadata.contains( type ) )
return nullptr;

return mMetadata[type]->createItem( element, context );
std::unique_ptr< QgsAnnotationItem > newItem( mMetadata[type]->createItem() );
if ( newItem )
newItem->readXml( element, context );
return newItem.release();
}

QMap<QString, QString> QgsAnnotationItemRegistry::itemTypes() const
Expand Down
24 changes: 3 additions & 21 deletions src/core/annotations/qgsannotationitemregistry.h
Expand Up @@ -72,12 +72,6 @@ class CORE_EXPORT QgsAnnotationItemAbstractMetadata
*/
QString visiblePluralName() const { return mVisibleNamePlural; }

/**
* Creates an annotation item of this class using the state present in the specified
* DOM \a element.
*/
virtual QgsAnnotationItem *createItem( const QDomElement &element, const QgsReadWriteContext &context ) = 0 SIP_FACTORY;

/**
* Creates a new, default, annotation item of this class.
*/
Expand All @@ -90,11 +84,8 @@ class CORE_EXPORT QgsAnnotationItemAbstractMetadata
QString mVisibleNamePlural;
};

//! Annotation item creation function from DOM state
typedef std::function<QgsAnnotationItem *( const QDomElement &, const QgsReadWriteContext & )> QgsAnnotationItemCreateFunc SIP_SKIP;

//! Annotation item creation function
typedef std::function<QgsAnnotationItem *()> QgsAnnotationItemDefaultCreateFunc SIP_SKIP;
typedef std::function<QgsAnnotationItem *()> QgsAnnotationItemCreateFunc SIP_SKIP;

#ifndef SIP_RUN

Expand All @@ -115,29 +106,20 @@ class CORE_EXPORT QgsAnnotationItemMetadata : public QgsAnnotationItemAbstractMe
* The \a visiblePluralName argument is used to specify a plural variant of the item type.
*/
QgsAnnotationItemMetadata( const QString &type, const QString &visibleName, const QString &visiblePluralName,
const QgsAnnotationItemDefaultCreateFunc &pfDefaultCreate,
const QgsAnnotationItemCreateFunc &pfCreate )
: QgsAnnotationItemAbstractMetadata( type, visibleName, visiblePluralName )
, mCreateFunc( pfCreate )
, mCreateDefaultFunc( pfDefaultCreate )
{}

/**
* Returns the classes' item creation from DOM state function.
*/
QgsAnnotationItemCreateFunc createFunction() const { return mCreateFunc; }

/**
* Returns the classes' item default creation function.
*/
QgsAnnotationItemDefaultCreateFunc createDefaultFunction() const { return mCreateDefaultFunc; }
QgsAnnotationItemCreateFunc createFunction() const { return mCreateFunc; }

QgsAnnotationItem *createItem( const QDomElement &element, const QgsReadWriteContext &context ) override { return mCreateFunc ? mCreateFunc( element, context ) : nullptr; }
QgsAnnotationItem *createItem() override { return mCreateDefaultFunc ? mCreateDefaultFunc() : nullptr; }
QgsAnnotationItem *createItem() override { return mCreateFunc ? mCreateFunc() : nullptr; }

protected:
QgsAnnotationItemCreateFunc mCreateFunc = nullptr;
QgsAnnotationItemDefaultCreateFunc mCreateDefaultFunc = nullptr;

};

Expand Down
1 change: 1 addition & 0 deletions tests/src/core/CMakeLists.txt
Expand Up @@ -88,6 +88,7 @@ ENDMACRO (ADD_QGIS_TEST)
SET(TESTS
testqgs25drenderer.cpp
testqgsannotationitem.cpp
testqgsannotationitemregistry.cpp
testqgsapplication.cpp
testqgsauthcrypto.cpp
testqgsauthcertutils.cpp
Expand Down

0 comments on commit e6c8113

Please sign in to comment.