49 #if QWT_VERSION < 0x060000 53 #include <qwt_interval_data.h> 54 #include <qwt_painter.h> 55 #include <qwt_scale_map.h> 56 #include "HistogramItem.hh" 58 class HistogramItem::PrivateData
63 std::vector< QColor > colors_;
74 QwtPlotItem(QwtText(title))
84 void HistogramItem::init()
86 d_data =
new PrivateData();
87 d_data->reference = 0.0;
88 d_data->attributes = HistogramItem::Auto;
90 setItemAttribute(QwtPlotItem::AutoScale,
true);
91 setItemAttribute(QwtPlotItem::Legend,
true);
96 void HistogramItem::setBaseline(
double reference)
98 if ( d_data->reference != reference )
100 d_data->reference = reference;
105 double HistogramItem::baseline()
const 107 return d_data->reference;
116 const QwtIntervalData &HistogramItem::data()
const 123 d_data->colors_ = _colors;
127 QColor HistogramItem::color(uint i)
const 129 if ( i < d_data->colors_.size() )
130 return d_data->colors_[i];
137 QwtDoubleRect rect = d_data->data.boundingRect();
138 if ( !rect.isValid() )
141 if ( d_data->attributes & Xfy )
143 rect = QwtDoubleRect( rect.y(), rect.x(), rect.height(), rect.width() );
145 if ( rect.left() > d_data->reference )
146 rect.setLeft( d_data->reference );
147 else if ( rect.right() < d_data->reference )
148 rect.setRight( d_data->reference );
152 if ( rect.bottom() < d_data->reference )
153 rect.setBottom( d_data->reference );
154 else if ( rect.top() > d_data->reference )
155 rect.setTop( d_data->reference );
162 int HistogramItem::rtti()
const 164 return QwtPlotItem::Rtti_PlotHistogram;
167 void HistogramItem::setHistogramAttribute(HistogramAttribute attribute,
bool on)
169 if (
bool(d_data->attributes & attribute) == on )
173 d_data->attributes |= attribute;
175 d_data->attributes &= ~attribute;
180 bool HistogramItem::testHistogramAttribute(HistogramAttribute attribute)
const 182 return d_data->attributes & attribute;
186 const QwtScaleMap &yMap,
const QRect &)
const 188 const QwtIntervalData &iData = d_data->data;
190 const int x0 = xMap.transform(baseline());
191 const int y0 = yMap.transform(baseline());
193 for (
int i = 0; i < (int)iData.size(); i++ )
195 if ( d_data->attributes & HistogramItem::Xfy )
197 const int x2 = xMap.transform(iData.value(i));
201 int y1 = yMap.transform( iData.interval(i).minValue());
202 int y2 = yMap.transform( iData.interval(i).maxValue());
206 if ( i < (
int)iData.size() - 2 )
208 const int yy1 = yMap.transform(iData.interval(i+1).minValue());
209 const int yy2 = yMap.transform(iData.interval(i+1).maxValue());
211 if ( y2 == qwtMin(yy1, yy2) )
213 const int xx2 = xMap.transform(
214 iData.interval(i+1).minValue());
215 if ( xx2 != x0 && ( (xx2 < x0 && x2 < x0) ||
216 (xx2 > x0 && x2 > x0) ) )
224 painter->setPen( QPen( color(i) ) );
226 drawBar(painter, Qt::Horizontal,
227 QRect(x0, y1, x2 - x0, y2 - y1));
231 const int y2 = yMap.transform(iData.value(i));
235 int x1 = xMap.transform(iData.interval(i).minValue());
236 int x2 = xMap.transform(iData.interval(i).maxValue());
240 if ( i < (
int)iData.size() - 2 )
242 const int xx1 = xMap.transform(iData.interval(i+1).minValue());
243 const int xx2 = xMap.transform(iData.interval(i+1).maxValue());
245 if ( x2 == qwtMin(xx1, xx2) )
247 const int yy2 = yMap.transform(iData.value(i+1));
248 if ( yy2 != y0 && ( (yy2 < y0 && y2 < y0) || (yy2 > y0 && y2 > y0) ) )
256 painter->setPen( QPen( color(i) ) );
258 drawBar(painter, Qt::Vertical,
259 QRect(x1, y0, x2 - x1, y2 - y0) );
265 Qt::Orientation,
const QRect& rect)
const 269 const QColor color(painter->pen().color());
270 const QRect r = rect.normalized();
273 const int factor = 125;
274 const QColor light(color.light(factor));
275 const QColor dark(color.dark(factor));
277 painter->setBrush(color);
278 painter->setPen(Qt::NoPen);
279 QwtPainter::drawRect(painter, r.x() + 1, r.y() + 1,
280 r.width() - 2, r.height() - 2);
281 painter->setBrush(Qt::NoBrush);
283 painter->setPen(QPen(light, 2));
285 QwtPainter::drawLine(painter,
286 r.left() + 1, r.top() + 2, r.right() + 1, r.top() + 2);
288 painter->setPen(QPen(dark, 2));
290 QwtPainter::drawLine(painter,
291 r.left() + 1, r.bottom(), r.right() + 1, r.bottom());
293 painter->setPen(QPen(light, 1));
295 QwtPainter::drawLine(painter,
296 r.left(), r.top() + 1, r.left(), r.bottom());
297 QwtPainter::drawLine(painter,
298 r.left() + 1, r.top() + 2, r.left() + 1, r.bottom() - 1);
301 painter->setPen(QPen(dark, 1));
303 QwtPainter::drawLine(painter,
304 r.right() + 1, r.top() + 1, r.right() + 1, r.bottom());
305 QwtPainter::drawLine(painter,
306 r.right(), r.top() + 2, r.right(), r.bottom() - 1);
virtual void drawBar(QPainter *, Qt::Orientation o, const QRect &) const
Draws a single bar.
virtual ~HistogramItem()
Destructor.
void setData(const QwtIntervalData &data)
set data to render
virtual QwtDoubleRect boundingRect() const
Function hat will return the datas bounding rectangle (for rendering)
virtual void draw(QPainter *, const QwtScaleMap &xMap, const QwtScaleMap &yMap, const QRect &) const
The actual draw function, drawing the bars inside the plot widget.
void setColors(std::vector< QColor > &_colors)
Set colors.
HistogramItem(const QString &title=QString::null)
Constructor.