diff --git a/src/UI/DocumentViews/AudioVisualizer.cc b/src/UI/DocumentViews/AudioVisualizer.cc index 3a24341575ad12804254e2181ece722297017d20..e34843b825f2b27cda75351bcf59778beb79fcb7 100644 --- a/src/UI/DocumentViews/AudioVisualizer.cc +++ b/src/UI/DocumentViews/AudioVisualizer.cc @@ -81,4 +81,6 @@ AudioVisualizer::printSpectrum(QImage pixmap, AudioContext::StreamPtr stream) no connect(params->getZoomSlider(), &QSlider::valueChanged, timingScene->getAxis(), &TimingAxis::refreshTicks); + connect(params->getRebuildSceneButton(), &QPushButton::released, timingScene, + &TimingScene::rebuildScene); } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc index 94b1c7f1abe7440b615f0383531337a0a04e7ab0..248dd011eddb570a8e93cbe6a4c04fea4d093c65 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingAxis.cc @@ -30,7 +30,7 @@ TimingAxis::TimingAxis(AudioContext::StreamPtr stream, int height_, int width_) QRectF TimingAxis::boundingRect() const { - return QRectF(0, penWidth, width + 2*penWidth, -height - penWidth); + return QRectF(0, penWidth, width + 2 * penWidth, -height - penWidth); } /* @@ -40,10 +40,10 @@ TimingAxis::boundingRect() const void TimingAxis::refreshTicks() { - int nbAvailableTicks = availableTicks.size(); - int minorTicksIndex = 0; + int nbAvailableTicks = availableTicks.size(); + int minorTicksIndex = 0; int length{ int(audioStream->getLength()) }; - if (width != 0 && length != 0){ + if (width != 0 && length != 0) { for (minorTicksIndex = 0; minorTicksIndex < nbAvailableTicks; minorTicksIndex++) { if (width * availableTicks[minorTicksIndex] / length >= minBetweenMinor) { break; diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingParams.cc b/src/UI/DocumentViews/AudioVisualizer/TimingParams.cc index c50397b15314843d02847c14463b73580b5c883c..83baf547a6ee6dab30d83d27835d7496a1a09ba8 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingParams.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingParams.cc @@ -5,7 +5,9 @@ using namespace Vivy; TimingParams::TimingParams(QWidget *parent) noexcept : QWidget(parent) { - QHBoxLayout *layout = new QHBoxLayout; + QVBoxLayout *vlayout = new QVBoxLayout; + QHBoxLayout *hlayout = new QHBoxLayout; + vlayout->addLayout(hlayout); zoomSlider = std::make_unique<QSlider>(new QSlider(Qt::Vertical)); if (QSlider *slider = zoomSlider.get()) { @@ -14,7 +16,7 @@ TimingParams::TimingParams(QWidget *parent) noexcept slider->setSingleStep(0); slider->setPageStep(0); slider->setValue(0); - layout->addWidget(slider); + hlayout->addWidget(slider); } sensibilitySlider = std::make_unique<QSlider>(new QSlider(Qt::Vertical)); if (QSlider *slider = sensibilitySlider.get()) { @@ -23,10 +25,15 @@ TimingParams::TimingParams(QWidget *parent) noexcept slider->setSingleStep(0); slider->setPageStep(0); slider->setValue(0); - layout->addWidget(slider); + hlayout->addWidget(slider); } - setLayout(layout); + rebuildSceneButton = std::make_unique<QPushButton>(new QPushButton(QString("Rebuild scene"))); + if (QPushButton *button = rebuildSceneButton.get()) { + vlayout->addWidget(button); + } + + setLayout(vlayout); } QSlider * @@ -40,3 +47,9 @@ TimingParams::getSensibilitySlider() const noexcept { return sensibilitySlider.get(); } + +QPushButton * +TimingParams::getRebuildSceneButton() const noexcept +{ + return rebuildSceneButton.get(); +} diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh b/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh index 5b9e8c388b05a2c9d6357de0a666ea5db340f535..09d56ce2339686a97ed499247207f35ad0ea64b4 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingParams.hh @@ -10,6 +10,7 @@ #include <QWidget> #include <QSlider> #include <QLayout> +#include <QPushButton> namespace Vivy { @@ -22,10 +23,12 @@ public: private: std::unique_ptr<QSlider> zoomSlider; std::unique_ptr<QSlider> sensibilitySlider; + std::unique_ptr<QPushButton> rebuildSceneButton; public: QSlider *getZoomSlider() const noexcept; QSlider *getSensibilitySlider() const noexcept; + QPushButton *getRebuildSceneButton() const noexcept; }; } diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc index 230827e017d68c6d8861f4c1ed7a103251f494f2..a99fd4b02fef2cd6938828e5147966249b98f488 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc +++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.cc @@ -30,14 +30,33 @@ TimingScene::TimingScene(QImage img_, AudioContext::StreamPtr stream, QWidget *p , img(img_) , audioStream(stream) { - int timingAxisHeight = 30; + rebuildScene(); +} + +void +TimingScene::updateScene(QImage img_, AudioContext::StreamPtr stream_) +{ + img = img_; + audioStream = stream_; + rebuildScene(); +} + +void +TimingScene::rebuildScene() +{ + for (auto &item : items()) { + removeItem(item); + delete (item); + } // We put a common origin for the items at the bottom of the axis + int timingAxisHeight = 30; + QPixmap pixmap(QPixmap::fromImage(img)); backgroundImg = addPixmap(pixmap); backgroundImg->setPos(0, timingAxisHeight); - ax = new TimingAxis(stream, timingAxisHeight, pixmap.width()); + ax = new TimingAxis(audioStream, timingAxisHeight, pixmap.width()); addItem(ax); ax->setPos(0, timingAxisHeight); diff --git a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh index 306a76558dc0e95791ed30d5aad07643de84e780..87779e0cf6f3ab9cf8f500284451f5d8fc649411 100644 --- a/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh +++ b/src/UI/DocumentViews/AudioVisualizer/TimingScene.hh @@ -28,7 +28,7 @@ private: AudioContext::StreamPtr audioStream; Ass::LineWeakPtr currentLine{}; TimingMode timingMode{ TimingMode::Line }; - TimingAxis *ax; + TimingAxis *ax{ nullptr }; public: QGraphicsPixmapItem *bg() noexcept; @@ -46,6 +46,8 @@ private: inline int posFromTime(int t) const noexcept; public slots: + void updateScene(QImage, AudioContext::StreamPtr); + void rebuildScene(); }; }