From d82f484c4c0ff1e1abdeea1d23346ea49561d3e3 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 30 Nov 2020 08:57:51 +1100 Subject: [PATCH] audiowaveformview: on validation, only update visible sections --- app/widget/viewer/audiowaveformview.cpp | 31 ++++++++++++++++++++++--- app/widget/viewer/audiowaveformview.h | 2 ++ 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/app/widget/viewer/audiowaveformview.cpp b/app/widget/viewer/audiowaveformview.cpp index 3eb1bd549..287de2caa 100644 --- a/app/widget/viewer/audiowaveformview.cpp +++ b/app/widget/viewer/audiowaveformview.cpp @@ -43,7 +43,7 @@ AudioWaveformView::AudioWaveformView(QWidget *parent) : void AudioWaveformView::SetViewer(AudioPlaybackCache *playback) { if (playback_) { - disconnect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdate); + disconnect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdateOfRange); disconnect(playback_, &AudioPlaybackCache::ParametersChanged, this, &AudioWaveformView::BackendParamsChanged); SetTimebase(0); @@ -52,7 +52,7 @@ void AudioWaveformView::SetViewer(AudioPlaybackCache *playback) playback_ = playback; if (playback_) { - connect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdate); + connect(playback_, &AudioPlaybackCache::Validated, this, &AudioWaveformView::ForceUpdateOfRange); connect(playback_, &AudioPlaybackCache::ParametersChanged, this, &AudioWaveformView::BackendParamsChanged); SetTimebase(playback_->GetParameters().time_base()); @@ -86,7 +86,6 @@ void AudioWaveformView::paintEvent(QPaintEvent *event) ActiveCache& cache = cached_waveform_[i]; int slice_start = width()/cached_waveform_.size() * i; - int slice_end = width()/cached_waveform_.size() * (i+1); if (cache.info == wanted_info) { @@ -95,6 +94,8 @@ void AudioWaveformView::paintEvent(QPaintEvent *event) } else if (cache.caching_info != wanted_info) { + int slice_end = width()/cached_waveform_.size() * (i+1); + // Pixmap is obsolete, will need to draw again // Delete any existing watcher so we don't receive the signal @@ -183,6 +184,27 @@ void AudioWaveformView::ForceUpdate() update(); } +void AudioWaveformView::ForceUpdateOfRange(const TimeRange &range) +{ + int in = TimeToScreen(range.in()); + int out = TimeToScreen(range.out()); + + // Don't need to redraw anything + if (out < 0 || in >= width()) { + return; + } + + int start_invalidate = in/cached_waveform_.size(); + int end_invalidate = qMin(cached_waveform_.size()-1, out/cached_waveform_.size()); + + for (int i=start_invalidate; i<=end_invalidate; i++) { + // Invalidate these + cached_waveform_[i].info.size = QSize(); + } + + update(); +} + void AudioWaveformView::BackgroundCacheFinished() { // Retrieve sender @@ -203,6 +225,9 @@ void AudioWaveformView::BackgroundCacheFinished() cached_waveform_[index].pixmap = watcher->result(); cached_waveform_[index].watcher = nullptr; + // Reset size + cached_waveform_[index].caching_info.size = QSize(); + // Update with new pixmap update(); } diff --git a/app/widget/viewer/audiowaveformview.h b/app/widget/viewer/audiowaveformview.h index e1d71ea9a..b8f1ebd49 100644 --- a/app/widget/viewer/audiowaveformview.h +++ b/app/widget/viewer/audiowaveformview.h @@ -83,6 +83,8 @@ private slots: void ForceUpdate(); + void ForceUpdateOfRange(const TimeRange& range); + void BackgroundCacheFinished(); };