+ if (m_mouseWithinWidget && mouseX < m_innerScopeRect.width()-1) {
+ davinci.setPen(AbstractScopeWidget::penThin);
+
+ x = leftDist + mouseX;
+
+ float db = 0;
+ float freq = ((float) mouseX)/(m_innerScopeRect.width()-1) * m_freqMax;
+ bool drawDb = false;
+
+ m_lastFFTLock.acquire();
+ if (m_lastFFT.size() > 0) {
+ uint right = ((float) m_freqMax)/(m_freq) * (m_lastFFT.size() - 1);
+ QVector<float> dbMap = AudioSpectrum::interpolatePeakPreserving(m_lastFFT, m_innerScopeRect.width(), 0, right, -120);
+
+ db = dbMap[mouseX];
+ y = topDist + m_innerScopeRect.height()-1 - (dbMap[mouseX] - m_dBmin) / (m_dBmax-m_dBmin) * (m_innerScopeRect.height()-1);
+
+ if (y < (int)topDist + m_innerScopeRect.height()-1) {
+ drawDb = true;
+ davinci.drawLine(x, y, leftDist + m_innerScopeRect.width()-1, y);
+ }
+ } else {
+ y = topDist + mouseY;
+ }
+ m_lastFFTLock.release();
+
+ if (y > (int)topDist + mouseY) {
+ y = topDist+ mouseY;
+ }
+ davinci.drawLine(x, y, x, topDist + m_innerScopeRect.height()-1);
+
+ if (drawDb) {
+ QPoint dist(20, -20);
+ QRect rect(
+ leftDist + mouseX + dist.x(),
+ topDist + mouseY + dist.y(),
+ 100,
+ 40
+ );
+ if (rect.right() > (int)leftDist + m_innerScopeRect.width()-1) {
+ // Mirror the rectangle at the y axis to keep it inside the widget
+ rect = QRect(
+ rect.topLeft() - QPoint(rect.width() + 2*dist.x(), 0),
+ rect.size());
+ }
+
+ QRect textRect(
+ rect.topLeft() + QPoint(12, 4),
+ rect.size()
+ );
+
+ davinci.fillRect(rect, AbstractScopeWidget::penBackground.brush());
+ davinci.setPen(AbstractScopeWidget::penLighter);
+ davinci.drawRect(rect);
+ davinci.drawText(textRect, QString(
+ i18n("%1 dB", QString("%1").arg(db, 0, 'f', 2))
+ + "\n"
+ + i18n("%1 kHz", QString("%1").arg(freq/1000, 0, 'f', 2))));
+ }
+
+ }
+