From d4f10f9fe446da2aff65088e5236d6ffcdd034b5 Mon Sep 17 00:00:00 2001 From: Simon Rettberg Date: Fri, 24 Feb 2017 12:33:55 +0100 Subject: initial commit --- src/graphwidget.cpp | 95 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 src/graphwidget.cpp (limited to 'src/graphwidget.cpp') diff --git a/src/graphwidget.cpp b/src/graphwidget.cpp new file mode 100644 index 0000000..ec15026 --- /dev/null +++ b/src/graphwidget.cpp @@ -0,0 +1,95 @@ +#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(); +} -- cgit v1.2.3-55-g7522