From fb72ca4997e4ada5ca4eef7198668ff7f27a3f52 Mon Sep 17 00:00:00 2001 From: itsmattkc <34096995+itsmattkc@users.noreply.github.com> Date: Fri, 13 May 2022 20:34:29 -0700 Subject: [PATCH] timeline: fix bug in trackviewitem drag/drop --- app/widget/timelinewidget/tool/import.cpp | 16 ++++++++++++++-- app/widget/timelinewidget/tool/import.h | 2 ++ .../timelinewidget/trackview/trackviewitem.cpp | 1 + .../timelinewidget/view/timelineviewmouseevent.h | 8 +++++++- 4 files changed, 24 insertions(+), 3 deletions(-) diff --git a/app/widget/timelinewidget/tool/import.cpp b/app/widget/timelinewidget/tool/import.cpp index e25255497..a9198ec38 100644 --- a/app/widget/timelinewidget/tool/import.cpp +++ b/app/widget/timelinewidget/tool/import.cpp @@ -87,8 +87,14 @@ void ImportTool::DragEnter(TimelineViewMouseEvent *event) } } - PrepGhosts(drag_start_.GetFrame() - parent()->SceneToTime(import_pre_buffer_), - drag_start_.GetTrack().index()); + // Create a reasonable amount of space to inset the cursor by when importing + ghost_offset_ = drag_start_.GetFrame(); + + if (!event->GetBypassImportBuffer()) { + ghost_offset_ -= parent()->SceneToTime(import_pre_buffer_); + } + + PrepGhosts(ghost_offset_, drag_start_.GetTrack().index()); if (parent()->HasGhosts() || !parent()->GetConnectedNode()) { event->accept(); @@ -107,6 +113,12 @@ void ImportTool::DragMove(TimelineViewMouseEvent *event) if (parent()->HasGhosts()) { rational time_movement = event->GetFrame() - drag_start_.GetFrame(); + + // Keep ghost offset no lower than 0 + if (ghost_offset_ + time_movement < 0) { + time_movement = -ghost_offset_; + } + int track_movement = event->GetTrack().index() - drag_start_.GetTrack().index(); time_movement = ValidateTimeMovement(time_movement); diff --git a/app/widget/timelinewidget/tool/import.h b/app/widget/timelinewidget/tool/import.h index 2640f2708..565d8f0ce 100644 --- a/app/widget/timelinewidget/tool/import.h +++ b/app/widget/timelinewidget/tool/import.h @@ -60,6 +60,8 @@ private: int import_pre_buffer_; + rational ghost_offset_; + }; } diff --git a/app/widget/timelinewidget/trackview/trackviewitem.cpp b/app/widget/timelinewidget/trackview/trackviewitem.cpp index f3c254178..5eafc077d 100644 --- a/app/widget/timelinewidget/trackview/trackviewitem.cpp +++ b/app/widget/timelinewidget/trackview/trackviewitem.cpp @@ -87,6 +87,7 @@ void TrackViewItem::dragEnterEvent(QDragEnterEvent *event) TimelineViewMouseEvent e(0, 1, 1, track_->ToReference(), Qt::NoButton, event->keyboardModifiers()); e.SetMimeData(event->mimeData()); e.SetEvent(event); + e.SetBypassImportBuffer(true); emit DragEntered(&e); } diff --git a/app/widget/timelinewidget/view/timelineviewmouseevent.h b/app/widget/timelinewidget/view/timelineviewmouseevent.h index babce9881..79bd99d85 100644 --- a/app/widget/timelinewidget/view/timelineviewmouseevent.h +++ b/app/widget/timelinewidget/view/timelineviewmouseevent.h @@ -47,7 +47,8 @@ public: button_(button), modifiers_(modifiers), source_event_(nullptr), - mime_data_(nullptr) + mime_data_(nullptr), + bypass_import_buffer_(false) { } @@ -117,6 +118,9 @@ public: source_event_->ignore(); } + bool GetBypassImportBuffer() const { return bypass_import_buffer_; } + void SetBypassImportBuffer(bool e) { bypass_import_buffer_ = e; } + private: qreal scene_x_; double scale_x_; @@ -132,6 +136,8 @@ private: const QMimeData* mime_data_; + bool bypass_import_buffer_; + }; }