1
0
mirror of https://github.com/f4exb/sdrangel.git synced 2024-11-15 21:01:45 -05:00

GLSpectrum: added ability to use the mouse wheel to move the central channel marker line

This commit is contained in:
f4exb 2019-05-12 00:46:31 +02:00
parent 81c6d4afd6
commit a757595ce7
2 changed files with 94 additions and 45 deletions

View File

@ -52,6 +52,7 @@ GLSpectrum::GLSpectrum(QWidget* parent) :
m_displayMaxHold(false), m_displayMaxHold(false),
m_currentSpectrum(0), m_currentSpectrum(0),
m_displayCurrent(false), m_displayCurrent(false),
m_leftMargin(0),
m_waterfallBuffer(0), m_waterfallBuffer(0),
m_waterfallBufferPos(0), m_waterfallBufferPos(0),
m_waterfallTextureHeight(-1), m_waterfallTextureHeight(-1),
@ -1036,7 +1037,7 @@ void GLSpectrum::applyChanges()
int frequencyScaleTop = 0; int frequencyScaleTop = 0;
int histogramTop = 0; int histogramTop = 0;
int histogramHeight = 20; int histogramHeight = 20;
int leftMargin; //int m_leftMargin;
int rightMargin = fm.width("000"); int rightMargin = fm.width("000");
// displays both histogram and waterfall // displays both histogram and waterfall
@ -1092,46 +1093,46 @@ void GLSpectrum::applyChanges()
m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel); m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel);
} }
leftMargin = m_timeScale.getScaleWidth(); m_leftMargin = m_timeScale.getScaleWidth();
if(m_powerScale.getScaleWidth() > leftMargin) if(m_powerScale.getScaleWidth() > m_leftMargin)
{ {
leftMargin = m_powerScale.getScaleWidth(); m_leftMargin = m_powerScale.getScaleWidth();
} }
leftMargin += 2 * M; m_leftMargin += 2 * M;
m_frequencyScale.setSize(width() - leftMargin - rightMargin); m_frequencyScale.setSize(width() - m_leftMargin - rightMargin);
m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2); m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2);
m_frequencyScale.setMakeOpposite(m_lsbDisplay); m_frequencyScale.setMakeOpposite(m_lsbDisplay);
m_glWaterfallBoxMatrix.setToIdentity(); m_glWaterfallBoxMatrix.setToIdentity();
m_glWaterfallBoxMatrix.translate( m_glWaterfallBoxMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*waterfallTop) / (float) height()) 1.0f - ((float)(2*waterfallTop) / (float) height())
); );
m_glWaterfallBoxMatrix.scale( m_glWaterfallBoxMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / (float) width(), ((float) 2 * (width() - m_leftMargin - rightMargin)) / (float) width(),
(float) (-2*waterfallHeight) / (float) height() (float) (-2*waterfallHeight) / (float) height()
); );
m_glHistogramBoxMatrix.setToIdentity(); m_glHistogramBoxMatrix.setToIdentity();
m_glHistogramBoxMatrix.translate( m_glHistogramBoxMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*histogramTop) / (float) height()) 1.0f - ((float)(2*histogramTop) / (float) height())
); );
m_glHistogramBoxMatrix.scale( m_glHistogramBoxMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / (float) width(), ((float) 2 * (width() - m_leftMargin - rightMargin)) / (float) width(),
(float) (-2*histogramHeight) / (float) height() (float) (-2*histogramHeight) / (float) height()
); );
m_glHistogramSpectrumMatrix.setToIdentity(); m_glHistogramSpectrumMatrix.setToIdentity();
m_glHistogramSpectrumMatrix.translate( m_glHistogramSpectrumMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*histogramTop) / (float) height()) 1.0f - ((float)(2*histogramTop) / (float) height())
); );
m_glHistogramSpectrumMatrix.scale( m_glHistogramSpectrumMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / ((float) width() * (float)(m_fftSize - 1)), ((float) 2 * (width() - m_leftMargin - rightMargin)) / ((float) width() * (float)(m_fftSize - 1)),
((float) 2*histogramHeight / height()) / m_powerRange ((float) 2*histogramHeight / height()) / m_powerRange
); );
@ -1155,7 +1156,7 @@ void GLSpectrum::applyChanges()
m_glLeftScaleBoxMatrix.setToIdentity(); m_glLeftScaleBoxMatrix.setToIdentity();
m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f);
m_glLeftScaleBoxMatrix.scale( m_glLeftScaleBoxMatrix.scale(
(float)(2*(leftMargin - 1)) / (float) width(), (float)(2*(m_leftMargin - 1)) / (float) width(),
-2.0f -2.0f
); );
} }
@ -1195,20 +1196,20 @@ void GLSpectrum::applyChanges()
} }
} }
leftMargin = m_timeScale.getScaleWidth(); m_leftMargin = m_timeScale.getScaleWidth();
leftMargin += 2 * M; m_leftMargin += 2 * M;
m_frequencyScale.setSize(width() - leftMargin - rightMargin); m_frequencyScale.setSize(width() - m_leftMargin - rightMargin);
m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2.0, m_centerFrequency + m_sampleRate / 2.0); m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2.0, m_centerFrequency + m_sampleRate / 2.0);
m_frequencyScale.setMakeOpposite(m_lsbDisplay); m_frequencyScale.setMakeOpposite(m_lsbDisplay);
m_glWaterfallBoxMatrix.setToIdentity(); m_glWaterfallBoxMatrix.setToIdentity();
m_glWaterfallBoxMatrix.translate( m_glWaterfallBoxMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*topMargin) / (float) height()) 1.0f - ((float)(2*topMargin) / (float) height())
); );
m_glWaterfallBoxMatrix.scale( m_glWaterfallBoxMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / (float) width(), ((float) 2 * (width() - m_leftMargin - rightMargin)) / (float) width(),
(float) (-2*waterfallHeight) / (float) height() (float) (-2*waterfallHeight) / (float) height()
); );
@ -1232,7 +1233,7 @@ void GLSpectrum::applyChanges()
m_glLeftScaleBoxMatrix.setToIdentity(); m_glLeftScaleBoxMatrix.setToIdentity();
m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f);
m_glLeftScaleBoxMatrix.scale( m_glLeftScaleBoxMatrix.scale(
(float)(2*(leftMargin - 1)) / (float) width(), (float)(2*(m_leftMargin - 1)) / (float) width(),
-2.0f -2.0f
); );
} }
@ -1247,30 +1248,30 @@ void GLSpectrum::applyChanges()
m_powerScale.setSize(histogramHeight); m_powerScale.setSize(histogramHeight);
m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel); m_powerScale.setRange(Unit::Decibel, m_referenceLevel - m_powerRange, m_referenceLevel);
leftMargin = m_powerScale.getScaleWidth(); m_leftMargin = m_powerScale.getScaleWidth();
leftMargin += 2 * M; m_leftMargin += 2 * M;
m_frequencyScale.setSize(width() - leftMargin - rightMargin); m_frequencyScale.setSize(width() - m_leftMargin - rightMargin);
m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2); m_frequencyScale.setRange(Unit::Frequency, m_centerFrequency - m_sampleRate / 2, m_centerFrequency + m_sampleRate / 2);
m_frequencyScale.setMakeOpposite(m_lsbDisplay); m_frequencyScale.setMakeOpposite(m_lsbDisplay);
m_glHistogramSpectrumMatrix.setToIdentity(); m_glHistogramSpectrumMatrix.setToIdentity();
m_glHistogramSpectrumMatrix.translate( m_glHistogramSpectrumMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*histogramTop) / (float) height()) 1.0f - ((float)(2*histogramTop) / (float) height())
); );
m_glHistogramSpectrumMatrix.scale( m_glHistogramSpectrumMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / ((float) width() * (float)(m_fftSize - 1)), ((float) 2 * (width() - m_leftMargin - rightMargin)) / ((float) width() * (float)(m_fftSize - 1)),
((float) 2*(height() - topMargin - frequencyScaleHeight) / height()) / m_powerRange ((float) 2*(height() - topMargin - frequencyScaleHeight) / height()) / m_powerRange
); );
m_glHistogramBoxMatrix.setToIdentity(); m_glHistogramBoxMatrix.setToIdentity();
m_glHistogramBoxMatrix.translate( m_glHistogramBoxMatrix.translate(
-1.0f + ((float)(2*leftMargin) / (float) width()), -1.0f + ((float)(2*m_leftMargin) / (float) width()),
1.0f - ((float)(2*histogramTop) / (float) height()) 1.0f - ((float)(2*histogramTop) / (float) height())
); );
m_glHistogramBoxMatrix.scale( m_glHistogramBoxMatrix.scale(
((float) 2 * (width() - leftMargin - rightMargin)) / (float) width(), ((float) 2 * (width() - m_leftMargin - rightMargin)) / (float) width(),
(float) (-2*(height() - topMargin - frequencyScaleHeight)) / (float) height() (float) (-2*(height() - topMargin - frequencyScaleHeight)) / (float) height()
); );
@ -1294,13 +1295,13 @@ void GLSpectrum::applyChanges()
m_glLeftScaleBoxMatrix.setToIdentity(); m_glLeftScaleBoxMatrix.setToIdentity();
m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f); m_glLeftScaleBoxMatrix.translate(-1.0f, 1.0f);
m_glLeftScaleBoxMatrix.scale( m_glLeftScaleBoxMatrix.scale(
(float)(2*(leftMargin - 1)) / (float) width(), (float)(2*(m_leftMargin - 1)) / (float) width(),
-2.0f -2.0f
); );
} }
else else
{ {
leftMargin = 2; m_leftMargin = 2;
waterfallHeight = 0; waterfallHeight = 0;
} }
@ -1338,7 +1339,7 @@ void GLSpectrum::applyChanges()
QMatrix4x4 glMatrixDsb; QMatrix4x4 glMatrixDsb;
glMatrixDsb.setToIdentity(); glMatrixDsb.setToIdentity();
glMatrixDsb.translate( glMatrixDsb.translate(
-1.0f + 2.0f * ((leftMargin + m_frequencyScale.getPosFromValue(xc - (dsbw/2))) / (float) width()), -1.0f + 2.0f * ((m_leftMargin + m_frequencyScale.getPosFromValue(xc - (dsbw/2))) / (float) width()),
1.0f 1.0f
); );
glMatrixDsb.scale( glMatrixDsb.scale(
@ -1352,7 +1353,7 @@ void GLSpectrum::applyChanges()
(float) waterfallTop / (float) height() (float) waterfallTop / (float) height()
); );
dv->m_glMatrixDsbWaterfall.scale( dv->m_glMatrixDsbWaterfall.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) waterfallHeight / (float) height() (float) waterfallHeight / (float) height()
); );
@ -1362,7 +1363,7 @@ void GLSpectrum::applyChanges()
(float) histogramTop / (float) height() (float) histogramTop / (float) height()
); );
dv->m_glMatrixDsbHistogram.scale( dv->m_glMatrixDsbHistogram.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) histogramHeight / (float) height() (float) histogramHeight / (float) height()
); );
@ -1372,7 +1373,7 @@ void GLSpectrum::applyChanges()
(float) frequencyScaleTop / (float) height() (float) frequencyScaleTop / (float) height()
); );
dv->m_glMatrixDsbFreqScale.scale( dv->m_glMatrixDsbFreqScale.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) frequencyScaleHeight / (float) height() (float) frequencyScaleHeight / (float) height()
); );
@ -1381,7 +1382,7 @@ void GLSpectrum::applyChanges()
QMatrix4x4 glMatrix; QMatrix4x4 glMatrix;
glMatrix.setToIdentity(); glMatrix.setToIdentity();
glMatrix.translate( glMatrix.translate(
-1.0f + 2.0f * ((leftMargin + m_frequencyScale.getPosFromValue(xc + nw)) / (float) width()), -1.0f + 2.0f * ((m_leftMargin + m_frequencyScale.getPosFromValue(xc + nw)) / (float) width()),
1.0f 1.0f
); );
glMatrix.scale( glMatrix.scale(
@ -1395,7 +1396,7 @@ void GLSpectrum::applyChanges()
(float) waterfallTop / (float) height() (float) waterfallTop / (float) height()
); );
dv->m_glMatrixWaterfall.scale( dv->m_glMatrixWaterfall.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) waterfallHeight / (float) height() (float) waterfallHeight / (float) height()
); );
@ -1405,7 +1406,7 @@ void GLSpectrum::applyChanges()
(float) histogramTop / (float) height() (float) histogramTop / (float) height()
); );
dv->m_glMatrixHistogram.scale( dv->m_glMatrixHistogram.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) histogramHeight / (float) height() (float) histogramHeight / (float) height()
); );
@ -1415,14 +1416,14 @@ void GLSpectrum::applyChanges()
(float) frequencyScaleTop / (float) height() (float) frequencyScaleTop / (float) height()
); );
dv->m_glMatrixFreqScale.scale( dv->m_glMatrixFreqScale.scale(
(float) (width() - leftMargin - rightMargin) / (float) width(), (float) (width() - m_leftMargin - rightMargin) / (float) width(),
(float) frequencyScaleHeight / (float) height() (float) frequencyScaleHeight / (float) height()
); );
/* /*
dv->m_glRect.setRect( dv->m_glRect.setRect(
m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency() - dv->m_channelMarker->getBandwidth() / 2) / (float)(width() - leftMargin - rightMargin), m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency() - dv->m_channelMarker->getBandwidth() / 2) / (float)(width() - m_leftMargin - rightMargin),
0, 0,
(dv->m_channelMarker->getBandwidth() / (float)m_sampleRate), (dv->m_channelMarker->getBandwidth() / (float)m_sampleRate),
1); 1);
@ -1430,7 +1431,7 @@ void GLSpectrum::applyChanges()
if(m_displayHistogram || m_displayMaxHold || m_displayCurrent || m_displayWaterfall) if(m_displayHistogram || m_displayMaxHold || m_displayCurrent || m_displayWaterfall)
{ {
dv->m_rect.setRect(m_frequencyScale.getPosFromValue(xc) + leftMargin - 1, dv->m_rect.setRect(m_frequencyScale.getPosFromValue(xc) + m_leftMargin - 1,
topMargin, topMargin,
5, 5,
height() - topMargin - bottomMargin); height() - topMargin - bottomMargin);
@ -1438,7 +1439,7 @@ void GLSpectrum::applyChanges()
/* /*
if(m_displayHistogram || m_displayMaxHold || m_displayWaterfall) { if(m_displayHistogram || m_displayMaxHold || m_displayWaterfall) {
dv->m_rect.setRect(m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency()) + leftMargin - 1, dv->m_rect.setRect(m_frequencyScale.getPosFromValue(m_centerFrequency + dv->m_channelMarker->getCenterFrequency()) + m_leftMargin - 1,
topMargin, topMargin,
5, 5,
height() - topMargin - bottomMargin); height() - topMargin - bottomMargin);
@ -1448,7 +1449,7 @@ void GLSpectrum::applyChanges()
// prepare left scales (time and power) // prepare left scales (time and power)
{ {
m_leftMarginPixmap = QPixmap(leftMargin - 1, height()); m_leftMarginPixmap = QPixmap(m_leftMargin - 1, height());
m_leftMarginPixmap.fill(Qt::black); m_leftMarginPixmap.fill(Qt::black);
{ {
QPainter painter(&m_leftMarginPixmap); QPainter painter(&m_leftMarginPixmap);
@ -1462,7 +1463,7 @@ void GLSpectrum::applyChanges()
tick = &(*tickList)[i]; tick = &(*tickList)[i];
if(tick->major) { if(tick->major) {
if(tick->textSize > 0) if(tick->textSize > 0)
painter.drawText(QPointF(leftMargin - M - tick->textSize, waterfallTop + fm.ascent() + tick->textPos), tick->text); painter.drawText(QPointF(m_leftMargin - M - tick->textSize, waterfallTop + fm.ascent() + tick->textPos), tick->text);
} }
} }
} }
@ -1472,7 +1473,7 @@ void GLSpectrum::applyChanges()
tick = &(*tickList)[i]; tick = &(*tickList)[i];
if(tick->major) { if(tick->major) {
if(tick->textSize > 0) if(tick->textSize > 0)
painter.drawText(QPointF(leftMargin - M - tick->textSize, histogramTop + histogramHeight - tick->textPos - 1), tick->text); painter.drawText(QPointF(m_leftMargin - M - tick->textSize, histogramTop + histogramHeight - tick->textPos - 1), tick->text);
} }
} }
} }
@ -1489,7 +1490,7 @@ void GLSpectrum::applyChanges()
painter.setPen(Qt::NoPen); painter.setPen(Qt::NoPen);
painter.setBrush(Qt::black); painter.setBrush(Qt::black);
painter.setBrush(Qt::transparent); painter.setBrush(Qt::transparent);
painter.drawRect(leftMargin, 0, width() - leftMargin, frequencyScaleHeight); painter.drawRect(m_leftMargin, 0, width() - m_leftMargin, frequencyScaleHeight);
painter.setPen(QColor(0xf0, 0xf0, 0xff)); painter.setPen(QColor(0xf0, 0xf0, 0xff));
painter.setFont(font()); painter.setFont(font());
const ScaleEngine::TickList* tickList = &m_frequencyScale.getTickList(); const ScaleEngine::TickList* tickList = &m_frequencyScale.getTickList();
@ -1498,7 +1499,7 @@ void GLSpectrum::applyChanges()
tick = &(*tickList)[i]; tick = &(*tickList)[i];
if(tick->major) { if(tick->major) {
if(tick->textSize > 0) if(tick->textSize > 0)
painter.drawText(QPointF(leftMargin + tick->textPos, fm.height() + fm.ascent() / 2 - 1), tick->text); painter.drawText(QPointF(m_leftMargin + tick->textPos, fm.height() + fm.ascent() / 2 - 1), tick->text);
} }
} }
@ -1537,7 +1538,7 @@ void GLSpectrum::applyChanges()
ftext = ftext + " "; ftext = ftext + " ";
shift = - fm.width(ftext); shift = - fm.width(ftext);
} }
painter.drawText(QPointF(leftMargin + m_frequencyScale.getPosFromValue(xc) + shift, 2*fm.height() + fm.ascent() / 2 - 1), ftext); painter.drawText(QPointF(m_leftMargin + m_frequencyScale.getPosFromValue(xc) + shift, 2*fm.height() + fm.ascent() / 2 - 1), ftext);
} }
} }
@ -1741,6 +1742,52 @@ void GLSpectrum::mouseReleaseEvent(QMouseEvent*)
} }
} }
void GLSpectrum::wheelEvent(QWheelEvent *event)
{
int mul;
if (event->modifiers() & Qt::ShiftModifier) {
mul = 100;
} else if (event->modifiers() & Qt::ControlModifier) {
mul = 10;
} else {
mul = 1;
}
for (int i = 0; i < m_channelMarkerStates.size(); ++i)
{
if (m_channelMarkerStates[i]->m_rect.contains(event->pos()))
{
int freq = m_channelMarkerStates[i]->m_channelMarker->getCenterFrequency();
if (event->delta() > 0) {
freq += 10 * mul;
} else if (event->delta() < 0) {
freq -= 10 * mul;
}
// calculate scale relative cursor position for new frequency
float x_pos = m_frequencyScale.getPosFromValue(m_centerFrequency + freq);
if ((x_pos >= 0.0) && (x_pos < m_frequencyScale.getSize())) // cursor must be in scale
{
m_channelMarkerStates[i]->m_channelMarker->setCenterFrequencyByCursor(freq);
m_channelMarkerStates[i]->m_channelMarker->setCenterFrequency(freq);
// cursor follow-up
int xd = x_pos + m_leftMargin;
QCursor c = cursor();
QPoint cp_a = c.pos();
QPoint cp_w = mapFromGlobal(cp_a);
cp_w.setX(xd);
cp_a = mapToGlobal(cp_w);
c.setPos(cp_a);
setCursor(c);
}
}
}
}
void GLSpectrum::enterEvent(QEvent* event) void GLSpectrum::enterEvent(QEvent* event)
{ {
m_mouseInside = true; m_mouseInside = true;

View File

@ -151,6 +151,7 @@ private:
Real m_waterfallShare; Real m_waterfallShare;
int m_leftMargin;
QPixmap m_leftMarginPixmap; QPixmap m_leftMarginPixmap;
QPixmap m_frequencyPixmap; QPixmap m_frequencyPixmap;
ScaleEngine m_timeScale; ScaleEngine m_timeScale;
@ -211,6 +212,7 @@ private:
void mouseMoveEvent(QMouseEvent* event); void mouseMoveEvent(QMouseEvent* event);
void mousePressEvent(QMouseEvent* event); void mousePressEvent(QMouseEvent* event);
void mouseReleaseEvent(QMouseEvent* event); void mouseReleaseEvent(QMouseEvent* event);
void wheelEvent(QWheelEvent*);
void enterEvent(QEvent* event); void enterEvent(QEvent* event);
void leaveEvent(QEvent* event); void leaveEvent(QEvent* event);