00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include "qwt_plot_grid.h"
00011 #include "qwt_painter.h"
00012 #include "qwt_text.h"
00013 #include "qwt_scale_map.h"
00014 #include "qwt_scale_div.h"
00015 #include "qwt_math.h"
00016 #include <qpainter.h>
00017 #include <qpen.h>
00018
00019 static inline bool qwtFuzzyGreaterOrEqual( double d1, double d2 )
00020 {
00021 return ( d1 >= d2 ) || qFuzzyCompare( d1, d2 );
00022 }
00023
00024 class QwtPlotGrid::PrivateData
00025 {
00026 public:
00027 PrivateData():
00028 xEnabled( true ),
00029 yEnabled( true ),
00030 xMinEnabled( false ),
00031 yMinEnabled( false )
00032 {
00033 }
00034
00035 bool xEnabled;
00036 bool yEnabled;
00037 bool xMinEnabled;
00038 bool yMinEnabled;
00039
00040 QwtScaleDiv xScaleDiv;
00041 QwtScaleDiv yScaleDiv;
00042
00043 QPen majorPen;
00044 QPen minorPen;
00045 };
00046
00048 QwtPlotGrid::QwtPlotGrid():
00049 QwtPlotItem( QwtText( "Grid" ) )
00050 {
00051 d_data = new PrivateData;
00052
00053 setItemInterest( QwtPlotItem::ScaleInterest, true );
00054 setZ( 10.0 );
00055 }
00056
00058 QwtPlotGrid::~QwtPlotGrid()
00059 {
00060 delete d_data;
00061 }
00062
00064 int QwtPlotGrid::rtti() const
00065 {
00066 return QwtPlotItem::Rtti_PlotGrid;
00067 }
00068
00076 void QwtPlotGrid::enableX( bool on )
00077 {
00078 if ( d_data->xEnabled != on )
00079 {
00080 d_data->xEnabled = on;
00081
00082 legendChanged();
00083 itemChanged();
00084 }
00085 }
00086
00092 void QwtPlotGrid::enableY( bool on )
00093 {
00094 if ( d_data->yEnabled != on )
00095 {
00096 d_data->yEnabled = on;
00097
00098 legendChanged();
00099 itemChanged();
00100 }
00101 }
00102
00108 void QwtPlotGrid::enableXMin( bool on )
00109 {
00110 if ( d_data->xMinEnabled != on )
00111 {
00112 d_data->xMinEnabled = on;
00113
00114 legendChanged();
00115 itemChanged();
00116 }
00117 }
00118
00124 void QwtPlotGrid::enableYMin( bool on )
00125 {
00126 if ( d_data->yMinEnabled != on )
00127 {
00128 d_data->yMinEnabled = on;
00129
00130 legendChanged();
00131 itemChanged();
00132 }
00133 }
00134
00140 void QwtPlotGrid::setXDiv( const QwtScaleDiv &scaleDiv )
00141 {
00142 if ( d_data->xScaleDiv != scaleDiv )
00143 {
00144 d_data->xScaleDiv = scaleDiv;
00145 itemChanged();
00146 }
00147 }
00148
00154 void QwtPlotGrid::setYDiv( const QwtScaleDiv &scaleDiv )
00155 {
00156 if ( d_data->yScaleDiv != scaleDiv )
00157 {
00158 d_data->yScaleDiv = scaleDiv;
00159 itemChanged();
00160 }
00161 }
00162
00176 void QwtPlotGrid::setPen( const QColor &color, qreal width, Qt::PenStyle style )
00177 {
00178 setPen( QPen( color, width, style ) );
00179 }
00180
00187 void QwtPlotGrid::setPen( const QPen &pen )
00188 {
00189 if ( d_data->majorPen != pen || d_data->minorPen != pen )
00190 {
00191 d_data->majorPen = pen;
00192 d_data->minorPen = pen;
00193
00194 legendChanged();
00195 itemChanged();
00196 }
00197 }
00198
00212 void QwtPlotGrid::setMajorPen( const QColor &color, qreal width, Qt::PenStyle style )
00213 {
00214 setMajorPen( QPen( color, width, style ) );
00215 }
00216
00223 void QwtPlotGrid::setMajorPen( const QPen &pen )
00224 {
00225 if ( d_data->majorPen != pen )
00226 {
00227 d_data->majorPen = pen;
00228
00229 legendChanged();
00230 itemChanged();
00231 }
00232 }
00233
00247 void QwtPlotGrid::setMinorPen( const QColor &color, qreal width, Qt::PenStyle style )
00248 {
00249 setMinorPen( QPen( color, width, style ) );
00250 }
00251
00258 void QwtPlotGrid::setMinorPen( const QPen &pen )
00259 {
00260 if ( d_data->minorPen != pen )
00261 {
00262 d_data->minorPen = pen;
00263
00264 legendChanged();
00265 itemChanged();
00266 }
00267 }
00268
00282 void QwtPlotGrid::draw( QPainter *painter,
00283 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00284 const QRectF &canvasRect ) const
00285 {
00286
00287 QPen minorPen = d_data->minorPen;
00288 minorPen.setCapStyle( Qt::FlatCap );
00289
00290 painter->setPen( minorPen );
00291
00292 if ( d_data->xEnabled && d_data->xMinEnabled )
00293 {
00294 drawLines( painter, canvasRect, Qt::Vertical, xMap,
00295 d_data->xScaleDiv.ticks( QwtScaleDiv::MinorTick ) );
00296 drawLines( painter, canvasRect, Qt::Vertical, xMap,
00297 d_data->xScaleDiv.ticks( QwtScaleDiv::MediumTick ) );
00298 }
00299
00300 if ( d_data->yEnabled && d_data->yMinEnabled )
00301 {
00302 drawLines( painter, canvasRect, Qt::Horizontal, yMap,
00303 d_data->yScaleDiv.ticks( QwtScaleDiv::MinorTick ) );
00304 drawLines( painter, canvasRect, Qt::Horizontal, yMap,
00305 d_data->yScaleDiv.ticks( QwtScaleDiv::MediumTick ) );
00306 }
00307
00308
00309 QPen majorPen = d_data->majorPen;
00310 majorPen.setCapStyle( Qt::FlatCap );
00311
00312 painter->setPen( majorPen );
00313
00314 if ( d_data->xEnabled )
00315 {
00316 drawLines( painter, canvasRect, Qt::Vertical, xMap,
00317 d_data->xScaleDiv.ticks( QwtScaleDiv::MajorTick ) );
00318 }
00319
00320 if ( d_data->yEnabled )
00321 {
00322 drawLines( painter, canvasRect, Qt::Horizontal, yMap,
00323 d_data->yScaleDiv.ticks( QwtScaleDiv::MajorTick ) );
00324 }
00325 }
00326
00327 void QwtPlotGrid::drawLines( QPainter *painter, const QRectF &canvasRect,
00328 Qt::Orientation orientation, const QwtScaleMap &scaleMap,
00329 const QList<double> &values ) const
00330 {
00331 const double x1 = canvasRect.left();
00332 const double x2 = canvasRect.right() - 1.0;
00333 const double y1 = canvasRect.top();
00334 const double y2 = canvasRect.bottom() - 1.0;
00335
00336 const bool doAlign = QwtPainter::roundingAlignment( painter );
00337
00338 for ( int i = 0; i < values.count(); i++ )
00339 {
00340 double value = scaleMap.transform( values[i] );
00341 if ( doAlign )
00342 value = qRound( value );
00343
00344 if ( orientation == Qt::Horizontal )
00345 {
00346 if ( qwtFuzzyGreaterOrEqual( value, y1 ) &&
00347 qwtFuzzyGreaterOrEqual( y2, value ) )
00348 {
00349 QwtPainter::drawLine( painter, x1, value, x2, value );
00350 }
00351 }
00352 else
00353 {
00354 if ( qwtFuzzyGreaterOrEqual( value, x1 ) &&
00355 qwtFuzzyGreaterOrEqual( x2, value ) )
00356 {
00357 QwtPainter::drawLine( painter, value, y1, value, y2 );
00358 }
00359 }
00360 }
00361 }
00362
00367 const QPen &QwtPlotGrid::majorPen() const
00368 {
00369 return d_data->majorPen;
00370 }
00371
00376 const QPen &QwtPlotGrid::minorPen() const
00377 {
00378 return d_data->minorPen;
00379 }
00380
00385 bool QwtPlotGrid::xEnabled() const
00386 {
00387 return d_data->xEnabled;
00388 }
00389
00394 bool QwtPlotGrid::xMinEnabled() const
00395 {
00396 return d_data->xMinEnabled;
00397 }
00398
00403 bool QwtPlotGrid::yEnabled() const
00404 {
00405 return d_data->yEnabled;
00406 }
00407
00412 bool QwtPlotGrid::yMinEnabled() const
00413 {
00414 return d_data->yMinEnabled;
00415 }
00416
00417
00419 const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
00420 {
00421 return d_data->xScaleDiv;
00422 }
00423
00425 const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
00426 {
00427 return d_data->yScaleDiv;
00428 }
00429
00438 void QwtPlotGrid::updateScaleDiv( const QwtScaleDiv& xScaleDiv,
00439 const QwtScaleDiv& yScaleDiv )
00440 {
00441 setXDiv( xScaleDiv );
00442 setYDiv( yScaleDiv );
00443 }