summaryrefslogtreecommitdiff
path: root/gr-qtgui/lib/DisplayPlot.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui/lib/DisplayPlot.cc')
-rw-r--r--gr-qtgui/lib/DisplayPlot.cc413
1 files changed, 413 insertions, 0 deletions
diff --git a/gr-qtgui/lib/DisplayPlot.cc b/gr-qtgui/lib/DisplayPlot.cc
new file mode 100644
index 0000000000..a91ac721f1
--- /dev/null
+++ b/gr-qtgui/lib/DisplayPlot.cc
@@ -0,0 +1,413 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2012 Free Software Foundation, Inc.
+ *
+ * This file is part of GNU Radio
+ *
+ * GNU Radio is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 3, or (at your option)
+ * any later version.
+ *
+ * GNU Radio is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with GNU Radio; see the file COPYING. If not, write to
+ * the Free Software Foundation, Inc., 51 Franklin Street,
+ * Boston, MA 02110-1301, USA.
+ */
+
+#include <DisplayPlot.h>
+
+#include <qwt_scale_draw.h>
+#include <qwt_legend.h>
+#include <QColor>
+#include <cmath>
+#include <iostream>
+#include <QDebug>
+
+DisplayPlot::DisplayPlot(int nplots, QWidget* parent)
+ : QwtPlot(parent), _nplots(nplots), _stop(false)
+{
+ qRegisterMetaType<QColorList>("QColorList");
+ resize(parent->width(), parent->height());
+
+ // Disable polygon clipping
+#if QWT_VERSION < 0x060000
+ QwtPainter::setDeviceClipping(false);
+#else
+ QwtPainter::setPolylineSplitting(false);
+#endif
+
+#if QWT_VERSION < 0x060000
+ // We don't need the cache here
+ canvas()->setPaintAttribute(QwtPlotCanvas::PaintCached, false);
+ canvas()->setPaintAttribute(QwtPlotCanvas::PaintPacked, false);
+#endif
+
+ QColor default_palette_color = QColor("white");
+ setPaletteColor(default_palette_color);
+
+ _panner = new QwtPlotPanner(canvas());
+ _panner->setAxisEnabled(QwtPlot::yRight, false);
+ _panner->setMouseButton(Qt::MidButton);
+
+ // emit the position of clicks on widget
+ _picker = new QwtDblClickPlotPicker(canvas());
+
+#if QWT_VERSION < 0x060000
+ connect(_picker, SIGNAL(selected(const QwtDoublePoint &)),
+ this, SLOT(OnPickerPointSelected(const QwtDoublePoint &)));
+#else
+ _picker->setStateMachine(new QwtPickerDblClickPointMachine());
+ connect(_picker, SIGNAL(selected(const QPointF &)),
+ this, SLOT(OnPickerPointSelected6(const QPointF &)));
+#endif
+
+ // Configure magnify on mouse wheel
+ _magnifier = new QwtPlotMagnifier(canvas());
+ _magnifier->setAxisEnabled(QwtPlot::xBottom, false);
+
+ // Avoid jumping when labels with more/less digits
+ // appear/disappear when scrolling vertically
+
+ const QFontMetrics fm(axisWidget(QwtPlot::yLeft)->font());
+ QwtScaleDraw *sd = axisScaleDraw(QwtPlot::yLeft);
+ sd->setMinimumExtent( fm.width("100.00") );
+
+ QwtLegend* legendDisplay = new QwtLegend(this);
+ legendDisplay->setItemMode(QwtLegend::CheckableItem);
+ insertLegend(legendDisplay);
+
+ connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool)),
+ this, SLOT(LegendEntryChecked(QwtPlotItem *, bool)));
+}
+
+DisplayPlot::~DisplayPlot()
+{
+ // _zoomer and _panner deleted when parent deleted
+}
+
+
+void
+DisplayPlot::setYaxis(double min, double max)
+{
+ setAxisScale(QwtPlot::yLeft, min, max);
+ _zoomer->setZoomBase();
+}
+
+void
+DisplayPlot::setXaxis(double min, double max)
+{
+ setAxisScale(QwtPlot::xBottom, min, max);
+ _zoomer->setZoomBase();
+}
+
+void
+DisplayPlot::setLineLabel(int which, QString label)
+{
+ _plot_curve[which]->setTitle(label);
+}
+
+QString
+DisplayPlot::lineLabel(int which)
+{
+ return _plot_curve[which]->title().text();
+}
+
+void
+DisplayPlot::setLineColor(int which, QColor color)
+{
+ if (which < _nplots) {
+ // Set the color of the pen
+ QPen pen(_plot_curve[which]->pen());
+ pen.setColor(color);
+ _plot_curve[which]->setPen(pen);
+ // And set the color of the markers
+#if QWT_VERSION < 0x060000
+ //_plot_curve[which]->setBrush(QBrush(QColor(color)));
+ _plot_curve[which]->setPen(pen);
+ QwtSymbol sym = (QwtSymbol)_plot_curve[which]->symbol();
+ setLineMarker(which, sym.style());
+#else
+ QwtSymbol *sym = (QwtSymbol*)_plot_curve[which]->symbol();
+ if(sym) {
+ sym->setColor(color);
+ sym->setPen(pen);
+ _plot_curve[which]->setSymbol(sym);
+ }
+#endif
+ }
+}
+
+QColor
+DisplayPlot::getLineColor(int which) const {
+ // If that plot doesn't exist then return black.
+ if (which < _nplots)
+ return _plot_curve[which]->pen().color();
+ return QColor("black");
+}
+
+// Use a preprocessor macro to create a bunch of hooks for Q_PROPERTY and hence the stylesheet.
+#define SETUPLINE(i, im1) \
+ void DisplayPlot::setLineColor ## i (QColor c) {setLineColor(im1, c);} \
+ const QColor DisplayPlot::getLineColor ## i () const {return getLineColor(im1);} \
+ void DisplayPlot::setLineWidth ## i (int width) {setLineWidth(im1, width);} \
+ int DisplayPlot::getLineWidth ## i () const {return getLineWidth(im1);} \
+ void DisplayPlot::setLineStyle ## i (Qt::PenStyle ps) {setLineStyle(im1, ps);} \
+ const Qt::PenStyle DisplayPlot::getLineStyle ## i () const {return getLineStyle(im1);} \
+ void DisplayPlot::setLineMarker ## i (QwtSymbol::Style ms) {setLineMarker(im1, ms);} \
+ const QwtSymbol::Style DisplayPlot::getLineMarker ## i () const {return getLineMarker(im1);} \
+ void DisplayPlot::setMarkerAlpha ## i (int alpha) {setMarkerAlpha(im1, alpha);} \
+ int DisplayPlot::getMarkerAlpha ## i () const {return getMarkerAlpha(im1);}
+SETUPLINE(1, 0)
+SETUPLINE(2, 1)
+SETUPLINE(3, 2)
+SETUPLINE(4, 3)
+SETUPLINE(5, 4)
+SETUPLINE(6, 5)
+SETUPLINE(7, 6)
+SETUPLINE(8, 7)
+SETUPLINE(9, 8)
+
+void
+DisplayPlot::setZoomerColor(QColor c) {
+ _zoomer->setRubberBandPen(c);
+ _zoomer->setTrackerPen(c);
+}
+
+QColor
+DisplayPlot::getZoomerColor() const {
+ return _zoomer->rubberBandPen().color();
+}
+
+void
+DisplayPlot::setPaletteColor(QColor c) {
+ QPalette palette;
+ palette.setColor(canvas()->backgroundRole(), c);
+ canvas()->setPalette(palette);
+}
+
+QColor
+DisplayPlot::getPaletteColor() const {
+ return canvas()->palette().color(canvas()->backgroundRole());
+}
+
+void
+DisplayPlot::setAxisLabelFontSize(int axisId, int fs) {
+ QwtText axis_title = QwtText(axisWidget(axisId)->title());
+ QFont font = QFont(axis_title.font());
+ font.setPointSize(fs);
+ axis_title.setFont(font);
+ axisWidget(axisId)->setTitle(axis_title);
+}
+
+int
+DisplayPlot::getAxisLabelFontSize(int axisId) const {
+ return axisWidget(axisId)->title().font().pointSize();
+}
+
+void
+DisplayPlot::setYaxisLabelFontSize(int fs) {
+ setAxisLabelFontSize(QwtPlot::yLeft, fs);
+}
+
+int
+DisplayPlot::getYaxisLabelFontSize() const {
+ int fs = getAxisLabelFontSize(QwtPlot::yLeft);
+ return fs;
+}
+
+void
+DisplayPlot::setXaxisLabelFontSize(int fs) {
+ setAxisLabelFontSize(QwtPlot::xBottom, fs);
+}
+
+int
+DisplayPlot::getXaxisLabelFontSize() const {
+ int fs = getAxisLabelFontSize(QwtPlot::xBottom);
+ return fs;
+}
+
+void
+DisplayPlot::setAxesLabelFontSize(int fs) {
+ setAxisLabelFontSize(QwtPlot::yLeft, fs);
+ setAxisLabelFontSize(QwtPlot::xBottom, fs);
+}
+
+int
+DisplayPlot::getAxesLabelFontSize() const {
+ // Returns 0 if all axes do not have the same font size.
+ int fs = getAxisLabelFontSize(QwtPlot::yLeft);
+ if (getAxisLabelFontSize(QwtPlot::xBottom) != fs)
+ return 0;
+ return fs;
+}
+
+void
+DisplayPlot::setLineWidth(int which, int width)
+{
+ if (which < _nplots) {
+ // Set the new line width
+ QPen pen(_plot_curve[which]->pen());
+ pen.setWidth(width);
+ _plot_curve[which]->setPen(pen);
+
+ // Scale the marker size proportionally
+#if QWT_VERSION < 0x060000
+ QwtSymbol sym = (QwtSymbol)_plot_curve[which]->symbol();
+ sym.setSize(7+10*log10(1.0*width), 7+10*log10(1.0*width));
+ _plot_curve[which]->setSymbol(sym);
+#else
+ QwtSymbol *sym = (QwtSymbol*)_plot_curve[which]->symbol();
+ if(sym) {
+ sym->setSize(7+10*log10(1.0*width), 7+10*log10(1.0*width));
+ _plot_curve[which]->setSymbol(sym);
+ }
+#endif
+ }
+}
+
+int
+DisplayPlot::getLineWidth(int which) const {
+ if (which < _nplots) {
+ return _plot_curve[which]->pen().width();
+ } else {
+ return 0;
+ }
+}
+
+void
+DisplayPlot::setLineStyle(int which, Qt::PenStyle style)
+{
+ if (which < _nplots) {
+ QPen pen(_plot_curve[which]->pen());
+ pen.setStyle(style);
+ _plot_curve[which]->setPen(pen);
+ }
+}
+
+const Qt::PenStyle
+DisplayPlot::getLineStyle(int which) const
+{
+ if (which < _nplots) {
+ return _plot_curve[which]->pen().style();
+ } else {
+ return Qt::SolidLine;
+ }
+}
+
+void
+DisplayPlot::setLineMarker(int which, QwtSymbol::Style marker)
+{
+ if (which < _nplots) {
+#if QWT_VERSION < 0x060000
+ QwtSymbol sym = (QwtSymbol)_plot_curve[which]->symbol();
+ QPen pen(_plot_curve[which]->pen());
+ QBrush brush(pen.color());
+ sym.setStyle(marker);
+ sym.setPen(pen);
+ sym.setBrush(brush);
+ _plot_curve[which]->setSymbol(sym);
+#else
+ QwtSymbol *sym = (QwtSymbol*)_plot_curve[which]->symbol();
+ if(sym) {
+ sym->setStyle(marker);
+ _plot_curve[which]->setSymbol(sym);
+ }
+#endif
+ }
+}
+
+const QwtSymbol::Style
+DisplayPlot::getLineMarker(int which) const
+{
+ if(which < _nplots) {
+#if QWT_VERSION < 0x060000
+ QwtSymbol sym = (QwtSymbol)_plot_curve[which]->symbol();
+ return sym.style();
+#else
+ QwtSymbol *sym = (QwtSymbol*)_plot_curve[which]->symbol();
+ return sym->style();
+#endif
+ }
+ else {
+ return QwtSymbol::NoSymbol;
+ }
+}
+
+void
+DisplayPlot::setMarkerAlpha(int which, int alpha)
+{
+ if (which < _nplots) {
+ // Get the pen color
+ QPen pen(_plot_curve[which]->pen());
+ QColor color = pen.color();
+
+ // Set new alpha and update pen
+ color.setAlpha(alpha);
+ pen.setColor(color);
+ _plot_curve[which]->setPen(pen);
+
+ // And set the new color for the markers
+#if QWT_VERSION < 0x060000
+ QwtSymbol sym = (QwtSymbol)_plot_curve[which]->symbol();
+ setLineMarker(which, sym.style());
+#else
+ QwtSymbol *sym = (QwtSymbol*)_plot_curve[which]->symbol();
+ if(sym) {
+ sym->setColor(color);
+ sym->setPen(pen);
+ _plot_curve[which]->setSymbol(sym);
+ }
+#endif
+ }
+}
+
+int
+DisplayPlot::getMarkerAlpha(int which) const
+{
+ if (which < _nplots) {
+ return _plot_curve[which]->pen().color().alpha();
+ } else {
+ return 0;
+ }
+}
+
+void
+DisplayPlot::setStop(bool on)
+{
+ _stop = on;
+}
+
+void
+DisplayPlot::resizeSlot( QSize *s )
+{
+ // -10 is to spare some room for the legend and x-axis label
+ resize(s->width()-10, s->height()-10);
+}
+
+void DisplayPlot::LegendEntryChecked(QwtPlotItem* plotItem, bool on)
+{
+ plotItem->setVisible(!on);
+ replot();
+}
+
+void
+DisplayPlot::OnPickerPointSelected(const QwtDoublePoint & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f\n", point.x(), point.y());
+ emit plotPointSelected(point);
+}
+
+void
+DisplayPlot::OnPickerPointSelected6(const QPointF & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f\n", point.x(), point.y());
+ emit plotPointSelected(point);
+}