diff --git a/src/plot.cpp b/src/plot.cpp --- a/src/plot.cpp +++ b/src/plot.cpp @@ -39,6 +39,7 @@ Plot::Plot(QWidget* parent) : isAutoScaled = true; symbolSize = 0; numOfSamples = 1; + showSymbols = ShowSymbolsAuto; QObject::connect(&zoomer, &Zoomer::unzoomed, this, &Plot::unzoomed); @@ -247,8 +248,38 @@ void Plot::flashSnapshotOverlay(bool lig }); } +void Plot::setSymbols(ShowSymbols shown) +{ + showSymbols = shown; + + if (showSymbols == ShowSymbolsAuto) + { + calcSymbolSize(); + } + else if (showSymbols == ShowSymbolsAlways) + { + symbolSize = SYMBOL_SIZE_MAX; + } + else + { + symbolSize = 0; + } + + updateSymbols(); + replot(); +} + void Plot::onXScaleChanged() { + if (showSymbols == ShowSymbolsAuto) + { + calcSymbolSize(); + updateSymbols(); + } +} + +void Plot::calcSymbolSize() +{ auto sw = axisWidget(QwtPlot::xBottom); auto paintDist = sw->scaleDraw()->scaleMap().pDist(); auto scaleDist = sw->scaleDraw()->scaleMap().sDist(); @@ -265,8 +296,6 @@ void Plot::onXScaleChanged() { symbolSize = std::min(SYMBOL_SIZE_MAX, symDisPx-SYMBOL_SHOW_AT_WIDTH+1); } - - updateSymbols(); } void Plot::updateSymbols() @@ -297,7 +326,7 @@ void Plot::resizeEvent(QResizeEvent * ev onXScaleChanged(); } -void Plot::onNumOfSamplesChanged(unsigned value) +void Plot::setNumOfSamples(unsigned value) { numOfSamples = value; onXScaleChanged(); diff --git a/src/plot.h b/src/plot.h --- a/src/plot.h +++ b/src/plot.h @@ -33,6 +33,13 @@ #include "scalezoomer.h" #include "plotsnapshotoverlay.h" +enum ShowSymbols +{ + ShowSymbolsAuto, + ShowSymbolsAlways, + ShowSymbolsNever +}; + class Plot : public QwtPlot { Q_OBJECT @@ -54,6 +61,7 @@ public slots: void darkBackground(bool enabled = true); void setYAxis(bool autoScaled, double yMin = 0, double yMax = 1); void setXAxis(double xMin, double xMax); + void setSymbols(ShowSymbols shown); /** * Displays an animation for snapshot. @@ -62,7 +70,7 @@ public slots: */ void flashSnapshotOverlay(bool light); - void onNumOfSamplesChanged(unsigned value); + void setNumOfSamples(unsigned value); protected: /// update the display of symbols depending on `symbolSize` @@ -80,9 +88,11 @@ private: PlotSnapshotOverlay* snapshotOverlay; QwtPlotLegendItem legend; QwtPlotTextLabel demoIndicator; + ShowSymbols showSymbols; void resetAxes(); void resizeEvent(QResizeEvent * event); + void calcSymbolSize(); private slots: void unzoomed(); diff --git a/src/plotmanager.cpp b/src/plotmanager.cpp --- a/src/plotmanager.cpp +++ b/src/plotmanager.cpp @@ -17,6 +17,7 @@ along with serialplot. If not, see . */ +#include #include "qwt_symbol.h" #include "plot.h" @@ -32,7 +33,8 @@ PlotManager::PlotManager(QWidget* plotAr unzoomAction("&Unzoom", this), darkBackgroundAction("&Dark Background", this), showLegendAction("&Legend", this), - showMultiAction("Multi &Plot", this) + showMultiAction("Multi &Plot", this), + setSymbolsAction("Symbols", this) { _autoScaled = true; _yMin = 0; @@ -40,6 +42,7 @@ PlotManager::PlotManager(QWidget* plotAr isDemoShown = false; _infoModel = infoModel; _numOfSamples = 1; + showSymbols = ShowSymbolsAuto; // initalize layout and single widget isMulti = false; @@ -54,6 +57,7 @@ PlotManager::PlotManager(QWidget* plotAr darkBackgroundAction.setToolTip("Enable Dark Plot Background"); showLegendAction.setToolTip("Display the Legend on Plot"); showMultiAction.setToolTip("Display All Channels Separately"); + setSymbolsAction.setToolTip("Show/Hide symbols"); showGridAction.setShortcut(QKeySequence("G")); showMinorGridAction.setShortcut(QKeySequence("M")); @@ -72,6 +76,37 @@ PlotManager::PlotManager(QWidget* plotAr showMinorGridAction.setEnabled(false); + // setup symbols menu + auto setSymbolAutoAct = setSymbolsMenu.addAction("Show When Zoomed"); + setSymbolAutoAct->setCheckable(true); + setSymbolAutoAct->setChecked(true); + connect(setSymbolAutoAct, SELECT::OVERLOAD_OF(&QAction::triggered), + [this](bool checked) + { + if (checked) setSymbols(ShowSymbolsAuto); + }); + auto setSymbolAlwaysAct = setSymbolsMenu.addAction("Always Show"); + setSymbolAlwaysAct->setCheckable(true); + connect(setSymbolAlwaysAct, SELECT::OVERLOAD_OF(&QAction::triggered), + [this](bool checked) + { + if (checked) setSymbols(ShowSymbolsAlways); + }); + auto setSymbolHideAct = setSymbolsMenu.addAction("Always Hide"); + setSymbolHideAct->setCheckable(true); + connect(setSymbolHideAct, SELECT::OVERLOAD_OF(&QAction::triggered), + [this](bool checked) + { + if (checked) setSymbols(ShowSymbolsNever); + }); + setSymbolsAction.setMenu(&setSymbolsMenu); + + // add symbol actions to same group so that they appear as radio buttons + auto group = new QActionGroup(this); + group->addAction(setSymbolAutoAct); + group->addAction(setSymbolAlwaysAct); + group->addAction(setSymbolHideAct); + connect(&showGridAction, SELECT::OVERLOAD_OF(&QAction::triggered), this, &PlotManager::showGrid); connect(&showGridAction, SELECT::OVERLOAD_OF(&QAction::triggered), @@ -252,6 +287,8 @@ Plot* PlotManager::addPlotWidget() plot->showLegend(showLegendAction.isChecked()); plot->showDemoIndicator(isDemoShown); plot->setYAxis(_autoScaled, _yMin, _yMax); + plot->setNumOfSamples(_numOfSamples); + plot->setSymbols(showSymbols); if (_xAxisAsIndex) { @@ -363,6 +400,7 @@ QList PlotManager::menuActions actions << &darkBackgroundAction; actions << &showLegendAction; actions << &showMultiAction; + actions << &setSymbolsAction; return actions; } @@ -415,6 +453,15 @@ void PlotManager::darkBackground(bool en } } +void PlotManager::setSymbols(ShowSymbols shown) +{ + showSymbols = shown; + for (auto plot : plotWidgets) + { + plot->setSymbols(shown); + } +} + void PlotManager::setYAxis(bool autoScaled, double yAxisMin, double yAxisMax) { _autoScaled = autoScaled; @@ -464,7 +511,7 @@ void PlotManager::onNumOfSamplesChanged( _numOfSamples = value; for (auto plot : plotWidgets) { - plot->onNumOfSamplesChanged(value); + plot->setNumOfSamples(value); if (_xAxisAsIndex) plot->setXAxis(0, value); } } diff --git a/src/plotmanager.h b/src/plotmanager.h --- a/src/plotmanager.h +++ b/src/plotmanager.h @@ -26,6 +26,8 @@ #include #include #include +#include +#include #include #include "plot.h" @@ -89,6 +91,7 @@ private: double _xMin; double _xMax; unsigned _numOfSamples; + ShowSymbols showSymbols; // menu actions QAction showGridAction; @@ -97,6 +100,8 @@ private: QAction darkBackgroundAction; QAction showLegendAction; QAction showMultiAction; + QAction setSymbolsAction; + QMenu setSymbolsMenu; void setupLayout(bool multiPlot); /// Inserts a new plot widget to the current layout. @@ -105,6 +110,7 @@ private: Plot* plotWidget(unsigned curveIndex); /// Common part of overloaded `addCurve` functions void _addCurve(QwtPlotCurve* curve); + void setSymbols(ShowSymbols shown); private slots: void showGrid(bool show = true);