QGIS API Documentation 3.27.0-Master (f261cc1f8b)
qgsannotationmanager.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgsannotationmanager.cpp
3 ------------------------
4 Date : January 2017
5 Copyright : (C) 2017 Nyall Dawson
6 Email : nyall dot dawson at gmail dot com
7 ***************************************************************************
8 * *
9 * This program is free software; you can redistribute it and/or modify *
10 * it under the terms of the GNU General Public License as published by *
11 * the Free Software Foundation; either version 2 of the License, or *
12 * (at your option) any later version. *
13 * *
14 ***************************************************************************/
15
17#include "qgsproject.h"
18#include "qgsannotation.h"
20#include "qgsapplication.h"
22
24 : QObject( project )
25 , mProject( project )
26{
27
28}
29
31{
32 clear();
33}
34
36{
37 if ( !annotation )
38 return false;
39
40 if ( mAnnotations.contains( annotation ) )
41 return true;
42
43 mAnnotations << annotation;
44 emit annotationAdded( annotation );
45 mProject->setDirty( true );
46 return true;
47}
48
50{
51 if ( !annotation )
52 return false;
53
54 if ( !mAnnotations.contains( annotation ) )
55 return false;
56
57 emit annotationAboutToBeRemoved( annotation );
58 mAnnotations.removeAll( annotation );
59 delete annotation;
60 emit annotationRemoved();
61 mProject->setDirty( true );
62 return true;
63}
64
66{
67 for ( auto *a : std::as_const( mAnnotations ) )
68 {
70 }
71}
72
73QList<QgsAnnotation *> QgsAnnotationManager::annotations() const
74{
75 return mAnnotations;
76}
77
78QList<QgsAnnotation *> QgsAnnotationManager::cloneAnnotations() const
79{
80 QList<QgsAnnotation *> results;
81 for ( const auto *a : std::as_const( mAnnotations ) )
82 {
83 results << a->clone();
84 }
85 return results;
86}
87
88bool QgsAnnotationManager::readXml( const QDomElement &element, const QgsReadWriteContext &context )
89{
90 clear();
91 //restore each annotation
92 bool result = true;
93
94 QDomElement annotationsElem = element.firstChildElement( QStringLiteral( "Annotations" ) );
95
96 QDomElement annotationElement = annotationsElem.firstChildElement( QStringLiteral( "Annotation" ) );
97 while ( ! annotationElement .isNull() )
98 {
99 createAnnotationFromXml( annotationElement, context );
100 annotationElement = annotationElement.nextSiblingElement( QStringLiteral( "Annotation" ) );
101 }
102
103 // restore old (pre 3.0) project annotations
104 if ( annotationElement.isNull() )
105 {
106 QDomNodeList oldItemList = element.elementsByTagName( QStringLiteral( "TextAnnotationItem" ) );
107 for ( int i = 0; i < oldItemList.size(); ++i )
108 {
109 createAnnotationFromXml( oldItemList.at( i ).toElement(), context );
110 }
111 oldItemList = element.elementsByTagName( QStringLiteral( "FormAnnotationItem" ) );
112 for ( int i = 0; i < oldItemList.size(); ++i )
113 {
114 createAnnotationFromXml( oldItemList.at( i ).toElement(), context );
115 }
116 oldItemList = element.elementsByTagName( QStringLiteral( "HtmlAnnotationItem" ) );
117 for ( int i = 0; i < oldItemList.size(); ++i )
118 {
119 createAnnotationFromXml( oldItemList.at( i ).toElement(), context );
120 }
121 oldItemList = element.elementsByTagName( QStringLiteral( "SVGAnnotationItem" ) );
122 for ( int i = 0; i < oldItemList.size(); ++i )
123 {
124 createAnnotationFromXml( oldItemList.at( i ).toElement(), context );
125 }
126 }
127
128 return result;
129}
130
131QDomElement QgsAnnotationManager::writeXml( QDomDocument &doc, const QgsReadWriteContext &context ) const
132{
133 QDomElement annotationsElem = doc.createElement( QStringLiteral( "Annotations" ) );
134 QListIterator<QgsAnnotation *> i( mAnnotations );
135 // save lowermost annotation (at end of list) first
136 i.toBack();
137 while ( i.hasPrevious() )
138 {
139 QgsAnnotation *annotation = i.previous();
140
141 if ( !annotation )
142 {
143 continue;
144 }
145
146 annotation->writeXml( annotationsElem, doc, context );
147 }
148 return annotationsElem;
149}
150
152{
153 if ( mAnnotations.empty() )
154 return true;
155
156 // NOTE: if visitEnter returns false it means "don't visit any annotations", not "abort all further visitations"
157 if ( !visitor->visitEnter( QgsStyleEntityVisitorInterface::Node( QgsStyleEntityVisitorInterface::NodeType::Annotations, QStringLiteral( "annotations" ), tr( "Annotations" ) ) ) )
158 return true;
159
160 for ( QgsAnnotation *a : mAnnotations )
161 {
162 if ( !a->accept( visitor ) )
163 return false;
164 }
165
166 if ( !visitor->visitExit( QgsStyleEntityVisitorInterface::Node( QgsStyleEntityVisitorInterface::NodeType::Annotations, QStringLiteral( "annotations" ), tr( "Annotations" ) ) ) )
167 return false;
168
169 return true;
170}
171
172void QgsAnnotationManager::createAnnotationFromXml( const QDomElement &element, const QgsReadWriteContext &context )
173{
174 QString type = element.tagName();
175 QgsAnnotation *annotation = QgsApplication::annotationRegistry()->create( type );
176 if ( !annotation )
177 return;
178
179 annotation->readXml( element, context );
180
181 if ( !annotation->mapPositionCrs().isValid() )
182 {
183 annotation->setMapPositionCrs( mProject->crs() );
184 }
185
186 addAnnotation( annotation );
187}
QList< QgsAnnotation * > annotations() const
Returns a list of all annotations contained in the manager.
QList< QgsAnnotation * > cloneAnnotations() const
Returns a list containing clones of all annotations contained in the manager.
QDomElement writeXml(QDomDocument &doc, const QgsReadWriteContext &context) const
Returns a DOM element representing the state of the manager.
void annotationRemoved()
Emitted when an annotation was removed from the manager.
QgsAnnotationManager(QgsProject *project=nullptr)
Constructor for QgsAnnotationManager.
void annotationAboutToBeRemoved(QgsAnnotation *annotation)
Emitted when an annotation is about to be removed from the manager.
bool readXml(const QDomElement &element, const QgsReadWriteContext &context)
Reads the manager's state from a DOM element, restoring all annotations present in the XML document.
bool removeAnnotation(QgsAnnotation *annotation)
Removes an annotation from the manager.
bool accept(QgsStyleEntityVisitorInterface *visitor) const
Accepts the specified style entity visitor, causing it to visit all style entities associated within ...
void clear()
Removes and deletes all annotations from the manager.
bool addAnnotation(QgsAnnotation *annotation)
Adds an annotation to the manager.
void annotationAdded(QgsAnnotation *annotation)
Emitted when a annotation has been added to the manager.
Abstract base class for annotation items which are drawn over a map.
Definition: qgsannotation.h:54
QgsCoordinateReferenceSystem mapPositionCrs() const
Returns the CRS of the map position, or an invalid CRS if the annotation does not have a fixed map po...
void setMapPositionCrs(const QgsCoordinateReferenceSystem &crs)
Sets the CRS of the map position.
virtual void readXml(const QDomElement &itemElem, const QgsReadWriteContext &context)=0
Restores the annotation's state from a DOM element.
virtual void writeXml(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const =0
Writes the annotation state to a DOM element.
static QgsAnnotationRegistry * annotationRegistry()
Returns the application's annotation registry, used for managing annotation types.
bool isValid() const
Returns whether this CRS is correctly initialized and usable.
Encapsulates a QGIS project, including sets of map layers and their styles, layouts,...
Definition: qgsproject.h:104
QgsCoordinateReferenceSystem crs
Definition: qgsproject.h:109
void setDirty(bool b=true)
Flag the project as dirty (modified).
Definition: qgsproject.cpp:576
The class is used as a container of context for various read/write operations on other objects.
An interface for classes which can visit style entity (e.g.
@ Annotations
Annotations collection.
virtual bool visitExit(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor stops visiting a node.
virtual bool visitEnter(const QgsStyleEntityVisitorInterface::Node &node)
Called when the visitor starts visiting a node.
Contains information relating to a node (i.e.