From f2d6d3b32c1f09bba16c3966c125ae1b71a8de60 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sat, 7 Mar 2020 02:44:15 +1100 Subject: [PATCH] timeline/renderer: automatically update timeline view when a visual waveform has updated --- app/node/block/clip/clip.h | 3 ++ app/render/backend/audiorenderworker.cpp | 8 ++++- app/widget/timelinewidget/timelinewidget.cpp | 22 ++++++++++---- app/widget/timelinewidget/timelinewidget.h | 2 ++ .../view/timelineviewblockitem.cpp | 30 +++++-------------- .../view/timelineviewblockitem.h | 5 ++-- 6 files changed, 38 insertions(+), 32 deletions(-) diff --git a/app/node/block/clip/clip.h b/app/node/block/clip/clip.h index b87de4a9b..f341dda58 100644 --- a/app/node/block/clip/clip.h +++ b/app/node/block/clip/clip.h @@ -50,6 +50,9 @@ public: virtual void Retranslate() override; +signals: + void PreviewUpdated(); + private: NodeInput* texture_input_; diff --git a/app/render/backend/audiorenderworker.cpp b/app/render/backend/audiorenderworker.cpp index ea28bec0c..997fa521c 100644 --- a/app/render/backend/audiorenderworker.cpp +++ b/app/render/backend/audiorenderworker.cpp @@ -6,6 +6,7 @@ #include "audio/audiomanager.h" #include "audio/sumsamples.h" #include "config/config.h" +#include "node/block/clip/clip.h" AudioRenderWorker::AudioRenderWorker(DecoderCache* decoder_cache, QHash *copy_map, QObject *parent) : RenderWorker(decoder_cache, parent), @@ -90,10 +91,11 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti actual_copy_size); // Save waveform to file + Block* src_block = static_cast(copy_map_->value(b)); QDir local_appdata_dir(Config::Current()["DiskCachePath"].toString()); QDir waveform_loc = local_appdata_dir.filePath("waveform"); waveform_loc.mkpath("."); - QFile wave_file(waveform_loc.filePath(QString::number(reinterpret_cast(copy_map_->value(b))))); + QFile wave_file(waveform_loc.filePath(QString::number(reinterpret_cast(src_block)))); wave_file.open(QFile::ReadWrite); // FIXME: Assumes 32-bit float @@ -125,6 +127,10 @@ NodeValueTable AudioRenderWorker::RenderBlock(const TrackOutput *track, const Ti } wave_file.close(); + + if (src_block->type() == Block::kClip) { + emit static_cast(src_block)->PreviewUpdated(); + } } } diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index c0c5564cd..31146171a 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -662,10 +662,9 @@ void TimelineWidget::AddBlock(Block *block, TrackReference track) case Block::kTransition: case Block::kGap: { - TimelineViewBlockItem* item = new TimelineViewBlockItem(); - // Set up clip with view parameters (clip item will automatically size its rect accordingly) - item->SetBlock(block); + TimelineViewBlockItem* item = new TimelineViewBlockItem(block); + item->SetYCoords(GetTrackY(track), GetTrackHeight(track)); item->SetScale(GetScale()); item->SetTrack(track); @@ -677,6 +676,10 @@ void TimelineWidget::AddBlock(Block *block, TrackReference track) views_.at(track.type())->view()->scene()->addItem(item); connect(block, &Block::Refreshed, this, &TimelineWidget::BlockChanged); + + if (block->type() == Block::kClip) { + connect(static_cast(block), &ClipBlock::PreviewUpdated, this, &TimelineWidget::PreviewUpdated); + } break; } } @@ -721,13 +724,22 @@ void TimelineWidget::ViewSelectionChanged() void TimelineWidget::BlockChanged() { - TimelineViewRect* rect = block_items_[static_cast(sender())]; + TimelineViewRect* rect = block_items_.value(static_cast(sender())); - if (rect != nullptr) { + if (rect) { rect->UpdateRect(); } } +void TimelineWidget::PreviewUpdated() +{ + TimelineViewRect* rect = block_items_.value(static_cast(sender())); + + if (rect) { + rect->update(); + } +} + void TimelineWidget::UpdateHorizontalSplitters() { QSplitter* sender_splitter = static_cast(sender()); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index b9d4a389e..ca2c99aba 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -425,6 +425,8 @@ private slots: */ void BlockChanged(); + void PreviewUpdated(); + void UpdateHorizontalSplitters(); void UpdateTimecodeWidthFromSplitters(QSplitter *s); diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index 294dd3af6..00d46fa1b 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -34,23 +34,12 @@ #include "config/config.h" #include "node/block/transition/transition.h" -TimelineViewBlockItem::TimelineViewBlockItem(QGraphicsItem* parent) : +TimelineViewBlockItem::TimelineViewBlockItem(Block *block, QGraphicsItem* parent) : TimelineViewRect(parent), - block_(nullptr) + block_(block) { setBrush(Qt::white); setCursor(Qt::DragMoveCursor); -} - -Block *TimelineViewBlockItem::block() -{ - return block_; -} - -void TimelineViewBlockItem::SetBlock(Block *block) -{ - block_ = block; - setFlag(QGraphicsItem::ItemIsSelectable, block_->type() == Block::kClip || block_->type() == Block::kGap @@ -59,12 +48,13 @@ void TimelineViewBlockItem::SetBlock(Block *block) UpdateRect(); } +Block *TimelineViewBlockItem::block() const +{ + return block_; +} + void TimelineViewBlockItem::UpdateRect() { - if (block_ == nullptr) { - return; - } - double item_left = TimeToScene(block_->in()); double item_width = TimeToScene(block_->length()); @@ -81,12 +71,6 @@ void TimelineViewBlockItem::UpdateRect() void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) { - Q_UNUSED(widget) - - if (block_ == nullptr) { - return; - } - switch (block_->type()) { case Block::kClip: { diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.h b/app/widget/timelinewidget/view/timelineviewblockitem.h index 50c9a8ccb..7439acc1f 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.h +++ b/app/widget/timelinewidget/view/timelineviewblockitem.h @@ -30,10 +30,9 @@ class TimelineViewBlockItem : public TimelineViewRect { public: - TimelineViewBlockItem(QGraphicsItem* parent = nullptr); + TimelineViewBlockItem(Block* block, QGraphicsItem* parent = nullptr); - Block* block(); - void SetBlock(Block *block); + Block* block() const; virtual void UpdateRect() override;