Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgssvgannotation.cpp 3 : : -------------------- 4 : : begin : November, 2012 5 : : copyright : (C) 2012 by Marco Hugentobler 6 : : email : marco dot hugentobler at sourcepole dot ch 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 "qgssvgannotation.h" 19 : : 20 : : #include "qgsreadwritecontext.h" 21 : : #include "qgsproject.h" 22 : : #include "qgssymbollayerutils.h" 23 : : 24 : : #include <QDomDocument> 25 : : #include <QDomElement> 26 : : 27 : : 28 : 0 : QgsSvgAnnotation::QgsSvgAnnotation( QObject *parent ) 29 : 0 : : QgsAnnotation( parent ) 30 : 0 : { 31 : : 32 : 0 : } 33 : : 34 : 0 : QgsSvgAnnotation *QgsSvgAnnotation::clone() const 35 : : { 36 : 0 : std::unique_ptr< QgsSvgAnnotation > c( new QgsSvgAnnotation() ); 37 : 0 : copyCommonProperties( c.get() ); 38 : 0 : c->setFilePath( mFilePath ); 39 : 0 : return c.release(); 40 : 0 : } 41 : : 42 : 0 : void QgsSvgAnnotation::writeXml( QDomElement &elem, QDomDocument &doc, const QgsReadWriteContext &context ) const 43 : : { 44 : 0 : QString filePath = QgsSymbolLayerUtils::svgSymbolPathToName( mFilePath, context.pathResolver() ); 45 : 0 : QDomElement svgAnnotationElem = doc.createElement( QStringLiteral( "SVGAnnotationItem" ) ); 46 : 0 : svgAnnotationElem.setAttribute( QStringLiteral( "file" ), filePath ); 47 : 0 : _writeXml( svgAnnotationElem, doc, context ); 48 : 0 : elem.appendChild( svgAnnotationElem ); 49 : 0 : } 50 : : 51 : 0 : void QgsSvgAnnotation::readXml( const QDomElement &itemElem, const QgsReadWriteContext &context ) 52 : : { 53 : 0 : QString filePath = QgsSymbolLayerUtils::svgSymbolNameToPath( itemElem.attribute( QStringLiteral( "file" ) ), context.pathResolver() ); 54 : 0 : setFilePath( filePath ); 55 : 0 : QDomElement annotationElem = itemElem.firstChildElement( QStringLiteral( "AnnotationItem" ) ); 56 : 0 : if ( !annotationElem.isNull() ) 57 : : { 58 : 0 : _readXml( annotationElem, context ); 59 : 0 : } 60 : 0 : } 61 : : 62 : 0 : void QgsSvgAnnotation::renderAnnotation( QgsRenderContext &context, QSizeF size ) const 63 : : { 64 : 0 : QPainter *painter = context.painter(); 65 : 0 : if ( !painter ) 66 : : { 67 : 0 : return; 68 : : } 69 : : 70 : : //keep width/height ratio of svg 71 : 0 : QRect viewBox = mSvgRenderer.viewBox(); 72 : 0 : if ( viewBox.isValid() ) 73 : : { 74 : 0 : double widthRatio = size.width() / viewBox.width(); 75 : 0 : double heightRatio = size.height() / viewBox.height(); 76 : 0 : double renderWidth = 0; 77 : 0 : double renderHeight = 0; 78 : 0 : if ( widthRatio <= heightRatio ) 79 : : { 80 : 0 : renderWidth = size.width(); 81 : 0 : renderHeight = viewBox.height() * widthRatio; 82 : 0 : } 83 : : else 84 : : { 85 : 0 : renderHeight = size.height(); 86 : 0 : renderWidth = viewBox.width() * heightRatio; 87 : : } 88 : : 89 : 0 : mSvgRenderer.render( painter, QRectF( 0, 0, renderWidth, 90 : 0 : renderHeight ) ); 91 : 0 : } 92 : 0 : } 93 : : 94 : 0 : void QgsSvgAnnotation::setFilePath( const QString &file ) 95 : : { 96 : 0 : mFilePath = file; 97 : 0 : mSvgRenderer.load( mFilePath ); 98 : 0 : emit appearanceChanged(); 99 : 0 : }