Spectrum: Allow frequency scolling with middle mouse button and moving channel marker outside of frequency range

pull/1305/head
Jon Beniston 2022-06-24 14:47:33 +01:00
rodzic 82849f80b4
commit d1670b3ab4
4 zmienionych plików z 65 dodań i 1 usunięć

Wyświetl plik

@ -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;

Wyświetl plik

@ -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

Wyświetl plik

@ -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);
}

Wyświetl plik

@ -106,6 +106,7 @@ private slots:
void showHelp();
void openMoveToWorkspaceDialog();
void shrinkWindow();
void onRequestCenterFrequency(qint64 frequency);
signals:
void closing();