diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 5b6be9e14..8ab2eaef8 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -171,7 +171,7 @@ void PointerTool::MouseMove(TimelineViewMouseEvent *event) // If we're performing an action, we can initiate ghosts if (drag_movement_mode_ != Timeline::kNone) { - InitiateDrag(clicked_item_, drag_movement_mode_); + InitiateDrag(clicked_item_, drag_movement_mode_, event->GetModifiers()); } // Set dragging to true here so no matter what, the drag isn't re-initiated until it's completed @@ -244,6 +244,7 @@ void SetGhostToSlideMode(TimelineViewGhostItem* g) void PointerTool::InitiateDragInternal(Block *clicked_item, Timeline::MovementMode trim_mode, + Qt::KeyboardModifiers modifiers, bool dont_roll_trims, bool allow_nongap_rolling, bool slide_instead_of_moving) @@ -407,30 +408,41 @@ void PointerTool::InitiateDragInternal(Block *clicked_item, } Timeline::MovementMode flipped_mode = FlipTrimMode(trim_mode); - TimelineViewGhostItem* adjacent_ghost; + QVector adjacent_ghosts; if (adjacent) { - adjacent_ghost = AddGhostFromBlock(adjacent, flipped_mode); + adjacent_ghosts.append(AddGhostFromBlock(adjacent, flipped_mode)); + + // Select adjacent's links if applicable + // FIXME: The check for `clips.size() == 1` may not be necessary, but I don't know yet. + // I'm only including it to prevent any potentially unintended behavior. + if (clips.size() == 1 && !(modifiers & Qt::AltModifier)) { + if (ClipBlock *adjacent_clip = dynamic_cast(adjacent)) { + foreach (Block *adjacent_link, adjacent_clip->block_links()) { + adjacent_ghosts.append(AddGhostFromBlock(adjacent_link, flipped_mode)); + } + } + } } else if (trim_mode == Timeline::kTrimIn || block->next()) { rational null_ghost_pos = (trim_mode == Timeline::kTrimIn) ? block->in() : block->out(); - adjacent_ghost = AddGhostFromNull(null_ghost_pos, null_ghost_pos, clip_item->track()->ToReference(), flipped_mode); - } else { - adjacent_ghost = nullptr; + adjacent_ghosts.append(AddGhostFromNull(null_ghost_pos, null_ghost_pos, clip_item->track()->ToReference(), flipped_mode)); } // If we have an adjacent block (for any reason), this is a roll edit and the adjacent is // expected to fill the remaining space (no gap needs to be created) ghost->SetData(TimelineViewGhostItem::kTrimIsARollEdit, static_cast(adjacent)); - if (adjacent_ghost) { - if (treat_trim_as_slide) { - // We're sliding a transition rather than a pure trim/roll - SetGhostToSlideMode(adjacent_ghost); - } else if (dynamic_cast(block)) { - ghost->SetData(TimelineViewGhostItem::kTrimShouldBeIgnored, true); - } else { - adjacent_ghost->SetData(TimelineViewGhostItem::kTrimShouldBeIgnored, true); + foreach (TimelineViewGhostItem *adjacent_ghost, adjacent_ghosts) { + if (adjacent_ghost) { + if (treat_trim_as_slide) { + // We're sliding a transition rather than a pure trim/roll + SetGhostToSlideMode(adjacent_ghost); + } else if (dynamic_cast(block)) { + ghost->SetData(TimelineViewGhostItem::kTrimShouldBeIgnored, true); + } else { + adjacent_ghost->SetData(TimelineViewGhostItem::kTrimShouldBeIgnored, true); + } } } } @@ -716,9 +728,9 @@ Timeline::MovementMode PointerTool::IsCursorInTrimHandle(Block *block, qreal cur } } -void PointerTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode) +void PointerTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) { - InitiateDragInternal(clicked_item, trim_mode, false, false, false); + InitiateDragInternal(clicked_item, trim_mode, modifiers, false, false, false); } //#define HIDE_GAP_GHOSTS diff --git a/app/widget/timelinewidget/tool/pointer.h b/app/widget/timelinewidget/tool/pointer.h index f64bd9b34..d44d60c8e 100644 --- a/app/widget/timelinewidget/tool/pointer.h +++ b/app/widget/timelinewidget/tool/pointer.h @@ -39,7 +39,7 @@ public: protected: virtual void FinishDrag(TimelineViewMouseEvent *event); - virtual void InitiateDrag(Block* clicked_item, Timeline::MovementMode trim_mode); + virtual void InitiateDrag(Block* clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers); TimelineViewGhostItem* AddGhostFromBlock(Block *block, Timeline::MovementMode mode, bool check_if_exists = false); @@ -65,6 +65,7 @@ protected: void InitiateDragInternal(Block* clicked_item, Timeline::MovementMode trim_mode, + Qt::KeyboardModifiers modifiers, bool dont_roll_trims, bool allow_nongap_rolling, bool slide_instead_of_moving); diff --git a/app/widget/timelinewidget/tool/ripple.cpp b/app/widget/timelinewidget/tool/ripple.cpp index 919c67edb..2eeae67fa 100644 --- a/app/widget/timelinewidget/tool/ripple.cpp +++ b/app/widget/timelinewidget/tool/ripple.cpp @@ -34,10 +34,9 @@ RippleTool::RippleTool(TimelineWidget* parent) : SetGapTrimmingAllowed(true); } -void RippleTool::InitiateDrag(Block *clicked_item, - Timeline::MovementMode trim_mode) +void RippleTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) { - InitiateDragInternal(clicked_item, trim_mode, true, true, false); + InitiateDragInternal(clicked_item, trim_mode, modifiers, true, true, false); if (!parent()->HasGhosts()) { return; diff --git a/app/widget/timelinewidget/tool/ripple.h b/app/widget/timelinewidget/tool/ripple.h index 6bd197418..b58ced311 100644 --- a/app/widget/timelinewidget/tool/ripple.h +++ b/app/widget/timelinewidget/tool/ripple.h @@ -32,8 +32,7 @@ public: protected: virtual void FinishDrag(TimelineViewMouseEvent *event) override; - virtual void InitiateDrag(Block* clicked_item, - Timeline::MovementMode trim_mode) override; + virtual void InitiateDrag(Block* clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) override; }; } diff --git a/app/widget/timelinewidget/tool/rolling.cpp b/app/widget/timelinewidget/tool/rolling.cpp index f7622bbfc..3f5ff410e 100644 --- a/app/widget/timelinewidget/tool/rolling.cpp +++ b/app/widget/timelinewidget/tool/rolling.cpp @@ -33,10 +33,9 @@ RollingTool::RollingTool(TimelineWidget* parent) : SetGapTrimmingAllowed(true); } -void RollingTool::InitiateDrag(Block *clicked_item, - Timeline::MovementMode trim_mode) +void RollingTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) { - InitiateDragInternal(clicked_item, trim_mode, false, true, false); + InitiateDragInternal(clicked_item, trim_mode, modifiers, false, true, false); } } diff --git a/app/widget/timelinewidget/tool/rolling.h b/app/widget/timelinewidget/tool/rolling.h index 286bcee77..724f79c80 100644 --- a/app/widget/timelinewidget/tool/rolling.h +++ b/app/widget/timelinewidget/tool/rolling.h @@ -31,8 +31,7 @@ public: RollingTool(TimelineWidget* parent); protected: - virtual void InitiateDrag(Block* clicked_item, - Timeline::MovementMode trim_mode) override; + virtual void InitiateDrag(Block* clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) override; }; } diff --git a/app/widget/timelinewidget/tool/slide.cpp b/app/widget/timelinewidget/tool/slide.cpp index 5085caf4a..30ee0376b 100644 --- a/app/widget/timelinewidget/tool/slide.cpp +++ b/app/widget/timelinewidget/tool/slide.cpp @@ -34,9 +34,9 @@ SlideTool::SlideTool(TimelineWidget* parent) : SetGapTrimmingAllowed(true); } -void SlideTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode) +void SlideTool::InitiateDrag(Block *clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) { - InitiateDragInternal(clicked_item, trim_mode, false, true, true); + InitiateDragInternal(clicked_item, trim_mode, modifiers, false, true, true); } } diff --git a/app/widget/timelinewidget/tool/slide.h b/app/widget/timelinewidget/tool/slide.h index e8ab3a031..ce7c57821 100644 --- a/app/widget/timelinewidget/tool/slide.h +++ b/app/widget/timelinewidget/tool/slide.h @@ -31,8 +31,7 @@ public: SlideTool(TimelineWidget* parent); protected: - virtual void InitiateDrag(Block* clicked_item, - Timeline::MovementMode trim_mode) override; + virtual void InitiateDrag(Block* clicked_item, Timeline::MovementMode trim_mode, Qt::KeyboardModifiers modifiers) override; };