#include "graphwidget.h" #include "datasource/idatasource.h" #include #include #include #include const QColor GraphWidget::LINE_COLOR = QColor::fromRgb(20, 255, 80); const QColor GraphWidget::BACK_COLOR = QColor::fromRgb(10, 0, 20); const QColor GraphWidget::BAR_COLOR = QColor::fromRgb(200, 200, 200); GraphWidget::GraphWidget(QWidget* parent) : QWidget(parent), _source(NULL), _histPos(0), _vScale(0), _doubleSpace(false) { memset(_history, 0, sizeof(*_history) * HISTSIZE); } GraphWidget::~GraphWidget() { delete _source; } void GraphWidget::setDataSource(IDataSource* source) { delete _source; _source = source; memset(_history, 0, sizeof(*_history) * HISTSIZE); _vScale = (float)height() / (float)_source->getMaximum(); qDebug() << "sDS " << _vScale; update(); } void GraphWidget::readNextValue() { if (_source == NULL) return; // _history[_histPos] = _source->read(); _histPos = (_histPos + 1) % HISTSIZE; if (_doubleSpace && _histPos % 2 == 1) { _history[_histPos] = _history[(_histPos + HISTSIZE - 1) % HISTSIZE]; update(_updateRectSmall); } else { update(); } } void GraphWidget::resizeEvent(QResizeEvent * event) { const QSize &size = event->size(); _updateRectSmall = QRect(size.width() - 1, 0, 1, size.height()); if (_source != NULL) { _vScale = (float)size.height() / (float)_source->getMaximum(); } _doubleSpace = (width() < 400); update(); } void GraphWidget::paintEvent(QPaintEvent * event) { qint64 value; int x, y; const QRect &rect = event->rect(); QPainter painter; painter.begin(this); painter.fillRect(rect, BACK_COLOR); if (_source == NULL) return; painter.setPen(LINE_COLOR); const int offset = HISTSIZE + HISTSIZE + _histPos - (this->width() - rect.x()) * (_doubleSpace ? 2 : 1); // TODO: double space for (int index = 0; index < rect.width(); ++index) { x = rect.x() + index; if (_doubleSpace) { value = (_history[(offset + index * 2) % HISTSIZE] + _history[(offset + index * 2 + 1) % HISTSIZE]) / 2; } else { value = _history[(offset + index) % HISTSIZE]; } y = height() - int(value * _vScale); painter.drawLine(x, y, x, height()); } const QList &bars = _source->getBars(); if (!bars.empty()) { painter.setPen(BAR_COLOR); for (QList::const_iterator it = bars.begin(); it != bars.end(); ++it) { y = height() - int(*it * _vScale); painter.drawLine(rect.left(), y, rect.right() + 1, y); } } painter.end(); }