summaryrefslogtreecommitdiff
path: root/gr-qtgui
diff options
context:
space:
mode:
Diffstat (limited to 'gr-qtgui')
-rw-r--r--gr-qtgui/lib/ConstellationDisplayPlot.cc29
-rw-r--r--gr-qtgui/lib/ConstellationDisplayPlot.h8
-rw-r--r--gr-qtgui/lib/FrequencyDisplayPlot.cc55
-rw-r--r--gr-qtgui/lib/FrequencyDisplayPlot.h16
-rw-r--r--gr-qtgui/lib/Makefile.am31
-rw-r--r--gr-qtgui/lib/TimeDomainDisplayPlot.cc18
-rw-r--r--gr-qtgui/lib/TimeDomainDisplayPlot.h10
-rw-r--r--gr-qtgui/lib/WaterfallDisplayPlot.cc24
-rw-r--r--gr-qtgui/lib/WaterfallDisplayPlot.h8
-rw-r--r--gr-qtgui/lib/qtgui_sink_c.h3
-rw-r--r--gr-qtgui/lib/qtgui_util.cc71
-rw-r--r--gr-qtgui/lib/qtgui_util.h50
-rw-r--r--gr-qtgui/lib/spectrumdisplayform.cc37
-rw-r--r--gr-qtgui/lib/spectrumdisplayform.h8
-rw-r--r--gr-qtgui/swig/Makefile.am5
-rw-r--r--gr-qtgui/swig/qtgui.i111
-rw-r--r--gr-qtgui/swig/qtgui_swig.i97
17 files changed, 437 insertions, 144 deletions
diff --git a/gr-qtgui/lib/ConstellationDisplayPlot.cc b/gr-qtgui/lib/ConstellationDisplayPlot.cc
index 71933cece..75dbe9c37 100644
--- a/gr-qtgui/lib/ConstellationDisplayPlot.cc
+++ b/gr-qtgui/lib/ConstellationDisplayPlot.cc
@@ -5,7 +5,7 @@
#include <qwt_scale_draw.h>
#include <qwt_legend.h>
-
+#include <iostream>
class ConstellationDisplayZoomer: public QwtPlotZoomer
{
@@ -75,15 +75,11 @@ ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent)
memset(_imagDataPoints, 0x0, _numPoints*sizeof(double));
_zoomer = new ConstellationDisplayZoomer(canvas());
-#if QT_VERSION < 0x040000
- _zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
- Qt::RightButton, Qt::ControlModifier);
-#else
+ _zoomer->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
_zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
- Qt::RightButton, Qt::ControlModifier);
-#endif
+ Qt::RightButton, Qt::ControlModifier);
_zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
- Qt::RightButton);
+ Qt::RightButton);
_panner = new QwtPlotPanner(canvas());
_panner->setAxisEnabled(QwtPlot::yRight, false);
@@ -100,8 +96,13 @@ ConstellationDisplayPlot::ConstellationDisplayPlot(QWidget* parent)
_zoomer->setRubberBandPen(c);
_zoomer->setTrackerPen(c);
- connect(this, SIGNAL( legendChecked(QwtPlotItem *, bool ) ),
- this, SLOT( LegendEntryChecked(QwtPlotItem *, bool ) ));
+ // emit the position of clicks on widget
+ _picker = new QwtDblClickPlotPicker(canvas());
+ connect(_picker, SIGNAL(selected(const QwtDoublePoint &)),
+ this, SLOT(OnPickerPointSelected(const QwtDoublePoint &)));
+
+ connect(this, SIGNAL(legendChecked(QwtPlotItem *, bool ) ),
+ this, SLOT(LegendEntryChecked(QwtPlotItem *, bool ) ));
}
ConstellationDisplayPlot::~ConstellationDisplayPlot()
@@ -186,4 +187,12 @@ ConstellationDisplayPlot::LegendEntryChecked(QwtPlotItem* plotItem, bool on)
plotItem->setVisible(!on);
}
+void
+ConstellationDisplayPlot::OnPickerPointSelected(const QwtDoublePoint & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f\n", point.x(), point.y());
+ emit plotPointSelected(point);
+}
+
#endif /* CONSTELLATION_DISPLAY_PLOT_C */
diff --git a/gr-qtgui/lib/ConstellationDisplayPlot.h b/gr-qtgui/lib/ConstellationDisplayPlot.h
index a441a8bfe..bf4531e0a 100644
--- a/gr-qtgui/lib/ConstellationDisplayPlot.h
+++ b/gr-qtgui/lib/ConstellationDisplayPlot.h
@@ -13,6 +13,7 @@
#include <qwt_plot_marker.h>
#include <highResTimeFunctions.h>
#include <qwt_symbol.h>
+#include <qtgui_util.h>
class ConstellationDisplayPlot : public QwtPlot
{
@@ -38,6 +39,11 @@ public:
public slots:
void resizeSlot( QSize *s );
+ void OnPickerPointSelected(const QwtDoublePoint & p);
+
+signals:
+ void plotPointSelected(const QPointF p);
+
protected slots:
void LegendEntryChecked(QwtPlotItem *plotItem, bool on);
@@ -49,6 +55,8 @@ private:
QwtPlotPanner* _panner;
QwtPlotZoomer* _zoomer;
+ QwtDblClickPlotPicker *_picker;
+
double* _realDataPoints;
double* _imagDataPoints;
diff --git a/gr-qtgui/lib/FrequencyDisplayPlot.cc b/gr-qtgui/lib/FrequencyDisplayPlot.cc
index 45e2e6c16..30b318184 100644
--- a/gr-qtgui/lib/FrequencyDisplayPlot.cc
+++ b/gr-qtgui/lib/FrequencyDisplayPlot.cc
@@ -148,7 +148,7 @@ FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent)
_max_fft_plot_curve->setRawData(_xAxisPoints, _maxFFTPoints, _numPoints);
_max_fft_plot_curve->setVisible(false);
- _lower_intensity_marker = new QwtPlotMarker();
+ _lower_intensity_marker= new QwtPlotMarker();
_lower_intensity_marker->setLineStyle(QwtPlotMarker::HLine);
_lower_intensity_marker->setLinePen(QPen(Qt::cyan));
_lower_intensity_marker->attach(this);
@@ -183,6 +183,12 @@ FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent)
_markerNoiseFloorAmplitude->setLinePen(QPen(Qt::darkRed, 0, Qt::DotLine));
_markerNoiseFloorAmplitude->attach(this);
+ _markerCF= new QwtPlotMarker();
+ _markerCF->setLineStyle(QwtPlotMarker::VLine);
+ _markerCF->setLinePen(QPen(Qt::lightGray, 0, Qt::DotLine));
+ _markerCF->attach(this);
+ _markerCF->hide();
+
_peakFrequency = 0;
_peakAmplitude = -HUGE_VAL;
@@ -190,14 +196,19 @@ FrequencyDisplayPlot::FrequencyDisplayPlot(QWidget* parent)
replot();
+ // emit the position of clicks on widget
+ _picker = new QwtDblClickPlotPicker(canvas());
+ connect(_picker, SIGNAL(selected(const QwtDoublePoint &)),
+ this, SLOT(OnPickerPointSelected(const QwtDoublePoint &)));
+
+ // Configure magnify on mouse wheel
+ _magnifier = new QwtPlotMagnifier(canvas());
+ _magnifier->setAxisEnabled(QwtPlot::xBottom, false);
+
_zoomer = new FreqDisplayZoomer(canvas(), 0);
-#if QT_VERSION < 0x040000
+ _zoomer->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
_zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier);
-#else
- _zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
- Qt::RightButton, Qt::ControlModifier);
-#endif
_zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
Qt::RightButton);
@@ -256,6 +267,7 @@ FrequencyDisplayPlot::SetFrequencyRange(const double constStartFreq,
double stopFreq = constStopFreq / units;
double centerFreq = constCenterFreq / units;
+ _xAxisMultiplier = units;
_useCenterFrequencyFlag = useCenterFrequencyFlag;
if(_useCenterFrequencyFlag){
@@ -433,5 +445,36 @@ FrequencyDisplayPlot::SetUpperIntensityLevel(const double upperIntensityLevel)
_upper_intensity_marker->setYValue( upperIntensityLevel );
}
+void
+FrequencyDisplayPlot::SetTraceColour (QColor c)
+{
+ _fft_plot_curve->setPen(QPen(c));
+}
+
+void
+FrequencyDisplayPlot::SetBGColour (QColor c)
+{
+ QPalette palette;
+ palette.setColor(canvas()->backgroundRole(), c);
+ canvas()->setPalette(palette);
+}
+
+void
+FrequencyDisplayPlot::ShowCFMarker (const bool show)
+{
+ if (show)
+ _markerCF->show();
+ else
+ _markerCF->hide();
+}
+
+void
+FrequencyDisplayPlot::OnPickerPointSelected(const QwtDoublePoint & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f %d\n", point.x(), point.y(), _xAxisMultiplier);
+ point.setX(point.x() * _xAxisMultiplier);
+ emit plotPointSelected(point);
+}
#endif /* FREQUENCY_DISPLAY_PLOT_C */
diff --git a/gr-qtgui/lib/FrequencyDisplayPlot.h b/gr-qtgui/lib/FrequencyDisplayPlot.h
index 3c22c1397..7a207ab8d 100644
--- a/gr-qtgui/lib/FrequencyDisplayPlot.h
+++ b/gr-qtgui/lib/FrequencyDisplayPlot.h
@@ -12,8 +12,10 @@
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
#include <qwt_plot_marker.h>
+#include <qwt_plot_magnifier.h>
#include <highResTimeFunctions.h>
#include <qwt_symbol.h>
+#include <qtgui_util.h>
class FrequencyDisplayPlot:public QwtPlot{
Q_OBJECT
@@ -43,11 +45,20 @@ public:
void set_yaxis(double min, double max);
+ void SetTraceColour (QColor);
+ void SetBGColour (QColor c);
+ void ShowCFMarker (const bool);
+
public slots:
void resizeSlot( QSize *e );
void SetLowerIntensityLevel(const double);
void SetUpperIntensityLevel(const double);
+ void OnPickerPointSelected(const QwtDoublePoint & p);
+
+signals:
+ void plotPointSelected(const QPointF p);
+
protected:
private:
@@ -71,9 +82,14 @@ private:
QwtPlotMarker *_markerPeakAmplitude;
QwtPlotMarker *_markerNoiseFloorAmplitude;
+ QwtPlotMarker *_markerCF;
+
+ QwtDblClickPlotPicker *_picker;
+ QwtPlotMagnifier *_magnifier;
double* _dataPoints;
double* _xAxisPoints;
+ int _xAxisMultiplier;
double* _minFFTPoints;
double* _maxFFTPoints;
diff --git a/gr-qtgui/lib/Makefile.am b/gr-qtgui/lib/Makefile.am
index f9b5dd03e..7dee39eb4 100644
--- a/gr-qtgui/lib/Makefile.am
+++ b/gr-qtgui/lib/Makefile.am
@@ -53,7 +53,8 @@ libgnuradio_qtgui_la_SOURCES = \
spectrumUpdateEvents.cc \
plot_waterfall.cc \
qtgui_sink_c.cc \
- qtgui_sink_f.cc
+ qtgui_sink_f.cc \
+ qtgui_util.cc
nodist_libgnuradio_qtgui_la_SOURCES=$(QMAKE_SOURCES)
@@ -70,7 +71,8 @@ grinclude_HEADERS = \
SpectrumGUIClass.h \
spectrumUpdateEvents.h \
qtgui_sink_c.h \
- qtgui_sink_f.h
+ qtgui_sink_f.h \
+ qtgui_util.h
#QT_MOC_FLAGS=-DQT_SHARED -DQT_NO_DEBUG -DQT_OPENGL_LIB -DQT_GUI_LIB -DQT_CORE_LIB
QT_MOC_FLAGS=-DQT_SHARED -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
@@ -84,25 +86,8 @@ QT_MOC_FLAGS=-DQT_SHARED -DQT_NO_DEBUG -DQT_GUI_LIB -DQT_CORE_LIB
libgnuradio_qtgui_la_LDFLAGS = $(NO_UNDEFINED) $(BOOST_LDFLAGS) $(LTVERSIONFLAGS)
libgnuradio_qtgui_la_LIBADD = \
- $(GNURADIO_CORE_LA) \
- $(BOOST_THREAD_LIB) \
- $(BOOST_DATE_TIME_LIB) \
- -lstdc++ \
+ $(GNURADIO_CORE_LA) \
+ $(BOOST_THREAD_LIB) \
+ $(BOOST_DATE_TIME_LIB) \
+ -lstdc++ \
$(QT_LIBS)
-
-##############################
-# SWIG interfaces and libraries
-
-TOP_SWIG_IFILES = \
- qtgui.i
-
-# Install so that they end up available as:
-# import gnuradio.qtgui
-# This ends up at:
-# ${prefix}/lib/python${python_version}/site-packages/gnuradio
-qtgui_pythondir_category = \
- gnuradio/qtgui
-
-# additional libraries for linking with the SWIG-generated library
-qtgui_la_swig_libadd = \
- libgnuradio-qtgui.la
diff --git a/gr-qtgui/lib/TimeDomainDisplayPlot.cc b/gr-qtgui/lib/TimeDomainDisplayPlot.cc
index da28d0304..be25a6cde 100644
--- a/gr-qtgui/lib/TimeDomainDisplayPlot.cc
+++ b/gr-qtgui/lib/TimeDomainDisplayPlot.cc
@@ -82,6 +82,7 @@ TimeDomainDisplayPlot::TimeDomainDisplayPlot(QWidget* parent):QwtPlot(parent)
_xAxisPoints = new double[_numPoints];
_zoomer = new TimeDomainDisplayZoomer(canvas(), 0);
+ _zoomer->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
// Disable polygon clipping
QwtPainter::setDeviceClipping(false);
@@ -135,6 +136,15 @@ TimeDomainDisplayPlot::TimeDomainDisplayPlot(QWidget* parent):QwtPlot(parent)
_panner->setAxisEnabled(QwtPlot::yRight, false);
_panner->setMouseButton(Qt::MidButton);
+ // emit the position of clicks on widget
+ _picker = new QwtDblClickPlotPicker(canvas());
+ connect(_picker, SIGNAL(selected(const QwtDoublePoint &)),
+ this, SLOT(OnPickerPointSelected(const QwtDoublePoint &)));
+
+ // 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
@@ -269,4 +279,12 @@ TimeDomainDisplayPlot::SetSampleRate(double sr, double units,
}
}
+void
+TimeDomainDisplayPlot::OnPickerPointSelected(const QwtDoublePoint & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f\n", point.x(), point.y());
+ emit plotPointSelected(point);
+}
+
#endif /* TIME_DOMAIN_DISPLAY_PLOT_C */
diff --git a/gr-qtgui/lib/TimeDomainDisplayPlot.h b/gr-qtgui/lib/TimeDomainDisplayPlot.h
index 952b5c8cf..01338300c 100644
--- a/gr-qtgui/lib/TimeDomainDisplayPlot.h
+++ b/gr-qtgui/lib/TimeDomainDisplayPlot.h
@@ -11,9 +11,11 @@
#include <qwt_scale_widget.h>
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
+#include <qwt_plot_magnifier.h>
#include <qwt_plot_marker.h>
#include <highResTimeFunctions.h>
#include <qwt_symbol.h>
+#include <qtgui_util.h>
class TimeDomainDisplayPlot:public QwtPlot{
Q_OBJECT
@@ -37,6 +39,11 @@ public slots:
void SetSampleRate(double sr, double units,
const std::string &strunits);
+ void OnPickerPointSelected(const QwtDoublePoint & p);
+
+signals:
+ void plotPointSelected(const QPointF p);
+
protected slots:
void LegendEntryChecked(QwtPlotItem *plotItem, bool on);
@@ -51,6 +58,9 @@ private:
QwtPlotPanner* _panner;
QwtPlotZoomer* _zoomer;
+ QwtDblClickPlotPicker *_picker;
+ QwtPlotMagnifier *_magnifier;
+
double* _realDataPoints;
double* _imagDataPoints;
double* _xAxisPoints;
diff --git a/gr-qtgui/lib/WaterfallDisplayPlot.cc b/gr-qtgui/lib/WaterfallDisplayPlot.cc
index 08a71c023..2234f4238 100644
--- a/gr-qtgui/lib/WaterfallDisplayPlot.cc
+++ b/gr-qtgui/lib/WaterfallDisplayPlot.cc
@@ -253,13 +253,9 @@ WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent)
// Ctrl+RighButton: zoom out to full size
_zoomer = new WaterfallZoomer(canvas(), 0);
-#if QT_VERSION < 0x040000
+ _zoomer->setSelectionFlags(QwtPicker::RectSelection | QwtPicker::DragSelection);
_zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
Qt::RightButton, Qt::ControlModifier);
-#else
- _zoomer->setMousePattern(QwtEventPattern::MouseSelect2,
- Qt::RightButton, Qt::ControlModifier);
-#endif
_zoomer->setMousePattern(QwtEventPattern::MouseSelect3,
Qt::RightButton);
@@ -267,6 +263,11 @@ WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent)
_panner->setAxisEnabled(QwtPlot::yRight, false);
_panner->setMouseButton(Qt::MidButton);
+ // emit the position of clicks on widget
+ _picker = new QwtDblClickPlotPicker(canvas());
+ connect(_picker, SIGNAL(selected(const QwtDoublePoint &)),
+ this, SLOT(OnPickerPointSelected(const QwtDoublePoint &)));
+
// Avoid jumping when labels with more/less digits
// appear/disappear when scrolling vertically
@@ -279,6 +280,8 @@ WaterfallDisplayPlot::WaterfallDisplayPlot(QWidget* parent)
_zoomer->setTrackerPen(c);
_UpdateIntensityRangeDisplay();
+
+ _xAxisMultiplier = 1;
}
WaterfallDisplayPlot::~WaterfallDisplayPlot()
@@ -315,6 +318,8 @@ WaterfallDisplayPlot::SetFrequencyRange(const double constStartFreq,
double stopFreq = constStopFreq / units;
double centerFreq = constCenterFreq / units;
+ _xAxisMultiplier = units;
+
_useCenterFrequencyFlag = useCenterFrequencyFlag;
if(_useCenterFrequencyFlag){
@@ -544,4 +549,13 @@ WaterfallDisplayPlot::_UpdateIntensityRangeDisplay()
_lastReplot = get_highres_clock();
}
+void
+WaterfallDisplayPlot::OnPickerPointSelected(const QwtDoublePoint & p)
+{
+ QPointF point = p;
+ //fprintf(stderr,"OnPickerPointSelected %f %f %d\n", point.x(), point.y(), _xAxisMultiplier);
+ point.setX(point.x() * _xAxisMultiplier);
+ emit plotPointSelected(point);
+}
+
#endif /* WATERFALL_DISPLAY_PLOT_C */
diff --git a/gr-qtgui/lib/WaterfallDisplayPlot.h b/gr-qtgui/lib/WaterfallDisplayPlot.h
index 6b4e978bb..faa48d6aa 100644
--- a/gr-qtgui/lib/WaterfallDisplayPlot.h
+++ b/gr-qtgui/lib/WaterfallDisplayPlot.h
@@ -7,6 +7,7 @@
#include <qwt_plot_zoomer.h>
#include <qwt_plot_panner.h>
+#include <qtgui_util.h>
#include <plot_waterfall.h>
#include <highResTimeFunctions.h>
@@ -50,10 +51,12 @@ public:
public slots:
void resizeSlot( QSize *s );
-
+ void OnPickerPointSelected(const QwtDoublePoint & p);
+
signals:
void UpdatedLowerIntensityLevel(const double);
void UpdatedUpperIntensityLevel(const double);
+ void plotPointSelected(const QPointF p);
protected:
@@ -62,12 +65,15 @@ private:
double _startFrequency;
double _stopFrequency;
+ int _xAxisMultiplier;
PlotWaterfall *d_spectrogram;
QwtPlotPanner* _panner;
QwtPlotZoomer* _zoomer;
+ QwtDblClickPlotPicker *_picker;
+
WaterfallData* _waterfallData;
timespec _lastReplot;
diff --git a/gr-qtgui/lib/qtgui_sink_c.h b/gr-qtgui/lib/qtgui_sink_c.h
index 1c9561704..fb0cb6c5f 100644
--- a/gr-qtgui/lib/qtgui_sink_c.h
+++ b/gr-qtgui/lib/qtgui_sink_c.h
@@ -67,8 +67,6 @@ private:
double d_bandwidth;
std::string d_name;
- //gruel::mutex d_mutex;
-
bool d_shift;
gri_fft_complex *d_fft;
@@ -105,7 +103,6 @@ public:
void set_update_time(double t);
QApplication *d_qApplication;
- //qtgui_obj *d_object;
int general_work (int noutput_items,
gr_vector_int &ninput_items,
diff --git a/gr-qtgui/lib/qtgui_util.cc b/gr-qtgui/lib/qtgui_util.cc
new file mode 100644
index 000000000..87b90997a
--- /dev/null
+++ b/gr-qtgui/lib/qtgui_util.cc
@@ -0,0 +1,71 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,2009 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 <qtgui_util.h>
+
+QwtPickerDblClickPointMachine::QwtPickerDblClickPointMachine()
+ : QwtPickerMachine ()
+{
+
+}
+
+QwtPickerDblClickPointMachine::~QwtPickerDblClickPointMachine()
+{
+
+}
+
+QwtPickerMachine::CommandList
+QwtPickerDblClickPointMachine::transition(const QwtEventPattern &eventPattern,
+ const QEvent *e)
+{
+ QwtPickerMachine::CommandList cmdList;
+ switch(e->type()) {
+ case QEvent::MouseButtonDblClick:
+ if ( eventPattern.mouseMatch(QwtEventPattern::MouseSelect1,
+ (const QMouseEvent *)e) ) {
+ cmdList += QwtPickerMachine::Begin;
+ cmdList += QwtPickerMachine::Append;
+ cmdList += QwtPickerMachine::End;
+ }
+ break;
+ default:
+ break;
+ }
+ return cmdList;
+}
+
+QwtDblClickPlotPicker::QwtDblClickPlotPicker(QwtPlotCanvas* canvas)
+ : QwtPlotPicker(canvas)
+{
+ setSelectionFlags(QwtPicker::PointSelection);
+}
+
+QwtDblClickPlotPicker::~QwtDblClickPlotPicker()
+{
+}
+
+QwtPickerMachine*
+QwtDblClickPlotPicker::stateMachine(int n) const
+{
+ return new QwtPickerDblClickPointMachine;
+}
+
diff --git a/gr-qtgui/lib/qtgui_util.h b/gr-qtgui/lib/qtgui_util.h
new file mode 100644
index 000000000..a519c66a2
--- /dev/null
+++ b/gr-qtgui/lib/qtgui_util.h
@@ -0,0 +1,50 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2011 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.
+ */
+
+#ifndef INCLUDED_QTGUI_UTIL_H
+#define INCLUDED_QTGUI_UTIL_H
+
+#include <qevent.h>
+
+#include <qwt_plot_picker.h>
+#include <qwt_picker_machine.h>
+
+
+class QwtDblClickPlotPicker: public QwtPlotPicker
+{
+public:
+ QwtDblClickPlotPicker(QwtPlotCanvas *);
+ ~QwtDblClickPlotPicker();
+
+ virtual QwtPickerMachine * stateMachine(int) const;
+};
+
+class QwtPickerDblClickPointMachine: public QwtPickerMachine
+{
+public:
+ QwtPickerDblClickPointMachine();
+ ~QwtPickerDblClickPointMachine();
+
+ virtual CommandList transition( const QwtEventPattern &eventPattern, const QEvent *e);
+};
+
+#endif /* INCLUDED_QTGUI_UTIL_H */
diff --git a/gr-qtgui/lib/spectrumdisplayform.cc b/gr-qtgui/lib/spectrumdisplayform.cc
index 804dbdd62..238c9889f 100644
--- a/gr-qtgui/lib/spectrumdisplayform.cc
+++ b/gr-qtgui/lib/spectrumdisplayform.cc
@@ -62,6 +62,19 @@ SpectrumDisplayForm::SpectrumDisplayForm(QWidget* parent)
// Create a timer to update plots at the specified rate
displayTimer = new QTimer(this);
connect(displayTimer, SIGNAL(timeout()), this, SLOT(UpdateGuiTimer()));
+
+ // Connect double click signals up
+ connect(_frequencyDisplayPlot, SIGNAL(plotPointSelected(const QPointF)),
+ this, SLOT(onFFTPlotPointSelected(const QPointF)));
+
+ connect(_waterfallDisplayPlot, SIGNAL(plotPointSelected(const QPointF)),
+ this, SLOT(onWFallPlotPointSelected(const QPointF)));
+
+ connect(_timeDomainDisplayPlot, SIGNAL(plotPointSelected(const QPointF)),
+ this, SLOT(onTimePlotPointSelected(const QPointF)));
+
+ connect(_constellationDisplayPlot, SIGNAL(plotPointSelected(const QPointF)),
+ this, SLOT(onConstPlotPointSelected(const QPointF)));
}
SpectrumDisplayForm::~SpectrumDisplayForm()
@@ -689,3 +702,27 @@ SpectrumDisplayForm::SetUpdateTime(double t)
// QTimer class takes millisecond input
displayTimer->start(d_update_time*1000);
}
+
+void
+SpectrumDisplayForm::onFFTPlotPointSelected(const QPointF p)
+{
+ emit plotPointSelected(p, 1);
+}
+
+void
+SpectrumDisplayForm::onWFallPlotPointSelected(const QPointF p)
+{
+ emit plotPointSelected(p, 2);
+}
+
+void
+SpectrumDisplayForm::onTimePlotPointSelected(const QPointF p)
+{
+ emit plotPointSelected(p, 3);
+}
+
+void
+SpectrumDisplayForm::onConstPlotPointSelected(const QPointF p)
+{
+ emit plotPointSelected(p, 4);
+}
diff --git a/gr-qtgui/lib/spectrumdisplayform.h b/gr-qtgui/lib/spectrumdisplayform.h
index 794a8c58e..860edf2d1 100644
--- a/gr-qtgui/lib/spectrumdisplayform.h
+++ b/gr-qtgui/lib/spectrumdisplayform.h
@@ -71,7 +71,13 @@ private slots:
void newFrequencyData( const SpectrumUpdateEvent* );
void UpdateGuiTimer();
-protected:
+ void onFFTPlotPointSelected(const QPointF p);
+ void onWFallPlotPointSelected(const QPointF p);
+ void onTimePlotPointSelected(const QPointF p);
+ void onConstPlotPointSelected(const QPointF p);
+
+signals:
+ void plotPointSelected(const QPointF p, int type);
private:
void _AverageHistory( const double * newBuffer );
diff --git a/gr-qtgui/swig/Makefile.am b/gr-qtgui/swig/Makefile.am
index 460868701..8c695ba5b 100644
--- a/gr-qtgui/swig/Makefile.am
+++ b/gr-qtgui/swig/Makefile.am
@@ -1,5 +1,5 @@
#
-# Copyright 2004,2005,2006,2008,2009,2010 Free Software Foundation, Inc.
+# Copyright 2004-2006,2008-2011 Free Software Foundation, Inc.
#
# This file is part of GNU Radio
#
@@ -50,4 +50,5 @@ qtgui_swig_la_swig_libadd = \
$(abs_top_builddir)/gr-qtgui/lib/libgnuradio-qtgui.la
# additional SWIG files to be installed
-qtgui_swig_swiginclude_headers =
+qtgui_swig_swiginclude_headers = \
+ qtgui.i
diff --git a/gr-qtgui/swig/qtgui.i b/gr-qtgui/swig/qtgui.i
new file mode 100644
index 000000000..77c6ccdd7
--- /dev/null
+++ b/gr-qtgui/swig/qtgui.i
@@ -0,0 +1,111 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2008,2009 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 "gnuradio.i"
+
+%{
+#include <qtgui_sink_c.h>
+#include <qtgui_sink_f.h>
+%}
+
+GR_SWIG_BLOCK_MAGIC(qtgui,sink_c)
+
+qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype,
+ double fc=0, double bw=1.0,
+ const std::string &name="Display",
+ bool plotfreq=true, bool plotwaterfall=true,
+ bool plottime=true, bool plotconst=true,
+ QWidget *parent=NULL);
+
+class qtgui_sink_c : public gr_block
+{
+private:
+ friend qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype,
+ double fc, double bw,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plottime, bool plotconst,
+ QWidget *parent);
+ qtgui_sink_c (int fftsize, int wintype,
+ double fc, double bw,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plottime, bool plotconst,
+ QWidget *parent);
+
+public:
+ void exec_();
+ PyObject* pyqwidget();
+
+ void set_frequency_range(const double centerfreq,
+ const double bandwidth);
+ void set_time_domain_axis(double min, double max);
+ void set_constellation_axis(double xmin, double xmax,
+ double ymin, double ymax);
+ void set_frequency_axis(double min, double max);
+ void set_constellation_pen_size(int size);
+ void set_update_time(double t);
+};
+
+
+
+/*********************************************************************/
+
+
+GR_SWIG_BLOCK_MAGIC(qtgui,sink_f)
+
+qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ double fc=0, double bw=0.0,
+ const std::string &name="Display",
+ bool plotfreq=true, bool plotwaterfall=true,
+ bool plottime=true, bool plotconst=true,
+ QWidget *parent=NULL);
+
+class qtgui_sink_f : public gr_block
+{
+private:
+ friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
+ double fc, double bw,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plottime, bool plotconst,
+ QWidget *parent);
+ qtgui_sink_f (int fftsize, int wintype,
+ double fc, double bw,
+ const std::string &name,
+ bool plotfreq, bool plotwaterfall,
+ bool plottime, bool plotconst,
+ QWidget *parent);
+
+public:
+ void exec_();
+ PyObject* pyqwidget();
+
+ void set_frequency_range(const double centerfreq,
+ const double bandwidth);
+ void set_time_domain_axis(double min, double max);
+ void set_constellation_axis(double xmin, double xmax,
+ double ymin, double ymax);
+ void set_frequency_axis(double min, double max);
+ void set_constellation_pen_size(int size);
+ void set_update_time(double t);
+};
diff --git a/gr-qtgui/swig/qtgui_swig.i b/gr-qtgui/swig/qtgui_swig.i
index c471bb09c..c250cdd04 100644
--- a/gr-qtgui/swig/qtgui_swig.i
+++ b/gr-qtgui/swig/qtgui_swig.i
@@ -1,6 +1,6 @@
/* -*- c++ -*- */
/*
- * Copyright 2008,2009 Free Software Foundation, Inc.
+ * Copyright 2008,2009,2011 Free Software Foundation, Inc.
*
* This file is part of GNU Radio
*
@@ -23,99 +23,10 @@
%include "gnuradio.i"
%{
-#include "qtgui_sink_c.h"
-#include "qtgui_sink_f.h"
+#include <qtgui_sink_c.h>
+#include <qtgui_sink_f.h>
%}
-GR_SWIG_BLOCK_MAGIC(qtgui,sink_c)
+%include "qtgui.i"
- qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype,
- double fc=0, double bw=1.0,
- const std::string &name="Display",
- bool plotfreq=true, bool plotwaterfall=true,
- bool plottime=true, bool plotconst=true,
- QWidget *parent=NULL);
-class qtgui_sink_c : public gr_block
-{
-private:
- friend qtgui_sink_c_sptr qtgui_make_sink_c (int fftsize, int wintype,
- double fc, double bw,
- const std::string &name,
- bool plotfreq, bool plotwaterfall,
- bool plottime, bool plotconst,
- QWidget *parent);
- qtgui_sink_c (int fftsize, int wintype,
- double fc, double bw,
- const std::string &name,
- bool plotfreq, bool plotwaterfall,
- bool plottime, bool plotconst,
- QWidget *parent);
-
-public:
- void exec_();
- PyObject* pyqwidget();
-
- void set_frequency_range(const double centerfreq,
- const double bandwidth);
- void set_time_domain_axis(double min, double max);
- void set_constellation_axis(double xmin, double xmax,
- double ymin, double ymax);
- void set_frequency_axis(double min, double max);
- void set_constellation_pen_size(int size);
- void set_update_time(double t);
-};
-
-
-
-/*********************************************************************/
-
-
-GR_SWIG_BLOCK_MAGIC(qtgui,sink_f)
-
-qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
- double fc=0, double bw=0.0,
- const std::string &name="Display",
- bool plotfreq=true, bool plotwaterfall=true,
- bool plottime=true, bool plotconst=true,
- QWidget *parent=NULL);
-
-class qtgui_sink_f : public gr_block
-{
-private:
- friend qtgui_sink_f_sptr qtgui_make_sink_f (int fftsize, int wintype,
- double fc, double bw,
- const std::string &name,
- bool plotfreq, bool plotwaterfall,
- bool plottime, bool plotconst,
- QWidget *parent);
- qtgui_sink_f (int fftsize, int wintype,
- double fc, double bw,
- const std::string &name,
- bool plotfreq, bool plotwaterfall,
- bool plottime, bool plotconst,
- QWidget *parent);
-
-public:
- void exec_();
- PyObject* pyqwidget();
-
- void set_frequency_range(const double centerfreq,
- const double bandwidth);
- void set_time_domain_axis(double min, double max);
- void set_constellation_axis(double xmin, double xmax,
- double ymin, double ymax);
- void set_frequency_axis(double min, double max);
- void set_constellation_pen_size(int size);
- void set_update_time(double t);
-};
-
-#if SWIGGUILE
-%scheme %{
-(load-extension-global "libguile-gnuradio-qtgui_swig" "scm_init_gnuradio_qtgui_swig_module")
-%}
-
-%goops %{
-(use-modules (gnuradio gnuradio_core_runtime))
-%}
-#endif