mirror of
https://github.com/f4exb/sdrangel.git
synced 2024-09-27 15:26:33 -04:00
Merge pull request #1305 from srcejon/spectrum_scrolling
Spectrum: Allow frequency scrolling
This commit is contained in:
commit
c01514d593
@ -92,6 +92,8 @@ GLSpectrum::GLSpectrum(QWidget* parent) :
|
||||
m_scaleZ3DSpectrogram(false),
|
||||
m_3DSpectrogramStyle(SpectrumSettings::Outline),
|
||||
m_colorMapName("Angel"),
|
||||
m_scrollFrequency(false),
|
||||
m_scrollStartCenterFreq(0),
|
||||
m_histogramBuffer(nullptr),
|
||||
m_histogram(nullptr),
|
||||
m_displayHistogram(true),
|
||||
@ -2984,6 +2986,19 @@ void GLSpectrum::mouseMoveEvent(QMouseEvent* event)
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_scrollFrequency)
|
||||
{
|
||||
// Request containing widget to adjust center frequency
|
||||
// Not all containers will support this - mainly for MainSpectrumGUI
|
||||
// This can be a little slow on some SDRs, so we use delta from where
|
||||
// button was originally pressed rather than do it incrementally
|
||||
QPointF delta = m_mousePrevLocalPos - event->localPos();
|
||||
float histogramWidth = width() - m_leftMargin - m_rightMargin;
|
||||
qint64 frequency = (qint64)(m_scrollStartCenterFreq + delta.x()/histogramWidth * m_frequencyScale.getRange());
|
||||
emit requestCenterFrequency(frequency);
|
||||
return;
|
||||
}
|
||||
|
||||
if (m_displayWaterfall || m_displayHistogram || m_displayMaxHold || m_displayCurrent)
|
||||
{
|
||||
if (m_frequencyScaleRect.contains(event->pos()))
|
||||
@ -3035,8 +3050,18 @@ void GLSpectrum::mouseMoveEvent(QMouseEvent* event)
|
||||
}
|
||||
else if (m_cursorState == CSChannelMoving)
|
||||
{
|
||||
Real freq = m_frequencyScale.getValueFromPos(event->x() - m_leftMarginPixmap.width() - 1) - m_centerFrequency;
|
||||
// Determine if user is trying to move the channel outside of the current frequency range
|
||||
// and if so, request an adjustment to the center frequency
|
||||
Real freqAbs = m_frequencyScale.getValueFromPos(event->x() - m_leftMarginPixmap.width() - 1);
|
||||
Real freqMin = m_centerFrequency - m_sampleRate / 2.0f;
|
||||
Real freqMax = m_centerFrequency + m_sampleRate / 2.0f;
|
||||
if (freqAbs < freqMin) {
|
||||
emit requestCenterFrequency(m_centerFrequency - (freqMin - freqAbs));
|
||||
} else if (freqAbs > freqMax) {
|
||||
emit requestCenterFrequency(m_centerFrequency + (freqAbs - freqMax));
|
||||
}
|
||||
|
||||
Real freq = freqAbs - m_centerFrequency;
|
||||
if (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getMovable()
|
||||
&& (m_channelMarkerStates[m_cursorChannel]->m_channelMarker->getSourceOrSinkStream() == m_displaySourceOrSink)
|
||||
&& m_channelMarkerStates[m_cursorChannel]->m_channelMarker->streamIndexApplies(m_displayStreamIndex))
|
||||
@ -3096,6 +3121,14 @@ void GLSpectrum::mousePressEvent(QMouseEvent* event)
|
||||
{
|
||||
const QPointF& ep = event->localPos();
|
||||
|
||||
if ((event->button() == Qt::MiddleButton) && (m_displayMaxHold || m_displayCurrent || m_displayHistogram) && pointInHistogram(ep))
|
||||
{
|
||||
m_scrollFrequency = true;
|
||||
m_scrollStartCenterFreq = m_centerFrequency;
|
||||
m_mousePrevLocalPos = ep;
|
||||
return;
|
||||
}
|
||||
|
||||
if ((event->button() == Qt::MiddleButton) && m_display3DSpectrogram && pointInWaterfallOrSpectrogram(ep))
|
||||
{
|
||||
m_pan3DSpectrogram = true;
|
||||
@ -3341,6 +3374,7 @@ void GLSpectrum::mousePressEvent(QMouseEvent* event)
|
||||
|
||||
void GLSpectrum::mouseReleaseEvent(QMouseEvent*)
|
||||
{
|
||||
m_scrollFrequency = false;
|
||||
m_pan3DSpectrogram = false;
|
||||
m_rotate3DSpectrogram = false;
|
||||
m_scaleZ3DSpectrogram = false;
|
||||
@ -3654,6 +3688,17 @@ bool GLSpectrum::pointInWaterfallOrSpectrogram(const QPointF &point) const
|
||||
return (pWat.x() >= 0) && (pWat.x() <= 1) && (pWat.y() >= 0) && (pWat.y() <= 1);
|
||||
}
|
||||
|
||||
// Return if specified point is within the bounds of the histogram screen area
|
||||
bool GLSpectrum::pointInHistogram(const QPointF &point) const
|
||||
{
|
||||
// m_histogramRect is normalised to [0,1]
|
||||
QPointF p = point;
|
||||
p.rx() = (point.x()/width() - m_histogramRect.left()) / m_histogramRect.width();
|
||||
p.ry() = (point.y()/height() - m_histogramRect.top()) / m_histogramRect.height();
|
||||
|
||||
return (p.x() >= 0) && (p.x() <= 1) && (p.y() >= 0) && (p.y() <= 1);
|
||||
}
|
||||
|
||||
void GLSpectrum::enterEvent(QEvent* event)
|
||||
{
|
||||
m_mouseInside = true;
|
||||
|
@ -319,6 +319,9 @@ private:
|
||||
SpectrumSettings::SpectrumStyle m_spectrumStyle;
|
||||
const float *m_colorMap;
|
||||
|
||||
bool m_scrollFrequency;
|
||||
qint64 m_scrollStartCenterFreq;
|
||||
|
||||
QRgb m_histogramPalette[240];
|
||||
QImage* m_histogramBuffer;
|
||||
quint8* m_histogram; //!< Spectrum phosphor matrix of FFT width and PSD height scaled to 100. values [0..239]
|
||||
@ -391,6 +394,7 @@ private:
|
||||
void setPowerScale(int height);
|
||||
void getFrequencyZoom(int64_t& centerFrequency, int& frequencySpan);
|
||||
bool pointInWaterfallOrSpectrogram(const QPointF &point) const;
|
||||
bool pointInHistogram(const QPointF &point) const;
|
||||
|
||||
void enterEvent(QEvent* event);
|
||||
void leaveEvent(QEvent* event);
|
||||
@ -432,6 +436,10 @@ private slots:
|
||||
void channelMarkerDestroyed(QObject* object);
|
||||
void openGLDebug(const QOpenGLDebugMessage &debugMessage);
|
||||
bool eventFilter(QObject *object, QEvent *event);
|
||||
|
||||
signals:
|
||||
// Emitted when user tries to scroll to frequency currently out of range
|
||||
void requestCenterFrequency(qint64 frequency);
|
||||
};
|
||||
|
||||
#endif // INCLUDE_GLSPECTRUM_H
|
||||
|
@ -29,6 +29,7 @@
|
||||
#include "gui/glspectrumgui.h"
|
||||
#include "gui/workspaceselectiondialog.h"
|
||||
#include "dsp/spectrumvis.h"
|
||||
#include "channel/channelwebapiutils.h"
|
||||
#include "mainspectrumgui.h"
|
||||
|
||||
MainSpectrumGUI::MainSpectrumGUI(GLSpectrum *spectrum, GLSpectrumGUI *spectrumGUI, QWidget *parent) :
|
||||
@ -141,6 +142,8 @@ MainSpectrumGUI::MainSpectrumGUI(GLSpectrum *spectrum, GLSpectrumGUI *spectrumGU
|
||||
connect(this, SIGNAL(forceShrink()), this, SLOT(shrinkWindow()));
|
||||
connect(m_hideButton, SIGNAL(clicked()), this, SLOT(hide()));
|
||||
|
||||
connect(spectrum, &GLSpectrum::requestCenterFrequency, this, &MainSpectrumGUI::onRequestCenterFrequency);
|
||||
|
||||
m_resizer.enableChildMouseTracking();
|
||||
shrinkWindow();
|
||||
}
|
||||
@ -317,3 +320,10 @@ QString MainSpectrumGUI::getDeviceTypeTag()
|
||||
return "X";
|
||||
}
|
||||
}
|
||||
|
||||
// Handle request from GLSpectrum to adjust center frequency
|
||||
void MainSpectrumGUI::onRequestCenterFrequency(qint64 frequency)
|
||||
{
|
||||
double frequencyInHz = (double)frequency;
|
||||
ChannelWebAPIUtils::setCenterFrequency(m_deviceSetIndex, frequencyInHz);
|
||||
}
|
||||
|
@ -106,6 +106,7 @@ private slots:
|
||||
void showHelp();
|
||||
void openMoveToWorkspaceDialog();
|
||||
void shrinkWindow();
|
||||
void onRequestCenterFrequency(qint64 frequency);
|
||||
|
||||
signals:
|
||||
void closing();
|
||||
|
Loading…
Reference in New Issue
Block a user