From 3b8743a0ce6fef82a24ea36bde4e628c0e61e1fc Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Mon, 23 Mar 2020 15:28:58 +1100 Subject: [PATCH] timeline: show timecode on block items and started copy function --- app/panel/timeline/timeline.cpp | 20 ++++++ app/panel/timeline/timeline.h | 8 +++ app/widget/timelinewidget/timelinewidget.cpp | 72 +++++++++++++++++-- app/widget/timelinewidget/timelinewidget.h | 4 ++ .../view/timelineviewblockitem.cpp | 11 +-- .../timelinewidget/view/timelineviewrect.cpp | 7 ++ .../timelinewidget/view/timelineviewrect.h | 2 + 7 files changed, 114 insertions(+), 10 deletions(-) diff --git a/app/panel/timeline/timeline.cpp b/app/panel/timeline/timeline.cpp index 53fd6116c..a4b2545b5 100644 --- a/app/panel/timeline/timeline.cpp +++ b/app/panel/timeline/timeline.cpp @@ -120,6 +120,26 @@ void TimelinePanel::ToggleLinks() static_cast(GetTimeBasedWidget())->ToggleLinksOnSelected(); } +void TimelinePanel::CutSelected() +{ + static_cast(GetTimeBasedWidget())->CopySelected(true); +} + +void TimelinePanel::CopySelected() +{ + static_cast(GetTimeBasedWidget())->CopySelected(false); +} + +void TimelinePanel::Paste() +{ + static_cast(GetTimeBasedWidget())->Paste(false); +} + +void TimelinePanel::PasteInsert() +{ + static_cast(GetTimeBasedWidget())->Paste(true); +} + void TimelinePanel::InsertFootageAtPlayhead(const QList &footage) { static_cast(GetTimeBasedWidget())->InsertFootageAtPlayhead(footage); diff --git a/app/panel/timeline/timeline.h b/app/panel/timeline/timeline.h index 3d5c1dd91..5624b5e7c 100644 --- a/app/panel/timeline/timeline.h +++ b/app/panel/timeline/timeline.h @@ -63,6 +63,14 @@ public: virtual void ToggleLinks() override; + virtual void CutSelected() override; + + virtual void CopySelected() override; + + virtual void Paste() override; + + virtual void PasteInsert() override; + void InsertFootageAtPlayhead(const QList &footage); void OverwriteFootageAtPlayhead(const QList &footage); diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 2a19176a7..d25221fa9 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -153,6 +153,14 @@ void TimelineWidget::TimebaseChangedEvent(const rational &timebase) timecode_label_->setVisible(!timebase.isNull()); + QMap::const_iterator iterator; + + for (iterator=block_items_.begin();iterator!=block_items_.end();iterator++) { + if (iterator.value()) { + iterator.value()->SetTimebase(timebase); + } + } + foreach (TimelineAndTrackView* view, views_) { view->view()->SetTimebase(timebase); } @@ -179,12 +187,10 @@ void TimelineWidget::ScaleChangedEvent(const double &scale) { TimeBasedWidget::ScaleChangedEvent(scale); - QMapIterator iterator(block_items_); + QMap::const_iterator iterator; - while (iterator.hasNext()) { - iterator.next(); - - if (iterator.value() != nullptr) { + for (iterator=block_items_.begin();iterator!=block_items_.end();iterator++) { + if (iterator.value()) { iterator.value()->SetScale(scale); } } @@ -496,6 +502,61 @@ void TimelineWidget::ToggleLinksOnSelected() } } +void TimelineWidget::CopySelected(bool cut) +{ + if (!GetConnectedNode()) { + return; + } + + QList selected = GetSelectedBlocks(); + + if (selected.isEmpty()) { + return; + } + + QList selected_nodes; + + foreach (TimelineViewBlockItem* item, selected) { + Node* block = item->block(); + + selected_nodes.append(block); + + QList deps = block->GetDependencies(); + + foreach (Node* d, deps) { + if (!selected_nodes.contains(d)) { + selected_nodes.append(d); + } + } + } + + Core::instance()->CopyNodesToClipboard(selected_nodes); + + if (cut) { + DeleteSelected(); + } +} + +void TimelineWidget::Paste(bool insert) +{ + if (!GetConnectedNode()) { + return; + } + + QList pasted = Core::instance()->PasteNodesFromClipboard(static_cast(GetConnectedNode()->parent())); + + if (insert) { + // FIXME: Implement this + } + + foreach (Node* n, pasted) { + // See if this block is a node and is a top level node + if (n->IsBlock() && !n->output()->IsConnected()) { + + } + } +} + QList TimelineWidget::GetSelectedBlocks() { QList list; @@ -703,6 +764,7 @@ void TimelineWidget::AddBlock(Block *block, TrackReference track) item->SetYCoords(GetTrackY(track), GetTrackHeight(track)); item->SetScale(GetScale()); item->SetTrack(track); + item->SetTimebase(timebase()); // Add to list of clip items that can be iterated through block_items_.insert(block, item); diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 86534a45a..3c011cb42 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -59,6 +59,10 @@ public: void ToggleLinksOnSelected(); + void CopySelected(bool cut); + + void Paste(bool insert); + QList GetSelectedBlocks(); signals: diff --git a/app/widget/timelinewidget/view/timelineviewblockitem.cpp b/app/widget/timelinewidget/view/timelineviewblockitem.cpp index c70c979da..105bb3486 100644 --- a/app/widget/timelinewidget/view/timelineviewblockitem.cpp +++ b/app/widget/timelinewidget/view/timelineviewblockitem.cpp @@ -31,6 +31,7 @@ #include "common/qtutils.h" #include "config/config.h" +#include "core.h" #include "node/block/transition/transition.h" #include "widget/viewer/audiowaveformview.h" @@ -63,13 +64,13 @@ void TimelineViewBlockItem::UpdateRect() setPos(item_left, 0.0); setToolTip(QCoreApplication::translate("TimelineViewBlockItem", - "%1\n\nIn: %2\nOut: %3\nMedia In: %4").arg(block_->Name(), - QString::number(block_->in().toDouble()), - QString::number(block_->out().toDouble()), - QString::number(block_->media_in().toDouble()))); + "%1\n\nIn: %2\nOut: %3\nLength: %4").arg(block_->Name(), + Timecode::time_to_timecode(block_->in(), timebase(), Core::instance()->GetTimecodeDisplay()), + Timecode::time_to_timecode(block_->out(), timebase(), Core::instance()->GetTimecodeDisplay()), + Timecode::time_to_timecode(block_->out() - block_->in(), timebase(), Core::instance()->GetTimecodeDisplay()))); } -void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) +void TimelineViewBlockItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget */*widget*/) { switch (block_->type()) { case Block::kClip: diff --git a/app/widget/timelinewidget/view/timelineviewrect.cpp b/app/widget/timelinewidget/view/timelineviewrect.cpp index 20adc35c3..cef41ce09 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.cpp +++ b/app/widget/timelinewidget/view/timelineviewrect.cpp @@ -52,3 +52,10 @@ void TimelineViewRect::ScaleChangedEvent(const double &scale) UpdateRect(); } + +void TimelineViewRect::TimebaseChangedEvent(const rational &tb) +{ + TimelineScaledObject::TimebaseChangedEvent(tb); + + UpdateRect(); +} diff --git a/app/widget/timelinewidget/view/timelineviewrect.h b/app/widget/timelinewidget/view/timelineviewrect.h index b09953fc0..cb35e759d 100644 --- a/app/widget/timelinewidget/view/timelineviewrect.h +++ b/app/widget/timelinewidget/view/timelineviewrect.h @@ -44,6 +44,8 @@ public: protected: virtual void ScaleChangedEvent(const double &) override; + virtual void TimebaseChangedEvent(const rational&) override; + int y_; int height_;