@@ -36,12 +36,13 @@ Plot::Plot(QWidget* parent) :
zoomer(this->canvas(), false),
sZoomer(this, &zoomer)
{
isAutoScaled = true;
symbolSize = 0;
numOfSamples = 1;
showSymbols = ShowSymbolsAuto;
QObject::connect(&zoomer, &Zoomer::unzoomed, this, &Plot::unzoomed);
zoomer.setZoomBase();
grid.attach(this);
legend.attach(this);
@@ -244,14 +245,44 @@ void Plot::flashSnapshotOverlay(bool lig
delete snapshotOverlay;
snapshotOverlay = NULL;
});
}
void Plot::setSymbols(ShowSymbols shown)
showSymbols = shown;
if (showSymbols == ShowSymbolsAuto)
calcSymbolSize();
else if (showSymbols == ShowSymbolsAlways)
symbolSize = SYMBOL_SIZE_MAX;
else
updateSymbols();
replot();
void Plot::onXScaleChanged()
void Plot::calcSymbolSize()
auto sw = axisWidget(QwtPlot::xBottom);
auto paintDist = sw->scaleDraw()->scaleMap().pDist();
auto scaleDist = sw->scaleDraw()->scaleMap().sDist();
auto fullScaleDist = zoomer.zoomBase().width();
auto zoomRate = fullScaleDist / scaleDist;
float samplesInView = numOfSamples / zoomRate;
@@ -262,14 +293,12 @@ void Plot::onXScaleChanged()
symbolSize = std::min(SYMBOL_SIZE_MAX, symDisPx-SYMBOL_SHOW_AT_WIDTH+1);
void Plot::updateSymbols()
const QwtPlotItemList curves = itemList( QwtPlotItem::Rtti_PlotCurve );
@@ -294,11 +323,11 @@ void Plot::updateSymbols()
void Plot::resizeEvent(QResizeEvent * event)
QwtPlot::resizeEvent(event);
onXScaleChanged();
void Plot::onNumOfSamplesChanged(unsigned value)
void Plot::setNumOfSamples(unsigned value)
numOfSamples = value;
@@ -30,12 +30,19 @@
#include <qwt_plot_textlabel.h>
#include "zoomer.h"
#include "scalezoomer.h"
#include "plotsnapshotoverlay.h"
enum ShowSymbols
ShowSymbolsAuto,
ShowSymbolsAlways,
ShowSymbolsNever
};
class Plot : public QwtPlot
Q_OBJECT
friend class PlotManager;
@@ -51,21 +58,22 @@ public slots:
void showLegend(bool show = true);
void showDemoIndicator(bool show = true);
void unzoom();
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.
*
* @param light show a light colored (white) animation or the opposite
*/
void flashSnapshotOverlay(bool light);
void onNumOfSamplesChanged(unsigned value);
void setNumOfSamples(unsigned value);
protected:
/// update the display of symbols depending on `symbolSize`
void updateSymbols();
private:
@@ -77,15 +85,17 @@ private:
Zoomer zoomer;
ScaleZoomer sZoomer;
QwtPlotGrid grid;
PlotSnapshotOverlay* snapshotOverlay;
QwtPlotLegendItem legend;
QwtPlotTextLabel demoIndicator;
ShowSymbols showSymbols;
void resetAxes();
void resizeEvent(QResizeEvent * event);
void calcSymbolSize();
private slots:
void unzoomed();
void onXScaleChanged();
@@ -14,12 +14,13 @@
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with serialplot. If not, see <http://www.gnu.org/licenses/>.
#include <QActionGroup>
#include "qwt_symbol.h"
#include "plot.h"
#include "plotmanager.h"
#include "utils.h"
#include "setting_defines.h"
@@ -29,20 +30,22 @@ PlotManager::PlotManager(QWidget* plotAr
_plotArea(plotArea),
showGridAction("&Grid", this),
showMinorGridAction("&Minor Grid", this),
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;
_yMax = 1;
isDemoShown = false;
_infoModel = infoModel;
_numOfSamples = 1;
// initalize layout and single widget
isMulti = false;
scrollArea = NULL;
setupLayout(isMulti);
addPlotWidget();
@@ -51,12 +54,13 @@ PlotManager::PlotManager(QWidget* plotAr
showGridAction.setToolTip("Show Grid");
showMinorGridAction.setToolTip("Show Minor Grid");
unzoomAction.setToolTip("Unzoom the Plot");
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"));
showGridAction.setCheckable(true);
showMinorGridAction.setCheckable(true);
@@ -69,12 +73,43 @@ PlotManager::PlotManager(QWidget* plotAr
darkBackgroundAction.setChecked(false);
showLegendAction.setChecked(true);
showMultiAction.setChecked(false);
showMinorGridAction.setEnabled(false);
// setup symbols menu
auto setSymbolAutoAct = setSymbolsMenu.addAction("Show When Zoomed");
setSymbolAutoAct->setCheckable(true);
setSymbolAutoAct->setChecked(true);
connect(setSymbolAutoAct, SELECT<bool>::OVERLOAD_OF(&QAction::triggered),
[this](bool checked)
if (checked) setSymbols(ShowSymbolsAuto);
auto setSymbolAlwaysAct = setSymbolsMenu.addAction("Always Show");
setSymbolAlwaysAct->setCheckable(true);
connect(setSymbolAlwaysAct, SELECT<bool>::OVERLOAD_OF(&QAction::triggered),
if (checked) setSymbols(ShowSymbolsAlways);
auto setSymbolHideAct = setSymbolsMenu.addAction("Always Hide");
setSymbolHideAct->setCheckable(true);
connect(setSymbolHideAct, SELECT<bool>::OVERLOAD_OF(&QAction::triggered),
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<bool>::OVERLOAD_OF(&QAction::triggered),
this, &PlotManager::showGrid);
&showMinorGridAction, &QAction::setEnabled);
connect(&showMinorGridAction, SELECT<bool>::OVERLOAD_OF(&QAction::triggered),
this, &PlotManager::showMinorGrid);
@@ -249,12 +284,14 @@ Plot* PlotManager::addPlotWidget()
plot->darkBackground(darkBackgroundAction.isChecked());
plot->showGrid(showGridAction.isChecked());
plot->showMinorGrid(showMinorGridAction.isChecked());
plot->showLegend(showLegendAction.isChecked());
plot->showDemoIndicator(isDemoShown);
plot->setYAxis(_autoScaled, _yMin, _yMax);
plot->setNumOfSamples(_numOfSamples);
plot->setSymbols(showSymbols);
if (_xAxisAsIndex)
plot->setXAxis(0, _numOfSamples);
@@ -360,12 +397,13 @@ QList<QAction*> PlotManager::menuActions
actions << &showGridAction;
actions << &showMinorGridAction;
actions << &unzoomAction;
actions << &darkBackgroundAction;
actions << &showLegendAction;
actions << &showMultiAction;
actions << &setSymbolsAction;
return actions;
void PlotManager::showGrid(bool show)
for (auto plot : plotWidgets)
@@ -412,12 +450,21 @@ void PlotManager::darkBackground(bool en
plot->darkBackground(enabled);
void PlotManager::setSymbols(ShowSymbols shown)
plot->setSymbols(shown);
void PlotManager::setYAxis(bool autoScaled, double yAxisMin, double yAxisMax)
_autoScaled = autoScaled;
_yMin = yAxisMin;
_yMax = yAxisMax;
@@ -461,13 +508,13 @@ void PlotManager::flashSnapshotOverlay()
void PlotManager::onNumOfSamplesChanged(unsigned value)
_numOfSamples = value;
plot->onNumOfSamplesChanged(value);
plot->setNumOfSamples(value);
if (_xAxisAsIndex) plot->setXAxis(0, value);
void PlotManager::saveSettings(QSettings* settings)
@@ -23,12 +23,14 @@
#include <QObject>
#include <QWidget>
#include <QScrollArea>
#include <QVBoxLayout>
#include <QList>
#include <QSettings>
#include <QAction>
#include <QMenu>
#include <qwt_plot_curve.h>
#include "framebufferseries.h"
#include "channelinfomodel.h"
@@ -86,28 +88,32 @@ private:
double _yMin;
double _yMax;
bool _xAxisAsIndex;
double _xMin;
double _xMax;
unsigned _numOfSamples;
// menu actions
QAction showGridAction;
QAction showMinorGridAction;
QAction unzoomAction;
QAction darkBackgroundAction;
QAction showLegendAction;
QAction showMultiAction;
QAction setSymbolsAction;
QMenu setSymbolsMenu;
void setupLayout(bool multiPlot);
/// Inserts a new plot widget to the current layout.
Plot* addPlotWidget();
/// Returns the plot widget that given curve is attached to
Plot* plotWidget(unsigned curveIndex);
/// Common part of overloaded `addCurve` functions
void _addCurve(QwtPlotCurve* curve);
void showGrid(bool show = true);
void showMinorGrid(bool show = true);
Status change: