QGIS API Documentation 4.3.0-Master (35968c35f7e)
Loading...
Searching...
No Matches
qgstextannotation.cpp
Go to the documentation of this file.
1/***************************************************************************
2 qgstextannotation.cpp
3 ------------------------
4begin : February 9, 2010
5copyright : (C) 2010 by Marco Hugentobler
6email : 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
20#include <memory>
21
22#include "qgspainting.h"
23#include "qgsrendercontext.h"
24
25#include <QDomDocument>
26#include <QPainter>
27#include <QString>
28
29#include "moc_qgstextannotation.cpp"
30
31using namespace Qt::StringLiterals;
32
34 : QgsAnnotation( parent )
35 , mDocument( new QTextDocument( QString() ) )
36{
37 mDocument->setUseDesignMetrics( true );
38}
39
41{
42 auto c = std::make_unique<QgsTextAnnotation>();
43 copyCommonProperties( c.get() );
44 c->setDocument( mDocument.get() );
45 return c.release();
46}
47
48const QTextDocument *QgsTextAnnotation::document() const
49{
50 return mDocument.get();
51}
52
53void QgsTextAnnotation::setDocument( const QTextDocument *doc )
54{
55 if ( doc )
56 mDocument.reset( doc->clone() );
57 else
58 mDocument.reset();
59 emit appearanceChanged();
60}
61
62void QgsTextAnnotation::renderAnnotation( QgsRenderContext &context, QSizeF size ) const
63{
64 QPainter *painter = context.painter();
65 if ( !mDocument || !painter || ( context.feedback() && context.feedback()->isCanceled() ) )
66 {
67 return;
68 }
69
70 // scale painter back to 96 dpi, so layout prints match screen rendering
71 const QgsScopedQPainterState painterState( context.painter() );
72 const double scaleFactor = context.painter()->device()->logicalDpiX() / 96.0;
73 context.painter()->scale( scaleFactor, scaleFactor );
74 size /= scaleFactor;
75
76 mDocument->setTextWidth( size.width() );
77
78 QRectF clipRect = QRectF( 0, 0, size.width(), size.height() );
79 if ( painter->hasClipping() )
80 {
81 //QTextDocument::drawContents will draw text outside of the painter's clip region
82 //when it is passed a clip rectangle. So, we need to intersect it with the
83 //painter's clip region to prevent text drawn outside clipped region (e.g., outside layout maps, see #10400)
84 clipRect = clipRect.intersected( painter->clipRegion().boundingRect() );
85 }
86 //draw text document
87 mDocument->drawContents( painter, clipRect );
88}
89
90void QgsTextAnnotation::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const
91{
92 QDomElement annotationElem = doc.createElement( u"TextAnnotationItem"_s );
93 if ( mDocument )
94 {
95 annotationElem.setAttribute( u"document"_s, mDocument->toHtml() );
96 }
97 _writeXml( annotationElem, doc, context );
98 elem.appendChild( annotationElem );
99}
100
101void QgsTextAnnotation::readXml( const QDomElement &itemElem, const QgsReadWriteContext &context )
102{
103 mDocument = std::make_unique<QTextDocument>();
104 mDocument->setHtml( itemElem.attribute( u"document"_s, QString() ) );
105 const QDomElement annotationElem = itemElem.firstChildElement( u"AnnotationItem"_s );
106 if ( !annotationElem.isNull() )
107 {
108 _readXml( annotationElem, context );
109 }
110}
void appearanceChanged()
Emitted whenever the annotation's appearance changes.
void _writeXml(QDomElement &itemElem, QDomDocument &doc, const QgsReadWriteContext &context) const
Writes common annotation properties to a DOM element.
void _readXml(const QDomElement &annotationElem, const QgsReadWriteContext &context)
Reads common annotation properties from a DOM element.
void copyCommonProperties(QgsAnnotation *target) const
Copies common annotation properties to the targe annotation.
QgsAnnotation(QObject *parent=nullptr)
Constructor for QgsAnnotation.
bool isCanceled() const
Tells whether the operation has been canceled already.
Definition qgsfeedback.h:56
A container for the context for various read/write operations on objects.
Contains information about the context of a rendering operation.
QPainter * painter()
Returns the destination QPainter for the render operation.
QgsFeedback * feedback() const
Returns the feedback object that can be queried regularly during rendering to check if rendering shou...
Scoped object for saving and restoring a QPainter object's state.
QgsTextAnnotation * clone() const override
Clones the annotation, returning a new copy of the annotation reflecting the annotation's current sta...
void writeXml(QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context) const override
Writes the annotation state to a DOM element.
void readXml(const QDomElement &itemElem, const QgsReadWriteContext &context) override
Restores the annotation's state from a DOM element.
const QTextDocument * document() const
Returns the text document which will be rendered within the annotation.
void renderAnnotation(QgsRenderContext &context, QSizeF size) const override
Renders the annotation's contents to a target /a context at the specified /a size.
void setDocument(const QTextDocument *doc)
Sets the text document which will be rendered within the annotation.
QgsTextAnnotation(QObject *parent=nullptr)
Constructor for QgsTextAnnotation.
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