Branch data Line data Source code
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 : : 22 : 0 : QgsTextAnnotation::QgsTextAnnotation( QObject *parent ) 23 : 0 : : QgsAnnotation( parent ) 24 : 0 : , mDocument( new QTextDocument( QString() ) ) 25 : 0 : { 26 : 0 : mDocument->setUseDesignMetrics( true ); 27 : 0 : } 28 : : 29 : 0 : QgsTextAnnotation *QgsTextAnnotation::clone() const 30 : : { 31 : 0 : std::unique_ptr< QgsTextAnnotation > c( new QgsTextAnnotation() ); 32 : 0 : copyCommonProperties( c.get() ); 33 : 0 : c->setDocument( mDocument.get() ); 34 : 0 : return c.release(); 35 : 0 : } 36 : : 37 : 0 : const QTextDocument *QgsTextAnnotation::document() const 38 : : { 39 : 0 : return mDocument.get(); 40 : : } 41 : : 42 : 0 : void QgsTextAnnotation::setDocument( const QTextDocument *doc ) 43 : : { 44 : 0 : if ( doc ) 45 : 0 : mDocument.reset( doc->clone() ); 46 : : else 47 : 0 : mDocument.reset(); 48 : 0 : emit appearanceChanged(); 49 : 0 : } 50 : : 51 : 0 : void QgsTextAnnotation::renderAnnotation( QgsRenderContext &context, QSizeF size ) const 52 : : { 53 : 0 : QPainter *painter = context.painter(); 54 : 0 : if ( !mDocument ) 55 : : { 56 : 0 : return; 57 : : } 58 : : 59 : : // scale painter back to 96 dpi, so layout prints match screen rendering 60 : 0 : QgsScopedQPainterState painterState( context.painter() ); 61 : 0 : const double scaleFactor = context.painter()->device()->logicalDpiX() / 96.0; 62 : 0 : context.painter()->scale( scaleFactor, scaleFactor ); 63 : 0 : size /= scaleFactor; 64 : : 65 : 0 : mDocument->setTextWidth( size.width() ); 66 : : 67 : 0 : QRectF clipRect = QRectF( 0, 0, size.width(), size.height() ); 68 : 0 : 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 : 0 : clipRect = clipRect.intersected( painter->clipRegion().boundingRect() ); 74 : 0 : } 75 : : //draw text document 76 : 0 : mDocument->drawContents( painter, clipRect ); 77 : 0 : } 78 : : 79 : 0 : void QgsTextAnnotation::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const 80 : : { 81 : 0 : QDomElement annotationElem = doc.createElement( QStringLiteral( "TextAnnotationItem" ) ); 82 : 0 : if ( mDocument ) 83 : : { 84 : 0 : annotationElem.setAttribute( QStringLiteral( "document" ), mDocument->toHtml() ); 85 : 0 : } 86 : 0 : _writeXml( annotationElem, doc, context ); 87 : 0 : elem.appendChild( annotationElem ); 88 : 0 : } 89 : : 90 : 0 : void QgsTextAnnotation::readXml( const QDomElement &itemElem, const QgsReadWriteContext &context ) 91 : : { 92 : 0 : mDocument.reset( new QTextDocument ); 93 : 0 : mDocument->setHtml( itemElem.attribute( QStringLiteral( "document" ), QString() ) ); 94 : 0 : QDomElement annotationElem = itemElem.firstChildElement( QStringLiteral( "AnnotationItem" ) ); 95 : 0 : if ( !annotationElem.isNull() ) 96 : : { 97 : 0 : _readXml( annotationElem, context ); 98 : 0 : } 99 : 0 : }