Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgsannotationpointtextitem.cpp 3 : : ---------------- 4 : : begin : August 2020 5 : : copyright : (C) 2020 by Nyall Dawson 6 : : email : nyall dot dawson at gmail dot com 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 "qgsannotationpointtextitem.h" 19 : : #include "qgstextrenderer.h" 20 : : 21 : 0 : QgsAnnotationPointTextItem::QgsAnnotationPointTextItem( const QString &text, QgsPointXY point ) 22 : 0 : : QgsAnnotationItem() 23 : 0 : , mText( text ) 24 : 0 : , mPoint( point ) 25 : 0 : { 26 : : 27 : 0 : } 28 : : 29 : 0 : QgsAnnotationPointTextItem::~QgsAnnotationPointTextItem() = default; 30 : : 31 : 0 : QString QgsAnnotationPointTextItem::type() const 32 : : { 33 : 0 : return QStringLiteral( "pointtext" ); 34 : : } 35 : : 36 : 0 : void QgsAnnotationPointTextItem::render( QgsRenderContext &context, QgsFeedback * ) 37 : : { 38 : 0 : QPointF pt; 39 : 0 : if ( context.coordinateTransform().isValid() ) 40 : : { 41 : 0 : double x = mPoint.x(); 42 : 0 : double y = mPoint.y(); 43 : 0 : double z = 0.0; 44 : 0 : context.coordinateTransform().transformInPlace( x, y, z ); 45 : 0 : pt = QPointF( x, y ); 46 : 0 : } 47 : : else 48 : 0 : pt = mPoint.toQPointF(); 49 : : 50 : 0 : context.mapToPixel().transformInPlace( pt.rx(), pt.ry() ); 51 : : 52 : 0 : QgsTextRenderer::drawText( pt, mAngle * M_PI / 180.0, 53 : 0 : QgsTextRenderer::convertQtHAlignment( mAlignment ), 54 : 0 : mText.split( '\n' ), context, mTextFormat ); 55 : 0 : } 56 : : 57 : 0 : bool QgsAnnotationPointTextItem::writeXml( QDomElement &element, QDomDocument &document, const QgsReadWriteContext &context ) const 58 : : { 59 : 0 : element.setAttribute( QStringLiteral( "x" ), qgsDoubleToString( mPoint.x() ) ); 60 : 0 : element.setAttribute( QStringLiteral( "y" ), qgsDoubleToString( mPoint.y() ) ); 61 : 0 : element.setAttribute( QStringLiteral( "text" ), mText ); 62 : 0 : element.setAttribute( QStringLiteral( "zIndex" ), zIndex() ); 63 : 0 : element.setAttribute( QStringLiteral( "angle" ), qgsDoubleToString( mAngle ) ); 64 : 0 : element.setAttribute( QStringLiteral( "alignment" ), QString::number( mAlignment ) ); 65 : : 66 : 0 : QDomElement textFormatElem = document.createElement( QStringLiteral( "pointTextFormat" ) ); 67 : 0 : textFormatElem.appendChild( mTextFormat.writeXml( document, context ) ); 68 : 0 : element.appendChild( textFormatElem ); 69 : : 70 : : return true; 71 : 0 : } 72 : : 73 : 0 : QgsAnnotationPointTextItem *QgsAnnotationPointTextItem::create() 74 : : { 75 : 0 : return new QgsAnnotationPointTextItem( QString(), QgsPointXY() ); 76 : 0 : } 77 : : 78 : 0 : bool QgsAnnotationPointTextItem::readXml( const QDomElement &element, const QgsReadWriteContext &context ) 79 : : { 80 : 0 : const double x = element.attribute( QStringLiteral( "x" ) ).toDouble(); 81 : 0 : const double y = element.attribute( QStringLiteral( "y" ) ).toDouble(); 82 : 0 : mPoint = QgsPointXY( x, y ); 83 : 0 : mText = element.attribute( QStringLiteral( "text" ) ); 84 : 0 : mAngle = element.attribute( QStringLiteral( "angle" ) ).toDouble(); 85 : 0 : mAlignment = static_cast< Qt::Alignment >( element.attribute( QStringLiteral( "alignment" ) ).toInt() ); 86 : 0 : setZIndex( element.attribute( QStringLiteral( "zIndex" ) ).toInt() ); 87 : : 88 : 0 : const QDomElement textFormatElem = element.firstChildElement( QStringLiteral( "pointTextFormat" ) ); 89 : 0 : if ( !textFormatElem.isNull() ) 90 : : { 91 : 0 : QDomNodeList textFormatNodeList = textFormatElem.elementsByTagName( QStringLiteral( "text-style" ) ); 92 : 0 : QDomElement textFormatElem = textFormatNodeList.at( 0 ).toElement(); 93 : 0 : mTextFormat.readXml( textFormatElem, context ); 94 : 0 : } 95 : : 96 : : return true; 97 : 0 : } 98 : : 99 : 0 : QgsAnnotationPointTextItem *QgsAnnotationPointTextItem::clone() 100 : : { 101 : 0 : std::unique_ptr< QgsAnnotationPointTextItem > item = std::make_unique< QgsAnnotationPointTextItem >( mText, mPoint ); 102 : 0 : item->setFormat( mTextFormat ); 103 : 0 : item->setAngle( mAngle ); 104 : 0 : item->setAlignment( mAlignment ); 105 : 0 : item->setZIndex( zIndex() ); 106 : 0 : return item.release(); 107 : 0 : } 108 : : 109 : 0 : QgsRectangle QgsAnnotationPointTextItem::boundingBox() const 110 : : { 111 : 0 : return QgsRectangle( mPoint.x(), mPoint.y(), mPoint.x(), mPoint.y() ); 112 : : } 113 : : 114 : 0 : QgsTextFormat QgsAnnotationPointTextItem::format() const 115 : : { 116 : 0 : return mTextFormat; 117 : : } 118 : : 119 : 0 : void QgsAnnotationPointTextItem::setFormat( const QgsTextFormat &format ) 120 : : { 121 : 0 : mTextFormat = format; 122 : 0 : } 123 : : 124 : 0 : Qt::Alignment QgsAnnotationPointTextItem::alignment() const 125 : : { 126 : 0 : return mAlignment; 127 : : } 128 : : 129 : 0 : void QgsAnnotationPointTextItem::setAlignment( Qt::Alignment alignment ) 130 : : { 131 : 0 : mAlignment = alignment; 132 : 0 : }