Fixed waterfall spectrum view.

master
Hannes Matuschek 12 years ago
parent 03eb1cd970
commit 86900ecc89

@ -10,7 +10,9 @@ using namespace sdr::gui;
/* ****************************************************************************************** *
* Implementation of ColorMap
* ****************************************************************************************** */
ColorMap::ColorMap() {
ColorMap::ColorMap(double min, double max)
: _min(min), _max(max)
{
// pass...
}
@ -22,7 +24,7 @@ ColorMap::~ColorMap() {
* Implementation of GrayScaleColorMap
* ****************************************************************************************** */
GrayScaleColorMap::GrayScaleColorMap(double mindB)
: ColorMap(), _mindB(mindB)
: ColorMap(mindB, 0)
{
// pass...
}
@ -32,10 +34,8 @@ GrayScaleColorMap::~GrayScaleColorMap() {
}
QColor
GrayScaleColorMap::operator ()(const double &value) {
if (value > 0) { return Qt::white; }
if (value < _mindB) { return Qt::black; }
int h = (255*(value-_mindB))/std::abs(_mindB);
GrayScaleColorMap::map(const double &value) {
int h = 255*value;
return QColor(h,h,h);
}
@ -74,6 +74,22 @@ WaterFallView::_onSpectrumUpdated() {
this->update();
}
void
WaterFallView::mouseReleaseEvent(QMouseEvent *evt) {
// If event is accepted -> determine frequency
if ((evt->pos().x() < 0) || (evt->pos().x() > this->width())) { return; }
double f=0;
double dfdx = _spectrum->sampleRate()/this->width();
f = -_spectrum->sampleRate()/2 + dfdx*evt->pos().x();
emit click(f);
// Forward to default impl:
QWidget::mouseReleaseEvent(evt);
// redraw
this->update();
}
void
WaterFallView::paintEvent(QPaintEvent *evt) {
QPainter painter(this);

@ -14,13 +14,28 @@ class ColorMap
{
protected:
/** Hidden constructor. */
ColorMap();
ColorMap(double min, double max);
public:
/** Destructor. */
virtual ~ColorMap();
/** Needs to be implemented by all sub-classes. Maps the value (dB) to a color value. */
virtual QColor operator()(const double &value) = 0;
/** Maps a value to a color. */
inline QColor operator()(const double &value) {
if (value > _max) { return this->map(1); }
if (value < _min) { return this->map(0); }
return this->map((value-_min)/(_max-_min));
}
/** Maps a value on the interval [0,1] to a color.
* Needs to be implemented by all sub-classes. */
virtual QColor map(const double &value) = 0;
protected:
/** Minimum value. */
double _min;
/** Maximum value. */
double _max;
};
/** A simple gray-scale color map. */
@ -34,11 +49,7 @@ public:
/** Destructor. */
virtual ~GrayScaleColorMap();
/** Implements the color mapping. */
virtual QColor operator()(const double &value);
protected:
/** The minimum value. */
double _mindB;
virtual QColor map(const double &value);
};
@ -54,7 +65,13 @@ public:
* @param parent The parent widget. */
explicit WaterFallView(Spectrum *spectrum, size_t height=100, QWidget *parent = 0);
signals:
void click(double f);
protected:
/** Handles mouse clicks. */
virtual void mouseReleaseEvent(QMouseEvent *evt);
/** Draws the scaled waterfall spectrogram. */
virtual void paintEvent(QPaintEvent *evt);

Loading…
Cancel
Save