From 6bd7bc4cca7d2061e6fce334f25fec450f0b0f2b Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Wed, 25 Aug 2021 12:27:08 -0700 Subject: [PATCH] timeline: copy waveform when copying --- app/audio/audiovisualwaveform.cpp | 15 ++++++++++++--- app/audio/audiovisualwaveform.h | 2 ++ app/widget/timelinewidget/tool/pointer.cpp | 3 +++ .../timelinewidget/undo/timelineundosplit.cpp | 5 +++++ 4 files changed, 22 insertions(+), 3 deletions(-) diff --git a/app/audio/audiovisualwaveform.cpp b/app/audio/audiovisualwaveform.cpp index b26d01889..82c9a3b2d 100644 --- a/app/audio/audiovisualwaveform.cpp +++ b/app/audio/audiovisualwaveform.cpp @@ -164,7 +164,7 @@ void AudioVisualWaveform::OverwriteSums(const AudioVisualWaveform &sums, const r copy_len * sizeof(SamplePerChannel)); } - length_ = qMax(length_, dest + length); + length_ = qMax(length_, dest + ((length.isNull()) ? sums.length() - offset : length)); } void AudioVisualWaveform::OverwriteSilence(const rational &start, const rational &length) @@ -233,7 +233,7 @@ void AudioVisualWaveform::Shift(const rational &from, const rational &to) } } - length_ += (to-from); + length_ = qMax(rational(0), length_ + (to-from)); } void AudioVisualWaveform::TrimIn(const rational &length) @@ -256,7 +256,16 @@ void AudioVisualWaveform::TrimIn(const rational &length) } } - length_ -= length; + length_ = qMax(rational(0), length_ - length); +} + +AudioVisualWaveform AudioVisualWaveform::Mid(const rational &offset) const +{ + AudioVisualWaveform mid = *this; + + mid.TrimIn(offset); + + return mid; } AudioVisualWaveform::Sample AudioVisualWaveform::GetSummaryFromTime(const rational &start, const rational &length) const diff --git a/app/audio/audiovisualwaveform.h b/app/audio/audiovisualwaveform.h index eb8847a51..33cce0fdd 100644 --- a/app/audio/audiovisualwaveform.h +++ b/app/audio/audiovisualwaveform.h @@ -94,6 +94,8 @@ public: void TrimIn(const rational &length); + AudioVisualWaveform Mid(const rational &offset) const; + Sample GetSummaryFromTime(const rational& start, const rational& length) const; static Sample SumSamples(const float* samples, int nb_samples, int nb_channels); diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 1913e0cd6..3ae226ee0 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -605,6 +605,9 @@ void PointerTool::FinishDrag(TimelineViewMouseEvent *event) // Duplicate rather than move // Place the copy instead of the original block block = static_cast(Node::CopyNodeInGraph(block, command)); + if (ClipBlock *new_clip = dynamic_cast(block)) { + new_clip->waveform() = static_cast(p.block)->waveform(); + } } const Track::Reference& track_ref = p.ghost->GetAdjustedTrack(); diff --git a/app/widget/timelinewidget/undo/timelineundosplit.cpp b/app/widget/timelinewidget/undo/timelineundosplit.cpp index 787228442..05c3b2707 100644 --- a/app/widget/timelinewidget/undo/timelineundosplit.cpp +++ b/app/widget/timelinewidget/undo/timelineundosplit.cpp @@ -20,6 +20,7 @@ #include "timelineundosplit.h" +#include "node/block/clip/clip.h" #include "node/block/transition/transition.h" #include "widget/nodeview/nodeviewundo.h" @@ -37,6 +38,10 @@ void BlockSplitCommand::redo() if (!reconnect_tree_command_) { reconnect_tree_command_ = new MultiUndoCommand(); new_block_ = static_cast(Node::CopyNodeInGraph(block_, reconnect_tree_command_)); + if (ClipBlock *new_clip = dynamic_cast(new_block_)) { + ClipBlock *old_clip = static_cast(block_); + new_clip->waveform() = old_clip->waveform(); + } } reconnect_tree_command_->redo_now();