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
00125 void QwtPlotGrid::setXDiv(const QwtScaleDiv &scaleDiv)
00126 {
00127 if ( d_data->xScaleDiv != scaleDiv )
00128 {
00129 d_data->xScaleDiv = scaleDiv;
00130 itemChanged();
00131 }
00132 }
00133
00140 void QwtPlotGrid::setYDiv(const QwtScaleDiv &sy)
00141 {
00142 if ( d_data->yScaleDiv != sy )
00143 {
00144 d_data->yScaleDiv = sy;
00145 itemChanged();
00146 }
00147 }
00148
00154 void QwtPlotGrid::setPen(const QPen &p)
00155 {
00156 if ( d_data->majPen != p || d_data->minPen != p )
00157 {
00158 d_data->majPen = p;
00159 d_data->minPen = p;
00160 itemChanged();
00161 }
00162 }
00163
00169 void QwtPlotGrid::setMajPen(const QPen &p)
00170 {
00171 if ( d_data->majPen != p )
00172 {
00173 d_data->majPen = p;
00174 itemChanged();
00175 }
00176 }
00177
00182 void QwtPlotGrid::setMinPen(const QPen &p)
00183 {
00184 if ( d_data->minPen != p )
00185 {
00186 d_data->minPen = p;
00187 itemChanged();
00188 }
00189 }
00190
00203 void QwtPlotGrid::draw(QPainter *painter,
00204 const QwtScaleMap &xMap, const QwtScaleMap &yMap,
00205 const QRect &canvasRect) const
00206 {
00207
00208 painter->setPen(d_data->minPen);
00209
00210 if (d_data->xEnabled && d_data->xMinEnabled)
00211 {
00212 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00213 d_data->xScaleDiv.ticks(QwtScaleDiv::MinorTick));
00214 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00215 d_data->xScaleDiv.ticks(QwtScaleDiv::MediumTick));
00216 }
00217
00218 if (d_data->yEnabled && d_data->yMinEnabled)
00219 {
00220 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00221 d_data->yScaleDiv.ticks(QwtScaleDiv::MinorTick));
00222 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00223 d_data->yScaleDiv.ticks(QwtScaleDiv::MediumTick));
00224 }
00225
00226
00227 painter->setPen(d_data->majPen);
00228
00229 if (d_data->xEnabled)
00230 {
00231 drawLines(painter, canvasRect, Qt::Vertical, xMap,
00232 d_data->xScaleDiv.ticks(QwtScaleDiv::MajorTick));
00233 }
00234
00235 if (d_data->yEnabled)
00236 {
00237 drawLines(painter, canvasRect, Qt::Horizontal, yMap,
00238 d_data->yScaleDiv.ticks(QwtScaleDiv::MajorTick));
00239 }
00240 }
00241
00242 void QwtPlotGrid::drawLines(QPainter *painter, const QRect &canvasRect,
00243 Qt::Orientation orientation, const QwtScaleMap &scaleMap,
00244 const QwtValueList &values) const
00245 {
00246 const int x1 = canvasRect.left();
00247 const int x2 = canvasRect.right();
00248 const int y1 = canvasRect.top();
00249 const int y2 = canvasRect.bottom();
00250
00251 for (uint i = 0; i < (uint)values.count(); i++)
00252 {
00253 const int value = scaleMap.transform(values[i]);
00254 if ( orientation == Qt::Horizontal )
00255 {
00256 if ((value >= y1) && (value <= y2))
00257 QwtPainter::drawLine(painter, x1, value, x2, value);
00258 }
00259 else
00260 {
00261 if ((value >= x1) && (value <= x2))
00262 QwtPainter::drawLine(painter, value, y1, value, y2);
00263 }
00264 }
00265 }
00266
00271 const QPen &QwtPlotGrid::majPen() const
00272 {
00273 return d_data->majPen;
00274 }
00275
00280 const QPen &QwtPlotGrid::minPen() const
00281 {
00282 return d_data->minPen;
00283 }
00284
00289 bool QwtPlotGrid::xEnabled() const
00290 {
00291 return d_data->xEnabled;
00292 }
00293
00298 bool QwtPlotGrid::xMinEnabled() const
00299 {
00300 return d_data->xMinEnabled;
00301 }
00302
00307 bool QwtPlotGrid::yEnabled() const
00308 {
00309 return d_data->yEnabled;
00310 }
00311
00316 bool QwtPlotGrid::yMinEnabled() const
00317 {
00318 return d_data->yMinEnabled;
00319 }
00320
00321
00323 const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
00324 {
00325 return d_data->xScaleDiv;
00326 }
00327
00329 const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
00330 {
00331 return d_data->yScaleDiv;
00332 }
00333
00334 void QwtPlotGrid::updateScaleDiv(const QwtScaleDiv& xDiv,
00335 const QwtScaleDiv& yDiv)
00336 {
00337 setXDiv(xDiv);
00338 setYDiv(yDiv);
00339 }