QGIS API Documentation  3.16.0-Hannover (43b64b13f3)
qgstextannotation.cpp
Go to the documentation of this file.
1 /***************************************************************************
2  qgstextannotation.cpp
3  ------------------------
4 begin : February 9, 2010
5 copyright : (C) 2010 by Marco Hugentobler
6 email : marco dot hugentobler at hugis dot net
7 ***************************************************************************/
8 
9 /***************************************************************************
10  * *
11  * This program is free software; you can redistribute it and/or modify *
12  * it under the terms of the GNU General Public License as published by *
13  * the Free Software Foundation; either version 2 of the License, or *
14  * (at your option) any later version. *
15  * *
16  ***************************************************************************/
17 
18 #include "qgstextannotation.h"
19 #include <QDomDocument>
20 #include <QPainter>
21 
23  : QgsAnnotation( parent )
24  , mDocument( new QTextDocument( QString() ) )
25 {
26  mDocument->setUseDesignMetrics( true );
27 }
28 
30 {
31  std::unique_ptr< QgsTextAnnotation > c( new QgsTextAnnotation() );
32  copyCommonProperties( c.get() );
33  c->setDocument( mDocument.get() );
34  return c.release();
35 }
36 
37 const QTextDocument *QgsTextAnnotation::document() const
38 {
39  return mDocument.get();
40 }
41 
42 void QgsTextAnnotation::setDocument( const QTextDocument *doc )
43 {
44  if ( doc )
45  mDocument.reset( doc->clone() );
46  else
47  mDocument.reset();
48  emit appearanceChanged();
49 }
50 
51 void QgsTextAnnotation::renderAnnotation( QgsRenderContext &context, QSizeF size ) const
52 {
53  QPainter *painter = context.painter();
54  if ( !mDocument )
55  {
56  return;
57  }
58 
59  // scale painter back to 96 dpi, so layout prints match screen rendering
60  QgsScopedQPainterState painterState( context.painter() );
61  const double scaleFactor = context.painter()->device()->logicalDpiX() / 96.0;
62  context.painter()->scale( scaleFactor, scaleFactor );
63  size /= scaleFactor;
64 
65  mDocument->setTextWidth( size.width() );
66 
67  QRectF clipRect = QRectF( 0, 0, size.width(), size.height() );
68  if ( painter->hasClipping() )
69  {
70  //QTextDocument::drawContents will draw text outside of the painter's clip region
71  //when it is passed a clip rectangle. So, we need to intersect it with the
72  //painter's clip region to prevent text drawn outside clipped region (e.g., outside layout maps, see #10400)
73  clipRect = clipRect.intersected( painter->clipRegion().boundingRect() );
74  }
75  //draw text document
76  mDocument->drawContents( painter, clipRect );
77 }
78 
79 void QgsTextAnnotation::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
80 {
81  QDomElement annotationElem = doc.createElement( QStringLiteral( "TextAnnotationItem" ) );
82  if ( mDocument )
83  {
84  annotationElem.setAttribute( QStringLiteral( "document" ), mDocument->toHtml() );
85  }
86  _writeXml( annotationElem, doc, context );
87  elem.appendChild( annotationElem );
88 }
89 
90 void QgsTextAnnotation::readXml( const QDomElement &itemElem, const QgsReadWriteContext &context )
91 {
92  mDocument.reset( new QTextDocument );
93  mDocument->setHtml( itemElem.attribute( QStringLiteral( "document" ), QString() ) );
94  QDomElement annotationElem = itemElem.firstChildElement( QStringLiteral( "AnnotationItem" ) );
95  if ( !annotationElem.isNull() )
96  {
97  _readXml( annotationElem, context );
98  }
99 }
QgsAnnotation::_readXml
void _readXml(const QDomElement &annotationElem, const QgsReadWriteContext &context)
Reads common annotation properties from a DOM element.
Definition: qgsannotation.cpp:444
QgsReadWriteContext
The class is used as a container of context for various read/write operations on other objects.
Definition: qgsreadwritecontext.h:35
QgsRenderContext
Contains information about the context of a rendering operation.
Definition: qgsrendercontext.h:58
QgsTextAnnotation::QgsTextAnnotation
QgsTextAnnotation(QObject *parent=nullptr)
Constructor for QgsTextAnnotation.
Definition: qgstextannotation.cpp:22
QgsTextAnnotation::renderAnnotation
void renderAnnotation(QgsRenderContext &context, QSizeF size) const override
Renders the annotation's contents to a target /a context at the specified /a size.
Definition: qgstextannotation.cpp:51
QgsTextAnnotation::setDocument
void setDocument(const QTextDocument *doc)
Sets the text document which will be rendered within the annotation.
Definition: qgstextannotation.cpp:42
QgsTextAnnotation::clone
QgsTextAnnotation * clone() const override
Clones the annotation, returning a new copy of the annotation reflecting the annotation's current sta...
Definition: qgstextannotation.cpp:29
QgsTextAnnotation::readXml
void readXml(const QDomElement &itemElem, const QgsReadWriteContext &context) override
Restores the annotation's state from a DOM element.
Definition: qgstextannotation.cpp:90
QgsAnnotation
Abstract base class for annotation items which are drawn over a map.
Definition: qgsannotation.h:50
QgsAnnotation::_writeXml
void _writeXml(QDomElement &itemElem, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes common annotation properties to a DOM element.
Definition: qgsannotation.cpp:399
QgsScopedQPainterState
Scoped object for saving and restoring a QPainter object's state.
Definition: qgsrendercontext.h:1120
QgsTextAnnotation::writeXml
void writeXml(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes the annotation state to a DOM element.
Definition: qgstextannotation.cpp:79
QgsTextAnnotation::document
const QTextDocument * document() const
Returns the text document which will be rendered within the annotation.
Definition: qgstextannotation.cpp:37
c
As part of the API refactoring and improvements which landed in the Processing API was substantially reworked from the x version This was done in order to allow much of the underlying Processing framework to be ported into c
Definition: porting_processing.dox:1
qgstextannotation.h
QgsTextAnnotation
An annotation item that displays formatted text from a QTextDocument document.
Definition: qgstextannotation.h:32
QgsAnnotation::appearanceChanged
void appearanceChanged()
Emitted whenever the annotation's appearance changes.
QgsRenderContext::painter
QPainter * painter()
Returns the destination QPainter for the render operation.
Definition: qgsrendercontext.h:179
QgsAnnotation::copyCommonProperties
void copyCommonProperties(QgsAnnotation *target) const
Copies common annotation properties to the targe annotation.
Definition: qgsannotation.cpp:546