1
/* -*- mode: C++ ; c-file-style: "stroustrup" -*- *****************************
3
* Copyright (C) 1997 Josef Wilgen
4
* Copyright (C) 2002 Uwe Rathmann
6
* This library is free software; you can redistribute it and/or
7
* modify it under the terms of the Qwt License, Version 1.0
8
*****************************************************************************/
12
#include "qwt_painter.h"
14
#include "qwt_scale_map.h"
15
#include "qwt_scale_div.h"
16
#include "qwt_plot_grid.h"
18
class QwtPlotGrid::PrivateData
34
QwtScaleDiv xScaleDiv;
35
QwtScaleDiv yScaleDiv;
41
//! Enables major grid, disables minor grid
42
QwtPlotGrid::QwtPlotGrid():
43
QwtPlotItem(QwtText("Grid"))
45
d_data = new PrivateData;
50
QwtPlotGrid::~QwtPlotGrid()
55
//! \return QwtPlotItem::Rtti_PlotGrid
56
int QwtPlotGrid::rtti() const
58
return QwtPlotItem::Rtti_PlotGrid;
62
\brief Enable or disable vertical gridlines
63
\param tf Enable (true) or disable
65
\sa Minor gridlines can be enabled or disabled with
68
void QwtPlotGrid::enableX(bool tf)
70
if ( d_data->xEnabled != tf )
72
d_data->xEnabled = tf;
78
\brief Enable or disable horizontal gridlines
79
\param tf Enable (true) or disable
80
\sa Minor gridlines can be enabled or disabled with enableYMin()
82
void QwtPlotGrid::enableY(bool tf)
84
if ( d_data->yEnabled != tf )
86
d_data->yEnabled = tf;
92
\brief Enable or disable minor vertical gridlines.
93
\param tf Enable (true) or disable
96
void QwtPlotGrid::enableXMin(bool tf)
98
if ( d_data->xMinEnabled != tf )
100
d_data->xMinEnabled = tf;
106
\brief Enable or disable minor horizontal gridlines
107
\param tf Enable (true) or disable
110
void QwtPlotGrid::enableYMin(bool tf)
112
if ( d_data->yMinEnabled != tf )
114
d_data->yMinEnabled = tf;
120
\brief Assign an x axis scale division
121
\param scaleDiv Scale division
122
\warning QwtPlotGrid uses implicit sharing (see Qt Manual) for
125
void QwtPlotGrid::setXDiv(const QwtScaleDiv &scaleDiv)
127
if ( d_data->xScaleDiv != scaleDiv )
129
d_data->xScaleDiv = scaleDiv;
135
\brief Assign a y axis division
136
\param sy Scale division
137
\warning QwtPlotGrid uses implicit sharing (see Qt Manual) for
140
void QwtPlotGrid::setYDiv(const QwtScaleDiv &sy)
142
if ( d_data->yScaleDiv != sy )
144
d_data->yScaleDiv = sy;
150
\brief Assign a pen for both major and minor gridlines
152
\sa setMajPen(), setMinPen()
154
void QwtPlotGrid::setPen(const QPen &p)
156
if ( d_data->majPen != p || d_data->minPen != p )
165
\brief Assign a pen for the major gridlines
167
\sa majPen(), setMinPen(), setPen()
169
void QwtPlotGrid::setMajPen(const QPen &p)
171
if ( d_data->majPen != p )
179
\brief Assign a pen for the minor gridlines
182
void QwtPlotGrid::setMinPen(const QPen &p)
184
if ( d_data->minPen != p )
194
The grid is drawn into the bounding rectangle such that
195
gridlines begin and end at the rectangle's borders. The X and Y
196
maps are used to map the scale divisions into the drawing region
198
\param painter Painter
199
\param xMap X axis map
201
\param canvasRect Contents rect of the plot canvas
203
void QwtPlotGrid::draw(QPainter *painter,
204
const QwtScaleMap &xMap, const QwtScaleMap &yMap,
205
const QRect &canvasRect) const
207
// draw minor gridlines
208
painter->setPen(d_data->minPen);
210
if (d_data->xEnabled && d_data->xMinEnabled)
212
drawLines(painter, canvasRect, Qt::Vertical, xMap,
213
d_data->xScaleDiv.ticks(QwtScaleDiv::MinorTick));
214
drawLines(painter, canvasRect, Qt::Vertical, xMap,
215
d_data->xScaleDiv.ticks(QwtScaleDiv::MediumTick));
218
if (d_data->yEnabled && d_data->yMinEnabled)
220
drawLines(painter, canvasRect, Qt::Horizontal, yMap,
221
d_data->yScaleDiv.ticks(QwtScaleDiv::MinorTick));
222
drawLines(painter, canvasRect, Qt::Horizontal, yMap,
223
d_data->yScaleDiv.ticks(QwtScaleDiv::MediumTick));
226
// draw major gridlines
227
painter->setPen(d_data->majPen);
229
if (d_data->xEnabled)
231
drawLines(painter, canvasRect, Qt::Vertical, xMap,
232
d_data->xScaleDiv.ticks(QwtScaleDiv::MajorTick));
235
if (d_data->yEnabled)
237
drawLines(painter, canvasRect, Qt::Horizontal, yMap,
238
d_data->yScaleDiv.ticks(QwtScaleDiv::MajorTick));
242
void QwtPlotGrid::drawLines(QPainter *painter, const QRect &canvasRect,
243
Qt::Orientation orientation, const QwtScaleMap &scaleMap,
244
const QwtValueList &values) const
246
const int x1 = canvasRect.left();
247
const int x2 = canvasRect.right();
248
const int y1 = canvasRect.top();
249
const int y2 = canvasRect.bottom();
251
for (uint i = 0; i < (uint)values.count(); i++)
253
const int value = scaleMap.transform(values[i]);
254
if ( orientation == Qt::Horizontal )
256
if ((value >= y1) && (value <= y2))
257
QwtPainter::drawLine(painter, x1, value, x2, value);
261
if ((value >= x1) && (value <= x2))
262
QwtPainter::drawLine(painter, value, y1, value, y2);
268
\return the pen for the major gridlines
269
\sa setMajPen(), setMinPen(), setPen()
271
const QPen &QwtPlotGrid::majPen() const
273
return d_data->majPen;
277
\return the pen for the minor gridlines
278
\sa setMinPen(), setMajPen(), setPen()
280
const QPen &QwtPlotGrid::minPen() const
282
return d_data->minPen;
286
\return true if vertical gridlines are enabled
289
bool QwtPlotGrid::xEnabled() const
291
return d_data->xEnabled;
295
\return true if minor vertical gridlines are enabled
298
bool QwtPlotGrid::xMinEnabled() const
300
return d_data->xMinEnabled;
304
\return true if horizontal gridlines are enabled
307
bool QwtPlotGrid::yEnabled() const
309
return d_data->yEnabled;
313
\return true if minor horizontal gridlines are enabled
316
bool QwtPlotGrid::yMinEnabled() const
318
return d_data->yMinEnabled;
322
/*! \return the scale division of the x axis */
323
const QwtScaleDiv &QwtPlotGrid::xScaleDiv() const
325
return d_data->xScaleDiv;
328
/*! \return the scale division of the y axis */
329
const QwtScaleDiv &QwtPlotGrid::yScaleDiv() const
331
return d_data->yScaleDiv;
334
void QwtPlotGrid::updateScaleDiv(const QwtScaleDiv& xDiv,
335
const QwtScaleDiv& yDiv)