From 0ede7bd31969c5dfe3bf5a672cd298ffbc8cca90 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Thu, 22 Aug 2019 10:33:40 +1000 Subject: [PATCH] track movement with pointer tool --- app/node/node.cpp | 2 +- app/widget/timelineview/timelineview.h | 5 +++- .../timelineview/timelineviewclipitem.h | 1 - .../timelineview/timelineviewghostitem.cpp | 28 ++++++++++++++++++ .../timelineview/timelineviewghostitem.h | 7 +++++ app/widget/timelineview/tool/import.cpp | 2 +- app/widget/timelineview/tool/pointer.cpp | 29 +++++++++---------- app/widget/timelineview/tool/tool.cpp | 18 ++++++++++-- 8 files changed, 70 insertions(+), 22 deletions(-) diff --git a/app/node/node.cpp b/app/node/node.cpp index 13b26a1b1..80ab84542 100644 --- a/app/node/node.cpp +++ b/app/node/node.cpp @@ -147,7 +147,7 @@ QList Node::GetExclusiveDependencies() if (deps.contains(edge->input()->parent())) { deps.removeAt(i); - i--; // -1 since we just removed a Node here + i--; // -1 since we just removed a Node in this list j = params.size(); // No need to keep looking at this Node's params break; // Or this param's edges } diff --git a/app/widget/timelineview/timelineview.h b/app/widget/timelineview/timelineview.h index 5f4d24319..6a40f4a9b 100644 --- a/app/widget/timelineview/timelineview.h +++ b/app/widget/timelineview/timelineview.h @@ -98,7 +98,8 @@ private: QGraphicsItem* GetItemAtScenePos(const QPointF& scene_pos); - rational ValidateMovement(rational movement, const QVector ghosts); + rational ValidateFrameMovement(rational movement, const QVector ghosts); + int ValidateTrackMovement(int movement, const QVector ghosts); bool dragging_; @@ -117,6 +118,8 @@ private: virtual void MousePress(QMouseEvent *event); virtual void MouseMove(QMouseEvent *event); virtual void MouseRelease(QMouseEvent *event); + private: + int track_start_; }; class ImportTool : public Tool diff --git a/app/widget/timelineview/timelineviewclipitem.h b/app/widget/timelineview/timelineviewclipitem.h index 22d37d134..6f94d9f17 100644 --- a/app/widget/timelineview/timelineviewclipitem.h +++ b/app/widget/timelineview/timelineviewclipitem.h @@ -23,7 +23,6 @@ #include "timelineviewrect.h" #include "node/block/clip/clip.h" -#include "timelineviewghostitem.h" /** * @brief A graphical representation of a ClipBlock diff --git a/app/widget/timelineview/timelineviewghostitem.cpp b/app/widget/timelineview/timelineviewghostitem.cpp index 8548be464..464c2b7f6 100644 --- a/app/widget/timelineview/timelineviewghostitem.cpp +++ b/app/widget/timelineview/timelineviewghostitem.cpp @@ -30,6 +30,24 @@ TimelineViewGhostItem::TimelineViewGhostItem(QGraphicsItem *parent) : setPen(QPen(Qt::yellow, 2)); // FIXME: Make customizable via CSS } +TimelineViewGhostItem *TimelineViewGhostItem::FromClip(TimelineViewClipItem *clip_item) +{ + TimelineViewGhostItem* ghost = new TimelineViewGhostItem(); + + ghost->SetY(clip_item->Y()); + ghost->SetHeight(clip_item->Height()); + ghost->SetTrack(clip_item->Track()); + ghost->setPos(clip_item->pos()); + + ClipBlock* clip = clip_item->clip(); + + ghost->SetIn(clip->in()); + ghost->SetOut(clip->out()); + ghost->SetData(Node::PtrToValue(clip)); + + return ghost; +} + const rational &TimelineViewGhostItem::In() { return in_; @@ -78,6 +96,11 @@ void TimelineViewGhostItem::SetOutAdjustment(const rational &out_adj) UpdateRect(); } +void TimelineViewGhostItem::SetTrackAdjustment(const int &track_adj) +{ + track_adj_ = track_adj; +} + rational TimelineViewGhostItem::GetAdjustedIn() { return in_ + in_adj_; @@ -88,6 +111,11 @@ rational TimelineViewGhostItem::GetAdjustedOut() return out_ + out_adj_; } +int TimelineViewGhostItem::GetAdjustedTrack() +{ + return track_ + track_adj_; +} + const QVariant &TimelineViewGhostItem::data() { return data_; diff --git a/app/widget/timelineview/timelineviewghostitem.h b/app/widget/timelineview/timelineviewghostitem.h index 393ef87a7..5c73fd034 100644 --- a/app/widget/timelineview/timelineviewghostitem.h +++ b/app/widget/timelineview/timelineviewghostitem.h @@ -24,6 +24,7 @@ #include #include "project/item/footage/footage.h" +#include "timelineviewclipitem.h" #include "timelineviewrect.h" /** @@ -34,6 +35,8 @@ class TimelineViewGhostItem : public TimelineViewRect public: TimelineViewGhostItem(QGraphicsItem* parent = nullptr); + static TimelineViewGhostItem* FromClip(TimelineViewClipItem* clip_item); + const rational& In(); const rational& Out(); @@ -45,9 +48,11 @@ public: void SetInAdjustment(const rational& in_adj); void SetOutAdjustment(const rational& out_adj); + void SetTrackAdjustment(const int& track_adj); rational GetAdjustedIn(); rational GetAdjustedOut(); + int GetAdjustedTrack(); const QVariant& data(); void SetData(const QVariant& data); @@ -63,6 +68,8 @@ private: rational in_adj_; rational out_adj_; + int track_adj_; + StreamPtr stream_; QVariant data_; diff --git a/app/widget/timelineview/tool/import.cpp b/app/widget/timelineview/tool/import.cpp index 3b5a3b31d..6729c4c0b 100644 --- a/app/widget/timelineview/tool/import.cpp +++ b/app/widget/timelineview/tool/import.cpp @@ -102,7 +102,7 @@ void TimelineView::ImportTool::DragMove(QDragMoveEvent *event) int ghost_y = parent()->GetTrackY(ghost_track); int ghost_height = parent()->GetTrackHeight(ghost_track); - time_movement = ValidateMovement(time_movement, parent()->ghost_items_); + time_movement = ValidateFrameMovement(time_movement, parent()->ghost_items_); // Move ghosts to the mouse cursor foreach (TimelineViewGhostItem* ghost, parent()->ghost_items_) { diff --git a/app/widget/timelineview/tool/pointer.cpp b/app/widget/timelineview/tool/pointer.cpp index 42c80c4ba..e15d56ff7 100644 --- a/app/widget/timelineview/tool/pointer.cpp +++ b/app/widget/timelineview/tool/pointer.cpp @@ -55,31 +55,19 @@ void TimelineView::PointerTool::MouseMove(QMouseEvent *event) if (!dragging_) { drag_start_ = GetScenePos(event->pos()); + track_start_ = parent()->SceneToTrack(drag_start_.y()); // Let's see if there's anything selected to drag if (GetItemAtScenePos(drag_start_) != nullptr) { QList selected_items = parent()->scene_.selectedItems(); foreach (QGraphicsItem* item, selected_items) { - TimelineViewGhostItem* ghost = new TimelineViewGhostItem(); TimelineViewClipItem* clip_item = static_cast(item); + TimelineViewGhostItem* ghost = TimelineViewGhostItem::FromClip(clip_item); - ClipBlock* clip = clip_item->clip(); - - ghost->SetY(clip_item->Y()); - ghost->SetHeight(clip_item->Height()); - ghost->SetIn(clip->in()); - ghost->SetOut(clip->out()); ghost->SetScale(parent()->scale_); - ghost->SetData(Node::PtrToValue(clip)); - - // FIXME: Very bad. Change immediately. - ghost->SetTrack(parent()->SceneToTrack(drag_start_.y())); - - ghost->setPos(clip_item->pos()); parent()->ghost_items_.append(ghost); - parent()->scene_.addItem(ghost); } } @@ -89,17 +77,26 @@ void TimelineView::PointerTool::MouseMove(QMouseEvent *event) } else if (!parent()->ghost_items_.isEmpty()) { QPointF scene_pos = GetScenePos(event->pos()); + int cursor_track = parent()->SceneToTrack(scene_pos.y()); + int track_movement = cursor_track - track_start_; + QPointF movement = scene_pos - drag_start_; rational time_movement = parent()->SceneToTime(movement.x()); // Validate movement - time_movement = ValidateMovement(time_movement, parent()->ghost_items_); + time_movement = ValidateFrameMovement(time_movement, parent()->ghost_items_); + track_movement = ValidateTrackMovement(track_movement, parent()->ghost_items_); // Perform movement foreach (TimelineViewGhostItem* ghost, parent()->ghost_items_) { ghost->SetInAdjustment(time_movement); ghost->SetOutAdjustment(time_movement); + + ghost->SetTrackAdjustment(track_movement); + int track = ghost->GetAdjustedTrack(); + ghost->SetY(parent()->GetTrackY(track)); + ghost->SetHeight(parent()->GetTrackHeight(track)); } } } @@ -126,7 +123,7 @@ void TimelineView::PointerTool::MouseRelease(QMouseEvent *event) foreach (TimelineViewGhostItem* ghost, parent()->ghost_items_) { Block* b = Node::ValueToPtr(ghost->data()); - emit parent()->RequestPlaceBlock(b, ghost->GetAdjustedIn(), ghost->Track()); + emit parent()->RequestPlaceBlock(b, ghost->GetAdjustedIn(), ghost->GetAdjustedTrack()); } parent()->ClearGhosts(); diff --git a/app/widget/timelineview/tool/tool.cpp b/app/widget/timelineview/tool/tool.cpp index f90c445b6..73a6328f3 100644 --- a/app/widget/timelineview/tool/tool.cpp +++ b/app/widget/timelineview/tool/tool.cpp @@ -57,12 +57,26 @@ QGraphicsItem *TimelineView::Tool::GetItemAtScenePos(const QPointF &scene_pos) return parent()->scene_.itemAt(scene_pos, parent()->transform()); } -rational TimelineView::Tool::ValidateMovement(rational movement, const QVector ghosts) +rational TimelineView::Tool::ValidateFrameMovement(rational movement, const QVector ghosts) { foreach (TimelineViewGhostItem* ghost, ghosts) { + // Prevents any ghosts from going below 0:00:00 time rational validator = ghost->In() + movement; if (validator < 0) { - movement = rational(0) - ghost->In(); + movement = -ghost->In(); + } + } + + return movement; +} + +int TimelineView::Tool::ValidateTrackMovement(int movement, const QVector ghosts) +{ + foreach (TimelineViewGhostItem* ghost, ghosts) { + // Prevents any ghosts from going to a non-existent negative track + int validator = ghost->Track() + movement; + if (validator < 0) { + movement = -ghost->Track(); } }