Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_plot_scaleitem.h"
00011 #include "qwt_plot.h"
00012 #include "qwt_scale_map.h"
00013 #include "qwt_interval.h"
00014 #include <qpalette.h>
00015 #include <qpainter.h>
00016
00017 class QwtPlotScaleItem::PrivateData
00018 {
00019 public:
00020 PrivateData():
00021 position( 0.0 ),
00022 borderDistance( -1 ),
00023 scaleDivFromAxis( true ),
00024 scaleDraw( new QwtScaleDraw() )
00025 {
00026 }
00027
00028 ~PrivateData()
00029 {
00030 delete scaleDraw;
00031 }
00032
00033 QwtInterval scaleInterval( const QRectF &,
00034 const QwtScaleMap &, const QwtScaleMap & ) const;
00035
00036 QPalette palette;
00037 QFont font;
00038 double position;
00039 int borderDistance;
00040 bool scaleDivFromAxis;
00041 QwtScaleDraw *scaleDraw;
00042 };
00043
00044 QwtInterval QwtPlotScaleItem::PrivateData::scaleInterval( const QRectF &canvasRect,
00045 const QwtScaleMap &xMap, const QwtScaleMap &yMap ) const
00046 {
00047 QwtInterval interval;
00048 if ( scaleDraw->orientation() == Qt::Horizontal )
00049 {
00050 interval.setMinValue( xMap.invTransform( canvasRect.left() ) );
00051 interval.setMaxValue( xMap.invTransform( canvasRect.right() - 1 ) );
00052 }
00053 else
00054 {
00055 interval.setMinValue( yMap.invTransform( canvasRect.bottom() - 1 ) );
00056 interval.setMaxValue( yMap.invTransform( canvasRect.top() ) );
00057 }
00058
00059 return interval;
00060 }
00061
00073 QwtPlotScaleItem::QwtPlotScaleItem(
00074 QwtScaleDraw::Alignment alignment, const double pos ):
00075 QwtPlotItem( QwtText( "Scale" ) )
00076 {
00077 d_data = new PrivateData;
00078 d_data->position = pos;
00079 d_data->scaleDraw->setAlignment( alignment );
00080
00081 setItemInterest( QwtPlotItem::ScaleInterest, true );
00082 setZ( 11.0 );
00083 }
00084
00086 QwtPlotScaleItem::~QwtPlotScaleItem()
00087 {
00088 delete d_data;
00089 }
00090
00092 int QwtPlotScaleItem::rtti() const
00093 {
00094 return QwtPlotItem::Rtti_PlotScale;
00095 }
00096
00106 void QwtPlotScaleItem::setScaleDiv( const QwtScaleDiv& scaleDiv )
00107 {
00108 d_data->scaleDivFromAxis = false;
00109 d_data->scaleDraw->setScaleDiv( scaleDiv );
00110 }
00111
00113 const QwtScaleDiv& QwtPlotScaleItem::scaleDiv() const
00114 {
00115 return d_data->scaleDraw->scaleDiv();
00116 }
00117
00125 void QwtPlotScaleItem::setScaleDivFromAxis( bool on )
00126 {
00127 if ( on != d_data->scaleDivFromAxis )
00128 {
00129 d_data->scaleDivFromAxis = on;
00130 if ( on )
00131 {
00132 const QwtPlot *plt = plot();
00133 if ( plt )
00134 {
00135 updateScaleDiv( plt->axisScaleDiv( xAxis() ),
00136 plt->axisScaleDiv( yAxis() ) );
00137 itemChanged();
00138 }
00139 }
00140 }
00141 }
00142
00148 bool QwtPlotScaleItem::isScaleDivFromAxis() const
00149 {
00150 return d_data->scaleDivFromAxis;
00151 }
00152
00157 void QwtPlotScaleItem::setPalette( const QPalette &palette )
00158 {
00159 if ( palette != d_data->palette )
00160 {
00161 d_data->palette = palette;
00162
00163 legendChanged();
00164 itemChanged();
00165 }
00166 }
00167
00172 QPalette QwtPlotScaleItem::palette() const
00173 {
00174 return d_data->palette;
00175 }
00176
00181 void QwtPlotScaleItem::setFont( const QFont &font )
00182 {
00183 if ( font != d_data->font )
00184 {
00185 d_data->font = font;
00186 itemChanged();
00187 }
00188 }
00189
00194 QFont QwtPlotScaleItem::font() const
00195 {
00196 return d_data->font;
00197 }
00198
00210 void QwtPlotScaleItem::setScaleDraw( QwtScaleDraw *scaleDraw )
00211 {
00212 if ( scaleDraw == NULL )
00213 return;
00214
00215 if ( scaleDraw != d_data->scaleDraw )
00216 delete d_data->scaleDraw;
00217
00218 d_data->scaleDraw = scaleDraw;
00219
00220 const QwtPlot *plt = plot();
00221 if ( plt )
00222 {
00223 updateScaleDiv( plt->axisScaleDiv( xAxis() ),
00224 plt->axisScaleDiv( yAxis() ) );
00225 }
00226
00227 itemChanged();
00228 }
00229
00234 const QwtScaleDraw *QwtPlotScaleItem::scaleDraw() const
00235 {
00236 return d_data->scaleDraw;
00237 }
00238
00243 QwtScaleDraw *QwtPlotScaleItem::scaleDraw()
00244 {
00245 return d_data->scaleDraw;
00246 }
00247
00259 void QwtPlotScaleItem::setPosition( double pos )
00260 {
00261 if ( d_data->position != pos )
00262 {
00263 d_data->position = pos;
00264 d_data->borderDistance = -1;
00265 itemChanged();
00266 }
00267 }
00268
00273 double QwtPlotScaleItem::position() const
00274 {
00275 return d_data->position;
00276 }
00277
00294 void QwtPlotScaleItem::setBorderDistance( int distance )
00295 {
00296 if ( distance < 0 )
00297 distance = -1;
00298
00299 if ( distance != d_data->borderDistance )
00300 {
00301 d_data->borderDistance = distance;
00302 itemChanged();
00303 }
00304 }
00305
00310 int QwtPlotScaleItem::borderDistance() const
00311 {
00312 return d_data->borderDistance;
00313 }
00314
00331 void QwtPlotScaleItem::setAlignment( QwtScaleDraw::Alignment alignment )
00332 {
00333 QwtScaleDraw *sd = d_data->scaleDraw;
00334 if ( sd->alignment() != alignment )
00335 {
00336 sd->setAlignment( alignment );
00337 itemChanged();
00338 }
00339 }
00340
00344 void QwtPlotScaleItem::draw( QPainter *painter,
00345 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00346 const QRectF &canvasRect ) const
00347 {
00348 QwtScaleDraw *sd = d_data->scaleDraw;
00349
00350 if ( d_data->scaleDivFromAxis )
00351 {
00352 const QwtInterval interval =
00353 d_data->scaleInterval( canvasRect, xMap, yMap );
00354
00355 if ( interval != sd->scaleDiv().interval() )
00356 {
00357 QwtScaleDiv scaleDiv = sd->scaleDiv();
00358 scaleDiv.setInterval( interval );
00359 sd->setScaleDiv( scaleDiv );
00360 }
00361 }
00362
00363 QPen pen = painter->pen();
00364 pen.setStyle( Qt::SolidLine );
00365 painter->setPen( pen );
00366
00367 if ( sd->orientation() == Qt::Horizontal )
00368 {
00369 double y;
00370 if ( d_data->borderDistance >= 0 )
00371 {
00372 if ( sd->alignment() == QwtScaleDraw::BottomScale )
00373 y = canvasRect.top() + d_data->borderDistance;
00374 else
00375 {
00376 y = canvasRect.bottom() - d_data->borderDistance;
00377 }
00378
00379 }
00380 else
00381 {
00382 y = yMap.transform( d_data->position );
00383 }
00384
00385 if ( y < canvasRect.top() || y > canvasRect.bottom() )
00386 return;
00387
00388 sd->move( canvasRect.left(), y );
00389 sd->setLength( canvasRect.width() - 1 );
00390
00391 QwtTransform *transform = NULL;
00392 if ( xMap.transformation() )
00393 transform = xMap.transformation()->copy();
00394
00395 sd->setTransformation( transform );
00396 }
00397 else
00398 {
00399 double x;
00400 if ( d_data->borderDistance >= 0 )
00401 {
00402 if ( sd->alignment() == QwtScaleDraw::RightScale )
00403 x = canvasRect.left() + d_data->borderDistance;
00404 else
00405 {
00406 x = canvasRect.right() - d_data->borderDistance;
00407 }
00408 }
00409 else
00410 {
00411 x = xMap.transform( d_data->position );
00412 }
00413 if ( x < canvasRect.left() || x > canvasRect.right() )
00414 return;
00415
00416 sd->move( x, canvasRect.top() );
00417 sd->setLength( canvasRect.height() - 1 );
00418
00419 QwtTransform *transform = NULL;
00420 if ( yMap.transformation() )
00421 transform = yMap.transformation()->copy();
00422
00423 sd->setTransformation( transform );
00424 }
00425
00426 painter->setFont( d_data->font );
00427
00428 sd->draw( painter, d_data->palette );
00429 }
00430
00443 void QwtPlotScaleItem::updateScaleDiv( const QwtScaleDiv& xScaleDiv,
00444 const QwtScaleDiv& yScaleDiv )
00445 {
00446 QwtScaleDraw *scaleDraw = d_data->scaleDraw;
00447
00448 if ( d_data->scaleDivFromAxis && scaleDraw )
00449 {
00450 const QwtScaleDiv &scaleDiv =
00451 scaleDraw->orientation() == Qt::Horizontal ? xScaleDiv : yScaleDiv;
00452
00453 const QwtPlot *plt = plot();
00454 if ( plt != NULL )
00455 {
00456 const QRectF canvasRect = plt->canvas()->contentsRect();
00457
00458 const QwtInterval interval = d_data->scaleInterval(
00459 canvasRect, plt->canvasMap( xAxis() ), plt->canvasMap( yAxis() ) );
00460
00461 QwtScaleDiv sd = scaleDiv;
00462 sd.setInterval( interval );
00463
00464 if ( sd != scaleDraw->scaleDiv() )
00465 {
00466
00467
00468
00469
00470 scaleDraw->setScaleDiv( sd );
00471 }
00472 }
00473 else
00474 {
00475 scaleDraw->setScaleDiv( scaleDiv );
00476 }
00477 }
00478 }