// Make a single zoom step on the X axis. void CPlotter::zoomStepX(float step, int x) { // calculate new range shown on FFT float new_range = qBound(10.0f, (float)(m_Span) * step, (float)(m_SampleFreq) * 10.0f); // Frequency where event occured is kept fixed under mouse float ratio = (float)x / (float)m_OverlayPixmap.width(); float fixed_hz = freqFromX(x); float f_max = fixed_hz + (1.0 - ratio) * new_range; float f_min = f_max - new_range; qint64 fc = (qint64)(f_min + (f_max - f_min) / 2.0); setFftCenterFreq(fc - m_CenterFreq); setSpanFreq((quint32)new_range); float factor = (float)m_SampleFreq / (float)m_Span; qDebug() << QString("Spectrum zoom: %1x").arg(factor, 0, 'f', 1); m_PeakHoldValid = false; }
////////////////////////////////////////////////////////////////////// // Called when a mouse wheel is turned ////////////////////////////////////////////////////////////////////// void CPlotter::wheelEvent(QWheelEvent * event) { QPoint pt = event->pos(); int numDegrees = event->delta() / 8; int numSteps = numDegrees / 15; /** FIXME: Only used for direction **/ /** FIXME: zooming could use some optimisation **/ if (m_CursorCaptured == YAXIS) { // Vertical zoom. Wheel down: zoom out, wheel up: zoom in // During zoom we try to keep the point (dB or kHz) under the cursor fixed float zoom_fac = event->delta() < 0 ? 1.1 : 0.9; float ratio = (float)pt.y() / (float)m_OverlayPixmap.height(); float db_range = (float)(m_MaxdB - m_MindB); float y_range = (float)m_OverlayPixmap.height(); float db_per_pix = db_range / y_range; float fixed_db = m_MaxdB - pt.y() * db_per_pix; db_range = qBound(1.0f, db_range * zoom_fac, 2000.0f); m_MaxdB = fixed_db + ratio*db_range; m_MindB = m_MaxdB - db_range; } else if (m_CursorCaptured == XAXIS) { // calculate new range shown on FFT float zoom_factor = event->delta() < 0 ? 1.1 : 0.9; float new_range = qBound(10.0f, (float)(m_Span) * zoom_factor, (float)(m_SampleFreq) * 10.0f); // Frequency where event occured is kept fixed under mouse float ratio = (float)pt.x() / (float)m_OverlayPixmap.width(); float fixed_hz = freqFromX(pt.x()); float f_max = fixed_hz + (1.0 - ratio) * new_range; float f_min = f_max - new_range; qint64 fc = (qint64)(f_min + (f_max - f_min) / 2.0); setFftCenterFreq(fc-m_CenterFreq); setSpanFreq((quint32)new_range); zoom_factor = (float)m_SampleFreq/(float)m_Span; qDebug() << QString("Spectrum zoom: %1x").arg(zoom_factor, 0, 'f', 1); } else if (event->modifiers() & Qt::ControlModifier) { // filter width m_DemodLowCutFreq -= numSteps*m_ClickResolution; m_DemodHiCutFreq += numSteps*m_ClickResolution; clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); } else if (event->modifiers() & Qt::ShiftModifier) { // filter shift m_DemodLowCutFreq += numSteps*m_ClickResolution; m_DemodHiCutFreq += numSteps*m_ClickResolution; clampDemodParameters(); emit newFilterFreq(m_DemodLowCutFreq, m_DemodHiCutFreq); } else { // inc/dec demod frequency m_DemodCenterFreq += (numSteps*m_ClickResolution); m_DemodCenterFreq = roundFreq(m_DemodCenterFreq, m_ClickResolution ); emit newDemodFreq(m_DemodCenterFreq, m_DemodCenterFreq-m_CenterFreq); } if (m_Running) m_DrawOverlay = true; else drawOverlay(); }
/*! \brief Reset horizontal zoom to 100% and centered around 0. */ void CPlotter::resetHorizontalZoom(void) { setFftCenterFreq(0); setSpanFreq((qint32)m_SampleFreq); }