diff --git a/mainwindow.cpp b/mainwindow.cpp index b2e5692..dd31c9b 100644 --- a/mainwindow.cpp +++ b/mainwindow.cpp @@ -35,6 +35,7 @@ MainWindow::MainWindow() setCentralWidget(plots); connect(dock, SIGNAL(fftSizeChanged(int)), plots, SLOT(setFFTSize(int))); + connect(dock->zoomLevelSlider, SIGNAL(valueChanged(int)), plots, SLOT(setZoomLevel(int))); } void MainWindow::openFile(QString fileName) diff --git a/plotview.cpp b/plotview.cpp index fdb75a7..aec5c28 100644 --- a/plotview.cpp +++ b/plotview.cpp @@ -112,6 +112,15 @@ void PlotView::setFFTSize(int size) { fftSize = size; spectrogramPlot->setFFTSize(size); + horizontalScrollBar()->setSingleStep(size * pow(2, zoomLevel)); + horizontalScrollBar()->setPageStep(size * pow(2, zoomLevel) * 10); + viewport()->update(); +} + +void PlotView::setZoomLevel(int zoom) +{ + zoomLevel = zoom; + spectrogramPlot->setZoomLevel(zoom); viewport()->update(); } @@ -119,8 +128,7 @@ void PlotView::paintEvent(QPaintEvent *event) { if (mainSampleSource == nullptr) return; off_t firstSample = horizontalScrollBar()->value(); - // TODO: don't hardcode width - off_t lastSample = firstSample + fftSize * width(); + off_t lastSample = firstSample + fftSize * width() / pow(2, zoomLevel); QRect rect = QRect(0, 0, width(), height()); QPainter painter(viewport()); diff --git a/plotview.h b/plotview.h index ffa5ed2..8caeee5 100644 --- a/plotview.h +++ b/plotview.h @@ -37,6 +37,7 @@ public slots: void selectionChanged(std::pair selectionTime, std::pair selectionFreq); void selectionCleared(); void setFFTSize(int size); + void setZoomLevel(int zoom); protected: void paintEvent(QPaintEvent *event); @@ -50,6 +51,7 @@ private: std::pair selectionFreq; int fftSize; + int zoomLevel; void refreshSources(); }; \ No newline at end of file diff --git a/spectrogramplot.cpp b/spectrogramplot.cpp index 5e519a9..295d1c0 100644 --- a/spectrogramplot.cpp +++ b/spectrogramplot.cpp @@ -118,7 +118,7 @@ void SpectrogramPlot::mousePressEvent(QMouseEvent *event) void SpectrogramPlot::paintMid(QPainter &painter, QRect &rect, range_t sampleRange) { for (int x = rect.left(); x < rect.right(); x += linesPerTile()) { - QPixmap *tile = getPixmapTile(x * fftSize); + QPixmap *tile = getPixmapTile(sampleRange.minimum + x * getStride()); painter.drawPixmap(QRect(x, rect.y(), linesPerTile(), fftSize), *tile); } }