Branch data Line data Source code
1 : : /*************************************************************************** 2 : : qgslegendsettings.cpp 3 : : -------------------------------------- 4 : : Date : July 2014 5 : : Copyright : (C) 2014 by Martin Dobias 6 : : Email : wonder dot sk at gmail dot com 7 : : *************************************************************************** 8 : : * * 9 : : * This program is free software; you can redistribute it and/or modify * 10 : : * it under the terms of the GNU General Public License as published by * 11 : : * the Free Software Foundation; either version 2 of the License, or * 12 : : * (at your option) any later version. * 13 : : * * 14 : : ***************************************************************************/ 15 : : 16 : : #include "qgslegendsettings.h" 17 : : #include "qgsexpressioncontext.h" 18 : : #include "qgsexpression.h" 19 : : #include "qgsrendercontext.h" 20 : : 21 : : #include <QPainter> 22 : : 23 : 0 : QgsLegendSettings::QgsLegendSettings() 24 : 0 : : mFontColor( QColor( 0, 0, 0 ) ) 25 : 0 : , mSymbolSize( 7, 4 ) 26 : 0 : , mWmsLegendSize( 50, 25 ) 27 : 0 : , mRasterStrokeColor( Qt::black ) 28 : : { 29 : 0 : rstyle( QgsLegendStyle::Title ).setMargin( QgsLegendStyle::Bottom, 3.5 ); 30 : 0 : rstyle( QgsLegendStyle::Group ).setMargin( QgsLegendStyle::Top, 3 ); 31 : 0 : rstyle( QgsLegendStyle::Subgroup ).setMargin( QgsLegendStyle::Top, 3 ); 32 : 0 : rstyle( QgsLegendStyle::Symbol ).setMargin( QgsLegendStyle::Top, 2.5 ); 33 : 0 : rstyle( QgsLegendStyle::SymbolLabel ).setMargin( QgsLegendStyle::Top, 2 ); 34 : 0 : rstyle( QgsLegendStyle::SymbolLabel ).setMargin( QgsLegendStyle::Left, 2 ); 35 : 0 : rstyle( QgsLegendStyle::Title ).rfont().setPointSizeF( 16.0 ); 36 : 0 : rstyle( QgsLegendStyle::Group ).rfont().setPointSizeF( 14.0 ); 37 : 0 : rstyle( QgsLegendStyle::Subgroup ).rfont().setPointSizeF( 12.0 ); 38 : 0 : rstyle( QgsLegendStyle::SymbolLabel ).rfont().setPointSizeF( 12.0 ); 39 : 0 : } 40 : : 41 : 0 : double QgsLegendSettings::mmPerMapUnit() const 42 : : { 43 : 0 : return mMmPerMapUnit; 44 : : } 45 : : 46 : 0 : void QgsLegendSettings::setMmPerMapUnit( double mmPerMapUnit ) 47 : : { 48 : 0 : mMmPerMapUnit = mmPerMapUnit; 49 : 0 : } 50 : : 51 : 0 : bool QgsLegendSettings::useAdvancedEffects() const 52 : : { 53 : 0 : return mUseAdvancedEffects; 54 : : } 55 : : 56 : 0 : void QgsLegendSettings::setUseAdvancedEffects( bool use ) 57 : : { 58 : 0 : mUseAdvancedEffects = use; 59 : 0 : } 60 : : 61 : 0 : double QgsLegendSettings::mapScale() const 62 : : { 63 : 0 : return mMapScale; 64 : : } 65 : : 66 : 0 : void QgsLegendSettings::setMapScale( double scale ) 67 : : { 68 : 0 : mMapScale = scale; 69 : 0 : } 70 : : 71 : 0 : double QgsLegendSettings::mapUnitsPerPixel() const 72 : : { 73 : 0 : return 1 / ( mMmPerMapUnit * ( mDpi / 25.4 ) ); 74 : : } 75 : : 76 : 0 : void QgsLegendSettings::setMapUnitsPerPixel( double mapUnitsPerPixel ) 77 : : { 78 : 0 : mMmPerMapUnit = 1 / mapUnitsPerPixel / ( mDpi / 25.4 ); 79 : 0 : } 80 : : 81 : 0 : int QgsLegendSettings::dpi() const 82 : : { 83 : 0 : return mDpi; 84 : : } 85 : : 86 : 0 : void QgsLegendSettings::setDpi( int dpi ) 87 : : { 88 : 0 : mDpi = dpi; 89 : 0 : } 90 : : 91 : 0 : QStringList QgsLegendSettings::evaluateItemText( const QString &text, const QgsExpressionContext &context ) const 92 : : { 93 : 0 : const QString textToRender = QgsExpression::replaceExpressionText( text, &context ); 94 : 0 : return splitStringForWrapping( textToRender ); 95 : 0 : } 96 : : 97 : 0 : QStringList QgsLegendSettings::splitStringForWrapping( const QString &stringToSplit ) const 98 : : { 99 : 0 : const QStringList lines = stringToSplit.split( '\n' ); 100 : : 101 : : // If the string contains nothing then just return the string without splitting. 102 : 0 : if ( wrapChar().isEmpty() ) 103 : 0 : return lines; 104 : : 105 : 0 : QStringList res; 106 : 0 : for ( const QString &line : lines ) 107 : : { 108 : 0 : res.append( line.split( wrapChar() ) ); 109 : : } 110 : 0 : return res; 111 : 0 : } 112 : : 113 : : #define FONT_WORKAROUND_SCALE 10 //scale factor for upscaling fontsize and downscaling painter 114 : : 115 : : 116 : 0 : void QgsLegendSettings::drawText( QPainter *p, double x, double y, const QString &text, const QFont &font ) const 117 : : { 118 : 0 : QFont textFont = scaledFontPixelSize( font ); 119 : : 120 : 0 : QgsScopedQPainterState painterState( p ); 121 : 0 : p->setFont( textFont ); 122 : 0 : double scaleFactor = 1.0 / FONT_WORKAROUND_SCALE; 123 : 0 : p->scale( scaleFactor, scaleFactor ); 124 : 0 : p->drawText( QPointF( x * FONT_WORKAROUND_SCALE, y * FONT_WORKAROUND_SCALE ), text ); 125 : 0 : } 126 : : 127 : : 128 : 0 : void QgsLegendSettings::drawText( QPainter *p, const QRectF &rect, const QString &text, const QFont &font, Qt::AlignmentFlag halignment, Qt::AlignmentFlag valignment, int flags ) const 129 : : { 130 : 0 : QFont textFont = scaledFontPixelSize( font ); 131 : : 132 : 0 : QRectF scaledRect( rect.x() * FONT_WORKAROUND_SCALE, rect.y() * FONT_WORKAROUND_SCALE, 133 : 0 : rect.width() * FONT_WORKAROUND_SCALE, rect.height() * FONT_WORKAROUND_SCALE ); 134 : : 135 : 0 : QgsScopedQPainterState painterState( p ); 136 : 0 : p->setFont( textFont ); 137 : 0 : double scaleFactor = 1.0 / FONT_WORKAROUND_SCALE; 138 : 0 : p->scale( scaleFactor, scaleFactor ); 139 : 0 : p->drawText( scaledRect, halignment | valignment | flags, text ); 140 : 0 : } 141 : : 142 : : 143 : 0 : QFont QgsLegendSettings::scaledFontPixelSize( const QFont &font ) const 144 : : { 145 : 0 : QFont scaledFont = font; 146 : 0 : double pixelSize = pixelFontSize( font.pointSizeF() ) * FONT_WORKAROUND_SCALE + 0.5; 147 : 0 : scaledFont.setPixelSize( pixelSize ); 148 : 0 : return scaledFont; 149 : 0 : } 150 : : 151 : 0 : double QgsLegendSettings::pixelFontSize( double pointSize ) const 152 : : { 153 : 0 : return ( pointSize * 0.3527 ); 154 : : } 155 : : 156 : 0 : double QgsLegendSettings::textWidthMillimeters( const QFont &font, const QString &text ) const 157 : : { 158 : 0 : QFont metricsFont = scaledFontPixelSize( font ); 159 : 0 : QFontMetricsF fontMetrics( metricsFont ); 160 : 0 : return ( fontMetrics.horizontalAdvance( text ) / FONT_WORKAROUND_SCALE ); 161 : 0 : } 162 : : 163 : 0 : double QgsLegendSettings::fontHeightCharacterMM( const QFont &font, QChar c ) const 164 : : { 165 : 0 : QFont metricsFont = scaledFontPixelSize( font ); 166 : 0 : QFontMetricsF fontMetrics( metricsFont ); 167 : 0 : return ( fontMetrics.boundingRect( c ).height() / FONT_WORKAROUND_SCALE ); 168 : 0 : } 169 : : 170 : 0 : double QgsLegendSettings::fontAscentMillimeters( const QFont &font ) const 171 : : { 172 : 0 : QFont metricsFont = scaledFontPixelSize( font ); 173 : 0 : QFontMetricsF fontMetrics( metricsFont ); 174 : 0 : return ( fontMetrics.ascent() / FONT_WORKAROUND_SCALE ); 175 : 0 : } 176 : : 177 : 0 : double QgsLegendSettings::fontDescentMillimeters( const QFont &font ) const 178 : : { 179 : 0 : QFont metricsFont = scaledFontPixelSize( font ); 180 : 0 : QFontMetricsF fontMetrics( metricsFont ); 181 : 0 : return ( fontMetrics.descent() / FONT_WORKAROUND_SCALE ); 182 : 0 : } 183 : :