diff --git a/plot.cpp b/plot.cpp --- a/plot.cpp +++ b/plot.cpp @@ -18,13 +18,21 @@ */ #include +#include + #include "plot.h" +#include "utils.h" + Plot::Plot(QWidget* parent) : QwtPlot(parent), zoomer(this->canvas(), false), - sZoomer(this, &zoomer) + sZoomer(this, &zoomer), + _showGridAction("Grid", this), + _showMinorGridAction("Minor Grid", this), + _unzoomAction("Unzoom", this), + _darkBackgroundAction("Dark Background", this) { - isAutoScaled = false; + isAutoScaled = true; QObject::connect(&zoomer, &Zoomer::unzoomed, this, &Plot::unzoomed); @@ -34,7 +42,43 @@ Plot::Plot(QWidget* parent) : rectItem.setRect(QRectF(0,0,100,1)); // rectItem.attach(this); + showGrid(false); darkBackground(false); + + _showGridAction.setToolTip("Show Grid"); + _showMinorGridAction.setToolTip("Show Minor Grid"); + _unzoomAction.setToolTip("Unzoom the Plot"); + _darkBackgroundAction.setToolTip("Enable Dark Plot Background"); + + _showGridAction.setShortcut(QKeySequence("G")); + _showMinorGridAction.setShortcut(QKeySequence("M")); + + _showGridAction.setCheckable(true); + _showMinorGridAction.setCheckable(true); + _darkBackgroundAction.setCheckable(true); + + _showGridAction.setChecked(false); + _showMinorGridAction.setChecked(false); + _darkBackgroundAction.setChecked(false); + + _showMinorGridAction.setEnabled(false); + + connect(&_showGridAction, SELECT::OVERLOAD_OF(&QAction::triggered), + this, &Plot::showGrid); + connect(&_showGridAction, SELECT::OVERLOAD_OF(&QAction::triggered), + &_showMinorGridAction, &QAction::setEnabled); + connect(&_showMinorGridAction, SELECT::OVERLOAD_OF(&QAction::triggered), + this, &Plot::showMinorGrid); + connect(&_unzoomAction, &QAction::triggered, this, &Plot::unzoom); + connect(&_darkBackgroundAction, SELECT::OVERLOAD_OF(&QAction::triggered), + this, &Plot::darkBackground); + + snapshotOverlay = NULL; +} + +Plot::~Plot() +{ + if (snapshotOverlay != NULL) delete snapshotOverlay; } void Plot::setAxis(bool autoScaled, double yAxisMin, double yAxisMax) @@ -51,6 +95,16 @@ void Plot::setAxis(bool autoScaled, doub resetAxes(); } +QList Plot::menuActions() +{ + QList actions; + actions << &_showGridAction; + actions << &_showMinorGridAction; + actions << &_unzoomAction; + actions << &_darkBackgroundAction; + return actions; +} + void Plot::resetAxes() { if (isAutoScaled) @@ -110,3 +164,56 @@ void Plot::darkBackground(bool enabled) } replot(); } + +/* + Below crude drawing demostrates how color selection occurs for + given channel index + + 0° <--Hue Value--> 360° + |* . o . + . o . * . o . + . o . * . o . + . o . * . o . + . o . | + + * -> 0-3 + + -> 4-7 + o -> 8-15 + . -> 16-31 + + */ +QColor Plot::makeColor(unsigned int channelIndex) +{ + auto i = channelIndex; + + if (i < 4) + { + return QColor::fromHsv(360*i/4, 255, 230); + } + else + { + double p = floor(log2(i)); + double n = pow(2, p); + i = i - n; + return QColor::fromHsv(360*i/n + 360/pow(2,p+1), 255, 230); + } +} + +void Plot::flashSnapshotOverlay() +{ + if (snapshotOverlay != NULL) delete snapshotOverlay; + + QColor color; + if (_darkBackgroundAction.isChecked()) + { + color = QColor(Qt::white); + } + else + { + color = QColor(Qt::black); + } + + snapshotOverlay = new PlotSnapshotOverlay(this->canvas(), color); + connect(snapshotOverlay, &PlotSnapshotOverlay::done, + [this]() + { + delete snapshotOverlay; + snapshotOverlay = NULL; + }); +}