#include #include "mainwindow.h" MainWindow::MainWindow() { setWindowTitle(tr("inspectrum")); scrollArea.setWidget(&spectrogram); scrollArea.viewport()->installEventFilter(this); setCentralWidget(&scrollArea); dock = new SpectrogramControls(tr("Controls"), this); dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); addDockWidget(Qt::LeftDockWidgetArea, dock); connect(dock->fileOpenButton, SIGNAL(clicked()), &spectrogram, SLOT(pickFile())); connect(dock->sampleRate, SIGNAL(textChanged(QString)), this, SLOT(setSampleRate(QString))); connect(dock, SIGNAL(fftSizeChanged(int)), this, SLOT(setFFTSize(int))); connect(dock->zoomLevelSlider, SIGNAL(valueChanged(int)), this, SLOT(setZoomLevel(int))); connect(dock->powerSlider, SIGNAL(upperValueChanged(int)), &spectrogram, SLOT(setPowerMax(int))); connect(dock->powerSlider, SIGNAL(lowerValueChanged(int)), &spectrogram, SLOT(setPowerMin(int))); } bool MainWindow::eventFilter(QObject * /*obj*/, QEvent *event) { if (event->type() == QEvent::Wheel) { QWheelEvent *wheelEvent = (QWheelEvent*)event; QSlider *slider = nullptr; if (QApplication::keyboardModifiers() & Qt::ControlModifier) { slider = dock->zoomLevelSlider; } else if (QApplication::keyboardModifiers() & Qt::ShiftModifier) { slider = dock->fftSizeSlider; } if (slider != nullptr) { if (wheelEvent->angleDelta().y() > 0) { slider->setValue(slider->value() + 1); } else if (wheelEvent->angleDelta().y() < 0) { slider->setValue(slider->value() - 1); } return true; } } return false; } void MainWindow::setSampleRate(QString rate) { spectrogram.setSampleRate(rate.toInt()); } void MainWindow::setFFTSize(int size) { off_t sample = getCenterSample(); spectrogram.setFFTSize(size); scrollArea.verticalScrollBar()->setValue(getScrollPos(sample)); } void MainWindow::setZoomLevel(int zoom) { off_t sample = getCenterSample(); spectrogram.setZoomLevel(zoom); scrollArea.verticalScrollBar()->setValue(getScrollPos(sample)); } off_t MainWindow::getCenterSample() { int height = scrollArea.height(); return (scrollArea.verticalScrollBar()->value() + height / 2) * spectrogram.getStride(); } int MainWindow::getScrollPos(off_t sample) { int height = scrollArea.height(); return sample / spectrogram.getStride() - height / 2; }