From 07dc7104c5a55ad8682e3efc037cd913716d8bde Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 29 Oct 2020 02:17:50 +1100 Subject: [PATCH] made timerangelist a encapsulation rather than a derivation Locks off functionality that really shouldn't be used. --- app/common/timerange.cpp | 61 ++++++++++++++----- app/common/timerange.h | 55 +++++++++++++++-- app/render/audioplaybackcache.cpp | 2 +- app/render/framehashcache.cpp | 6 +- app/render/playbackcache.cpp | 8 +-- app/render/previewautocacher.cpp | 4 +- app/task/export/export.cpp | 4 +- app/widget/timelinewidget/timelinewidget.cpp | 6 +- .../timelinewidgetselections.cpp | 12 +--- 9 files changed, 115 insertions(+), 43 deletions(-) diff --git a/app/common/timerange.cpp b/app/common/timerange.cpp index fde65bbf3..c53524863 100644 --- a/app/common/timerange.cpp +++ b/app/common/timerange.cpp @@ -176,42 +176,42 @@ void TimeRange::normalize() length_ = out_ - in_; } -void TimeRangeList::InsertTimeRange(TimeRange range_to_add) +void TimeRangeList::insert(TimeRange range_to_add) { // See if list contains this range - if (ContainsTimeRange(range_to_add)) { + if (contains(range_to_add)) { return; } // Does not contain range, so we'll almost certainly be adding it in some way for (int i=0;isize(); for (int i=0;iremoveAt(i); + array_.removeAt(i); i--; sz--; } else if (compare.Contains(remove, false, false)) { // The remove range is within this element, only choice is to split the element into two - this->append(TimeRange(remove.out(), compare.out())); + array_.append(TimeRange(remove.out(), compare.out())); compare.set_out(remove.in()); } else if (compare.in() < remove.in() && compare.out() > remove.in()) { // This element's out point overlaps the range's in, we'll trim it @@ -223,10 +223,10 @@ void TimeRangeList::RemoveTimeRange(const TimeRange &remove) } } -bool TimeRangeList::ContainsTimeRange(const TimeRange &range, bool in_inclusive, bool out_inclusive) const +bool TimeRangeList::contains(const TimeRange &range, bool in_inclusive, bool out_inclusive) const { for (int i=0;i= range.out()) { // No intersect @@ -249,7 +282,7 @@ TimeRangeList TimeRangeList::Intersects(const TimeRange &range) const TimeRange cropped(qMax(range.in(), compare.in()), qMin(range.out(), compare.out())); - intersect_list.append(cropped); + intersect_list.insert(cropped); } } @@ -261,7 +294,7 @@ void TimeRangeList::PrintTimeList() qDebug() << "TimeRangeList now contains:"; for (int i=0;i { +class TimeRangeList { public: TimeRangeList() = default; TimeRangeList(std::initializer_list r) : - QList(r) + array_(r) { } - void InsertTimeRange(TimeRange range_to_add); + void insert(TimeRange range_to_add); - void RemoveTimeRange(const TimeRange& remove); + void remove(const TimeRange& remove); - bool ContainsTimeRange(const TimeRange& range, bool in_inclusive = true, bool out_inclusive = true) const; + bool contains(const TimeRange& range, bool in_inclusive = true, bool out_inclusive = true) const; + + bool isEmpty() const + { + return array_.isEmpty(); + } + + void clear() + { + array_.clear(); + } + + int size() const + { + return array_.size(); + } + + void shift(const rational& diff); + + void trim_in(const rational& diff); + + void trim_out(const rational& diff); TimeRangeList Intersects(const TimeRange& range) const; + using const_iterator = QVector::const_iterator; + + const_iterator begin() const + { + return array_.constBegin(); + } + + const_iterator end() const + { + return array_.constEnd(); + } + + const TimeRange& first() const + { + return array_.first(); + } + + const TimeRange& last() const + { + return array_.last(); + } + private: void PrintTimeList(); + QVector array_; + }; uint qHash(const TimeRange& r, uint seed); diff --git a/app/render/audioplaybackcache.cpp b/app/render/audioplaybackcache.cpp index eda8ae905..595b76620 100644 --- a/app/render/audioplaybackcache.cpp +++ b/app/render/audioplaybackcache.cpp @@ -127,7 +127,7 @@ void AudioPlaybackCache::WritePCM(const TimeRange &range, SampleBufferPtr sample seg_file.close(); - ranges_we_validated.InsertTimeRange(TimeRange(this_write_in_point, this_write_out_point)); + ranges_we_validated.insert(TimeRange(this_write_in_point, this_write_out_point)); } else { qWarning() << "Failed to write PCM data to" << seg_file.fileName(); } diff --git a/app/render/framehashcache.cpp b/app/render/framehashcache.cpp index 387baa12e..37a656acf 100644 --- a/app/render/framehashcache.cpp +++ b/app/render/framehashcache.cpp @@ -90,7 +90,7 @@ void FrameHashCache::ValidateFramesWithHash(const QByteArray &hash) if (iterator.value() == hash) { TimeRange frame_range(iterator.key(), iterator.key() + timebase_); - if (invalidated_ranges.ContainsTimeRange(frame_range)) { + if (invalidated_ranges.contains(frame_range)) { Validate(frame_range); } } @@ -167,7 +167,7 @@ QVector FrameHashCache::GetFrameListFromTimeRange(TimeRangeList range_ } times.append(snapped); - range_list.RemoveTimeRange(TimeRange(snapped, next)); + range_list.remove(TimeRange(snapped, next)); } return times; @@ -362,7 +362,7 @@ void FrameHashCache::HashDeleted(const QString& s, const QByteArray &hash) QMap::const_iterator i; for (i=time_hash_map_.constBegin(); i!=time_hash_map_.constEnd(); i++) { if (i.value() == hash) { - ranges_to_invalidate.InsertTimeRange(TimeRange(i.key(), i.key() + timebase_)); + ranges_to_invalidate.insert(TimeRange(i.key(), i.key() + timebase_)); } } diff --git a/app/render/playbackcache.cpp b/app/render/playbackcache.cpp index 1c6103e48..72eda146d 100644 --- a/app/render/playbackcache.cpp +++ b/app/render/playbackcache.cpp @@ -33,7 +33,7 @@ void PlaybackCache::Invalidate(const TimeRange &r) { Q_ASSERT(r.in() != r.out()); - invalidated_.InsertTimeRange(r); + invalidated_.insert(r); RemoveRangeFromJobs(r); qint64 job_time = QDateTime::currentMSecsSinceEpoch(); @@ -69,11 +69,11 @@ void PlaybackCache::SetLength(const rational &r) jobs_.clear(); } else if (r > length_) { // If new length is greater, simply extend the invalidated range for now - invalidated_.InsertTimeRange(range_diff); + invalidated_.insert(range_diff); jobs_.append({range_diff, QDateTime::currentMSecsSinceEpoch()}); } else { // If new length is smaller, removed hashes - invalidated_.RemoveTimeRange(range_diff); + invalidated_.remove(range_diff); RemoveRangeFromJobs(range_diff); } @@ -123,7 +123,7 @@ void PlaybackCache::Shift(const rational &from, const rational &to) void PlaybackCache::Validate(const TimeRange &r) { - invalidated_.RemoveTimeRange(r); + invalidated_.remove(r); emit Validated(r); } diff --git a/app/render/previewautocacher.cpp b/app/render/previewautocacher.cpp index 8658ba48a..5033d4d87 100644 --- a/app/render/previewautocacher.cpp +++ b/app/render/previewautocacher.cpp @@ -136,7 +136,7 @@ void PreviewAutoCacher::VideoInvalidated(const TimeRange &range) if (ignore_next_mouse_button_ || !(qApp->mouseButtons() & Qt::LeftButton)) { ignore_next_mouse_button_ = false; - invalidated_video_.InsertTimeRange(range); + invalidated_video_.insert(range); TryRender(); } @@ -147,7 +147,7 @@ void PreviewAutoCacher::AudioInvalidated(const TimeRange &range) ClearQueue(false); // Start jobs to re-render the audio at this range, split into 2 second chunks - invalidated_audio_.InsertTimeRange(range); + invalidated_audio_.insert(range); TryRender(); } diff --git a/app/task/export/export.cpp b/app/task/export/export.cpp index c2c27c547..60afd5b97 100644 --- a/app/task/export/export.cpp +++ b/app/task/export/export.cpp @@ -88,11 +88,11 @@ bool ExportTask::Run() TimeRangeList video_range, audio_range; if (params_.video_enabled()) { - video_range.append(range); + video_range = {range}; } if (params_.audio_enabled()) { - audio_range.append(range); + audio_range = {range}; audio_data_.SetLength(range.length()); } diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 4a3a6b759..68e39e7cb 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -531,7 +531,7 @@ void TimelineWidget::DeleteSelected(bool ripple) TimeRangeList range_list; foreach (Block* b, blocks_to_delete) { - range_list.InsertTimeRange(TimeRange(b->in(), b->out())); + range_list.insert(TimeRange(b->in(), b->out())); } new TimelineRippleDeleteGapsAtRegionsCommand(GetConnectedNode(), range_list, command); @@ -1512,7 +1512,7 @@ void TimelineWidget::EndRubberBandSelect() void TimelineWidget::AddSelection(const TimeRange &time, const TrackReference &track) { - selections_[track].InsertTimeRange(time); + selections_[track].insert(time); UpdateViewports(track.type()); } @@ -1524,7 +1524,7 @@ void TimelineWidget::AddSelection(TimelineViewBlockItem *item) void TimelineWidget::RemoveSelection(const TimeRange &time, const TrackReference &track) { - selections_[track].RemoveTimeRange(time); + selections_[track].remove(time); UpdateViewports(track.type()); } diff --git a/app/widget/timelinewidget/timelinewidgetselections.cpp b/app/widget/timelinewidget/timelinewidgetselections.cpp index 951b80946..938f2e16a 100644 --- a/app/widget/timelinewidget/timelinewidgetselections.cpp +++ b/app/widget/timelinewidget/timelinewidgetselections.cpp @@ -25,9 +25,7 @@ OLIVE_NAMESPACE_ENTER void TimelineWidgetSelections::ShiftTime(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2) += diff; - } + it.value().shift(diff); } } @@ -59,18 +57,14 @@ void TimelineWidgetSelections::ShiftTracks(Timeline::TrackType type, int diff) void TimelineWidgetSelections::TrimIn(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2).set_in((*it2).in() + diff); - } + it.value().trim_in(diff); } } void TimelineWidgetSelections::TrimOut(const rational &diff) { for (auto it=this->begin(); it!=this->end(); it++) { - for (auto it2=it.value().begin(); it2!=it.value().end(); it2++) { - (*it2).set_out((*it2).out() + diff); - } + it.value().trim_out(diff); } }