diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp index 2a07e5f77a1..ee5225c20f7 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.cpp @@ -166,16 +166,22 @@ void AudioFileProcessorWaveView::mouseMoveEvent(QMouseEvent * me) case DraggingType::SampleLoop: slideSamplePointByPx(Point::Loop, step); break; + case DraggingType::SlideWave: + slide(step); + break; + case DraggingType::ZoomWave: + zoom(me->y() < m_draggingLastPoint.y()); + break; case DraggingType::Wave: default: if (qAbs(me->y() - m_draggingLastPoint.y()) < 2 * qAbs(me->x() - m_draggingLastPoint.x())) { - slide(step); + m_draggingType = DraggingType::SlideWave; } else { - zoom(me->y() < m_draggingLastPoint.y()); + m_draggingType = DraggingType::ZoomWave; } } @@ -376,14 +382,15 @@ void AudioFileProcessorWaveView::zoom(const bool out) void AudioFileProcessorWaveView::slide(int px) { const double fact = qAbs(double(px) / width()); - auto step = range() * fact * (px > 0 ? -1 : 1); + auto step = range() * fact * (px > 0 ? 1 : -1); + + const auto sampleStart = static_cast(m_sample->startFrame()); + const auto sampleEnd = static_cast(m_sample->endFrame()); - const auto stepFrom = std::clamp(m_from + step, 0.0, static_cast(m_sample->sampleSize())) - m_from; - const auto stepTo = std::clamp(m_to + step, m_from + 1.0, static_cast(m_sample->sampleSize())) - m_to; + const auto stepFrom = std::clamp(sampleStart + step, 0.0, static_cast(m_sample->sampleSize())) - sampleStart; + const auto stepTo = std::clamp(sampleEnd + step, sampleStart + 1.0, static_cast(m_sample->sampleSize())) - sampleEnd; step = std::abs(stepFrom) < std::abs(stepTo) ? stepFrom : stepTo; - setFrom(m_from + step); - setTo(m_to + step); slideSampleByFrames(step); } @@ -395,7 +402,7 @@ void AudioFileProcessorWaveView::slideSamplePointByPx(Point point, int px) ); } -void AudioFileProcessorWaveView::slideSamplePointByFrames(Point point, f_cnt_t frames, bool slide_to) +void AudioFileProcessorWaveView::slideSamplePointByFrames(Point point, long frameOffset, bool slideTo) { knob * a_knob = m_startKnob; switch(point) @@ -415,8 +422,8 @@ void AudioFileProcessorWaveView::slideSamplePointByFrames(Point point, f_cnt_t f } else { - const double v = static_cast(frames) / m_sample->sampleSize(); - if (slide_to) + const double v = static_cast(frameOffset) / m_sample->sampleSize(); + if (slideTo) { a_knob->slideTo(v); } @@ -430,13 +437,13 @@ void AudioFileProcessorWaveView::slideSamplePointByFrames(Point point, f_cnt_t f -void AudioFileProcessorWaveView::slideSampleByFrames(f_cnt_t frames) +void AudioFileProcessorWaveView::slideSampleByFrames(long frameOffset) { if (m_sample->sampleSize() <= 1) { return; } - const double v = static_cast(frames) / m_sample->sampleSize(); + const double v = static_cast(frameOffset) / m_sample->sampleSize(); // update knobs in the right order // to avoid them clamping each other if (v < 0) diff --git a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h index 8081d20ca63..1251501b02d 100644 --- a/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h +++ b/plugins/AudioFileProcessor/AudioFileProcessorWaveView.h @@ -118,6 +118,8 @@ public slots: enum class DraggingType { Wave, + SlideWave, + ZoomWave, SampleStart, SampleEnd, SampleLoop @@ -158,8 +160,8 @@ public slots: void zoom(const bool out = false); void slide(int px); void slideSamplePointByPx(Point point, int px); - void slideSamplePointByFrames(Point point, f_cnt_t frames, bool slide_to = false); - void slideSampleByFrames(f_cnt_t frames); + void slideSamplePointByFrames(Point point, long frameOffset, bool slideTo = false); + void slideSampleByFrames(long frameOffset); void slideSamplePointToFrames(Point point, f_cnt_t frames) {