qwt_plot_grid.cpp
Go to the documentation of this file.
00001 /* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
00002  * Qwt Widget Library
00003  * Copyright (C) 1997   Josef Wilgen
00004  * Copyright (C) 2002   Uwe Rathmann
00005  *
00006  * This library is free software; you can redistribute it and/or
00007  * modify it under the terms of the Qwt License, Version 1.0
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     //  draw minor grid lines
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     //  draw major grid lines
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 }


plotjuggler
Author(s): Davide Faconti
autogenerated on Fri Sep 1 2017 02:41:56