QGIS API Documentation  3.20.0-Odense (decaadbb31)
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 
16 #include "qgsannotationmanager.h"
17 #include "qgsproject.h"
18 #include "qgsannotation.h"
19 #include "qgsannotationregistry.h"
20 #include "qgsapplication.h"
21 #include "qgsstyleentityvisitor.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  {
69  removeAnnotation( a );
70  }
71 }
72 
73 QList<QgsAnnotation *> QgsAnnotationManager::annotations() const
74 {
75  return mAnnotations;
76 }
77 
78 QList<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 
88 bool 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 
131 QDomElement 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 
172 void 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:53
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:99
QgsCoordinateReferenceSystem crs
Definition: qgsproject.h:104
void setDirty(bool b=true)
Flag the project as dirty (modified).
Definition: qgsproject.cpp:518
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.