Go to the documentation of this file.00001
00002
00003
00004
00005
00006
00007
00008
00009
00010 #include <qpainter.h>
00011 #include <qpen.h>
00012 #include "qwt_painter.h"
00013 #include "qwt_text.h"
00014 #include "qwt_scale_map.h"
00015 #include "qwt_scale_div.h"
00016 #include "qwt_plot_grid.h"
00017
00018 class QwtPlotGrid::PrivateData
00019 {
00020 public:
00021 PrivateData():
00022 xEnabled(true),
00023 yEnabled(true),
00024 xMinEnabled(false),
00025 yMinEnabled(false)
00026 {
00027 }
00028
00029 bool xEnabled;
00030 bool yEnabled;
00031 bool xMinEnabled;
00032 bool yMinEnabled;
00033
00034 QwtScaleDiv xScaleDiv;
00035 QwtScaleDiv yScaleDiv;
00036
00037 QPen majPen;
00038 QPen minPen;
00039 };
00040
00042 QwtPlotGrid::QwtPlotGrid():
00043 QwtPlotItem(QwtText("Grid"))
00044 {
00045 d_data = new PrivateData;
00046 setZ(10.0);
00047 }
00048
00050 QwtPlotGrid::~QwtPlotGrid()
00051 {
00052 delete d_data;
00053 }
00054
00056 int QwtPlotGrid::rtti() const
00057 {
00058 return QwtPlotItem::Rtti_PlotGrid;
00059 }
00060
00068 void QwtPlotGrid::enableX(bool tf)
00069 {
00070 if ( d_data->xEnabled != tf )
00071 {
00072 d_data->xEnabled = tf;
00073 itemChanged();
00074 }
00075 }
00076
00082 void QwtPlotGrid::enableY(bool tf)
00083 {
00084 if ( d_data->yEnabled != tf )
00085 {
00086 d_data->yEnabled = tf;
00087 itemChanged();
00088 }
00089 }
00090
00096 void QwtPlotGrid::enableXMin(bool tf)
00097 {
00098 if ( d_data->xMinEnabled != tf )
00099 {
00100 d_data->xMinEnabled = tf;
00101 itemChanged();
00102 }
00103 }
00104
00110 void QwtPlotGrid::enableYMin(bool tf)
00111 {
00112 if ( d_data->yMinEnabled != tf )
00113 {
00114 d_data->yMinEnabled = tf;
00115 itemChanged();
00116 }
00117 }
00118
00124 void QwtPlotGrid::setXDiv(const QwtScaleDiv &scaleDiv)
00125 {
00126 if ( d_data->xScaleDiv != scaleDiv )
00127 {
00128 d_data->xScaleDiv = scaleDiv;
00129 itemChanged();
00130 }
00131 }
00132
00138 void QwtPlotGrid::setYDiv(const QwtScaleDiv &scaleDiv)
00139 {
00140 if ( d_data->yScaleDiv != scaleDiv )
00141 {
00142 d_data->yScaleDiv = scaleDiv;
00143 itemChanged();
00144 }
00145 }
00146
00156 void QwtPlotGrid::setPen(const QPen &pen)
00157 {
00158 if ( d_data->majPen != pen || d_data->minPen != pen )
00159 {
00160 d_data->majPen = pen;
00161 d_data->minPen = pen;
00162 itemChanged();
00163 }
00164 }
00165
00175 void QwtPlotGrid::setMajPen(const QPen &pen)
00176 {
00177 if ( d_data->majPen != pen )
00178 {
00179 d_data->majPen = pen;
00180 itemChanged();
00181 }
00182 }
00183
00193 void QwtPlotGrid::setMinPen(const QPen &pen)
00194 {
00195 if ( d_data->minPen != pen )
00196 {
00197 d_data->minPen = pen;
00198 itemChanged();
00199 }
00200 }
00201
00214 void QwtPlotGrid::draw(QPainter *painter,
00215 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00216 const QRect &canvasRect) const
00217 {
00218
00219 painter->setPen(QwtPainter::scaledPen(d_data->minPen));
00220
00221 if (d_data->xEnabled && d_data->xMinEnabled)
00222 {
00223 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00224 d_data->xScaleDiv.ticks(QwtScaleDiv::MinorTick));
00225 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00226 d_data->xScaleDiv.ticks(QwtScaleDiv::MediumTick));
00227 }
00228
00229 if (d_data->yEnabled && d_data->yMinEnabled)
00230 {
00231 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00232 d_data->yScaleDiv.ticks(QwtScaleDiv::MinorTick));
00233 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00234 d_data->yScaleDiv.ticks(QwtScaleDiv::MediumTick));
00235 }
00236
00237
00238 painter->setPen(QwtPainter::scaledPen(d_data->majPen));
00239
00240 if (d_data->xEnabled)
00241 {
00242 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00243 d_data->xScaleDiv.ticks(QwtScaleDiv::MajorTick));
00244 }
00245
00246 if (d_data->yEnabled)
00247 {
00248 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00249 d_data->yScaleDiv.ticks(QwtScaleDiv::MajorTick));
00250 }
00251 }
00252
00253 void QwtPlotGrid::drawLines(QPainter *painter, const QRect &canvasRect,
00254 Qt::Orientation orientation, const QwtScaleMap &scaleMap,
00255 const QwtValueList &values) const
00256 {
00257 const int x1 = canvasRect.left();
00258 const int x2 = canvasRect.right();
00259 const int y1 = canvasRect.top();
00260 const int y2 = canvasRect.bottom();
00261
00262 for (uint i = 0; i < (uint)values.count(); i++)
00263 {
00264 const int value = scaleMap.transform(values[i]);
00265 if ( orientation == Qt::Horizontal )
00266 {
00267 if ((value >= y1) && (value <= y2))
00268 QwtPainter::drawLine(painter, x1, value, x2, value);
00269 }
00270 else
00271 {
00272 if ((value >= x1) && (value <= x2))
00273 QwtPainter::drawLine(painter, value, y1, value, y2);
00274 }
00275 }
00276 }
00277
00282 const QPen &QwtPlotGrid::majPen() const
00283 {
00284 return d_data->majPen;
00285 }
00286
00291 const QPen &QwtPlotGrid::minPen() const
00292 {
00293 return d_data->minPen;
00294 }
00295
00300 bool QwtPlotGrid::xEnabled() const
00301 {
00302 return d_data->xEnabled;
00303 }
00304
00309 bool QwtPlotGrid::xMinEnabled() const
00310 {
00311 return d_data->xMinEnabled;
00312 }
00313
00318 bool QwtPlotGrid::yEnabled() const
00319 {
00320 return d_data->yEnabled;
00321 }
00322
00327 bool QwtPlotGrid::yMinEnabled() const
00328 {
00329 return d_data->yMinEnabled;
00330 }
00331
00332
00334 const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
00335 {
00336 return d_data->xScaleDiv;
00337 }
00338
00340 const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
00341 {
00342 return d_data->yScaleDiv;
00343 }
00344
00353 void QwtPlotGrid::updateScaleDiv(const QwtScaleDiv& xScaleDiv,
00354 const QwtScaleDiv& yScaleDiv)
00355 {
00356 setXDiv(xScaleDiv);
00357 setYDiv(yScaleDiv);
00358 }