/*! Calculate the width/height that is needed for a vertical/horizontal scale. The extent is calculated from the pen width of the backbone, the major tick length, the spacing and the maximum width/height of the labels. \param font Font used for painting the labels \return Extent \sa minLength() */ double QwtScaleDraw::extent( const QFont &font ) const { double d = 0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { if ( orientation() == Qt::Vertical ) d = maxLabelWidth( font ); else d = maxLabelHeight( font ); if ( d > 0 ) d += spacing(); } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // pen width can be zero d += pw; } d = qMax( d, minimumExtent() ); return d; }
/*! Calculate the extent of the scale The extent is the distance between the baseline to the outermost pixel of the scale draw. radius() + extent() is an upper limit for the radius of the bounding circle. \param font Font used for painting the labels \sa setMinimumExtent(), minimumExtent() \warning The implemented algo is not too smart and calculates only an upper limit, that might be a few pixels too large */ double QwtRoundScaleDraw::extent( const QFont &font ) const { double d = 0.0; if ( hasComponent( QwtAbstractScaleDraw::Labels ) ) { const QwtScaleDiv &sd = scaleDiv(); const QList<double> &ticks = sd.ticks( QwtScaleDiv::MajorTick ); for ( int i = 0; i < ticks.count(); i++ ) { const double value = ticks[i]; if ( !sd.contains( value ) ) continue; const QwtText label = tickLabel( font, value ); if ( label.isEmpty() ) continue; const double tval = scaleMap().transform( value ); if ( ( tval < d_data->startAngle + 360 * 16 ) && ( tval > d_data->startAngle - 360 * 16 ) ) { const double arc = tval / 16.0 / 360.0 * 2 * M_PI; const QSizeF sz = label.textSize( font ); const double off = qMax( sz.width(), sz.height() ); double x = off * qSin( arc ); double y = off * qCos( arc ); const double dist = qSqrt( x * x + y * y ); if ( dist > d ) d = dist; } } } if ( hasComponent( QwtAbstractScaleDraw::Ticks ) ) { d += maxTickLength(); } if ( hasComponent( QwtAbstractScaleDraw::Backbone ) ) { const double pw = qMax( 1, penWidth() ); // penwidth can be zero d += pw; } if ( hasComponent( QwtAbstractScaleDraw::Labels ) && ( hasComponent( QwtAbstractScaleDraw::Ticks ) || hasComponent( QwtAbstractScaleDraw::Backbone ) ) ) { d += spacing(); } d = qMax( d, minimumExtent() ); return d; }