diff --git a/CMakeLists.txt b/CMakeLists.txt --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -90,6 +90,7 @@ add_executable(${PROGRAM_NAME} WIN32 src/tooltipfilter.cpp src/sneakylineedit.cpp src/channelmanager.cpp + src/framebufferseries.cpp misc/windows_icon.rc ${UI_FILES} ${RES_FILES} diff --git a/serialplot.pro b/serialplot.pro --- a/serialplot.pro +++ b/serialplot.pro @@ -53,7 +53,8 @@ SOURCES += \ src/dataformatpanel.cpp \ src/tooltipfilter.cpp \ src/sneakylineedit.cpp \ - src/channelmanager.cpp + src/channelmanager.cpp \ + src/framebufferseries.cpp HEADERS += \ src/mainwindow.h \ @@ -77,7 +78,8 @@ HEADERS += \ src/dataformatpanel.h \ src/tooltipfilter.h \ src/sneakylineedit.h \ - src/channelmanager.h + src/channelmanager.h \ + src/framebufferseries.h FORMS += \ src/mainwindow.ui \ diff --git a/src/channelmanager.cpp b/src/channelmanager.cpp --- a/src/channelmanager.cpp +++ b/src/channelmanager.cpp @@ -34,11 +34,6 @@ ChannelManager::ChannelManager(unsigned { channelBuffers.append(new FrameBuffer(numberOfSamples)); channelNamesList << QString("Channel %1").arg(i+1); - - // curves.append(new QwtPlotCurve(QString("Channel %1").arg(i+1))); - // curves[i]->setSamples(channelBuffers[i]); - // curves[i]->setPen(Plot::makeColor(i)); - // curves[i]->attach(ui->plot); } _channelNames.setStringList(channelNamesList); @@ -49,7 +44,10 @@ ChannelManager::ChannelManager(unsigned ChannelManager::~ChannelManager() { - // TODO: remove all channelBuffers + for (auto buffer : channelBuffers) + { + delete buffer; + } } unsigned ChannelManager::numOfChannels() @@ -80,10 +78,7 @@ void ChannelManager::setNumOfChannels(un // remove channels for (unsigned int i = oldNum-1; i > number-1; i--) { - // also deletes owned FrameBuffer - // delete curves.takeLast(); - // TODO: important, remove channelBuffer - channelBuffers.removeLast(); + delete channelBuffers.takeLast(); _channelNames.removeRow(i); } } @@ -133,6 +128,7 @@ void ChannelManager::onChannelNameDataCh const QModelIndex & bottomRight, const QVector & roles) { + Q_UNUSED(roles); int start = topLeft.row(); int end = bottomRight.row(); diff --git a/src/channelmanager.h b/src/channelmanager.h --- a/src/channelmanager.h +++ b/src/channelmanager.h @@ -57,7 +57,7 @@ private: QList channelBuffers; QStringListModel _channelNames; - void addChannelName(QString name); /// appends a new channel name at the end of list + void addChannelName(QString name); ///< appends a new channel name at the end of list private slots: void onChannelNameDataChange(const QModelIndex & topLeft, diff --git a/src/dataformatpanel.cpp b/src/dataformatpanel.cpp --- a/src/dataformatpanel.cpp +++ b/src/dataformatpanel.cpp @@ -21,6 +21,7 @@ #include "ui_dataformatpanel.h" #include +#include #include "utils.h" #include "floatswap.h" diff --git a/src/framebuffer.h b/src/framebuffer.h --- a/src/framebuffer.h +++ b/src/framebuffer.h @@ -20,11 +20,10 @@ #ifndef FRAMEBUFFER_H #define FRAMEBUFFER_H -#include #include #include -class FrameBuffer : public QwtSeriesData +class FrameBuffer { public: FrameBuffer(size_t size); diff --git a/src/framebufferseries.cpp b/src/framebufferseries.cpp new file mode 100644 --- /dev/null +++ b/src/framebufferseries.cpp @@ -0,0 +1,22 @@ + +#include "framebufferseries.h" + +FrameBufferSeries::FrameBufferSeries(FrameBuffer* buffer) +{ + _buffer = buffer; +} + +size_t FrameBufferSeries::size() const +{ + return _buffer->size(); +} + +QPointF FrameBufferSeries::sample(size_t i) const +{ + return _buffer->sample(i); +} + +QRectF FrameBufferSeries::boundingRect() const +{ + return _buffer->boundingRect(); +} diff --git a/src/framebufferseries.h b/src/framebufferseries.h new file mode 100644 --- /dev/null +++ b/src/framebufferseries.h @@ -0,0 +1,31 @@ + +#ifndef FRAMEBUFFERSERIES_H +#define FRAMEBUFFERSERIES_H + +#include +#include +#include + +#include "framebuffer.h" + +/** + * This class provides an interface for actual FrameBuffer + * object. That way we can keep our data structures relatively + * isolated from Qwt. Otherwise QwtPlotCurve owns FrameBuffer + * structures. + */ +class FrameBufferSeries : public QwtSeriesData +{ +public: + FrameBufferSeries(FrameBuffer* buffer); + + // QwtSeriesData implementations + size_t size() const; + QPointF sample(size_t i) const; + QRectF boundingRect() const; + +private: + FrameBuffer* _buffer; +}; + +#endif // FRAMEBUFFERSERIES_H diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -31,11 +31,9 @@ #include #include -// test code -#include - #include +#include "framebufferseries.h" #include "utils.h" #include "version.h" @@ -170,7 +168,8 @@ MainWindow::MainWindow(QWidget *parent) for (unsigned int i = 0; i < numOfChannels; i++) { curves.append(new QwtPlotCurve(channelMan.channelName(i))); - curves[i]->setSamples(channelMan.channelBuffer(i)); + curves[i]->setSamples( + new FrameBufferSeries(channelMan.channelBuffer(i))); curves[i]->setPen(Plot::makeColor(i)); curves[i]->attach(ui->plot); } @@ -351,10 +350,8 @@ void MainWindow::onNumOfChannelsChanged( for (unsigned int i = oldNum; i < numOfChannels; i++) { QwtPlotCurve* curve = new QwtPlotCurve(channelMan.channelName(i)); - // TODO: create a wrapper around FrameBuffer that holds a - // pointer to it and provides the QwtDataSeries interface, - // that wrapper should be created for and owned by 'curve' - curve->setSamples(channelMan.channelBuffer(i)); + curve->setSamples( + new FrameBufferSeries(channelMan.channelBuffer(i))); curve->setPen(Plot::makeColor(i)); curve->attach(ui->plot); curves.append(curve); @@ -365,7 +362,6 @@ void MainWindow::onNumOfChannelsChanged( // remove channels for (unsigned int i = 0; i < oldNum - numOfChannels; i++) { - // also deletes owned FrameBuffer TODO: which souldn't happen delete curves.takeLast(); } } diff --git a/src/snapshotmanager.cpp b/src/snapshotmanager.cpp --- a/src/snapshotmanager.cpp +++ b/src/snapshotmanager.cpp @@ -24,6 +24,7 @@ #include #include #include +#include #include "snapshotmanager.h"