diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index a4ccac25f..6d5e10d51 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -180,8 +180,6 @@ void TimelineWidget::PointerTool::SetTrimmingAllowed(bool allowed) void TimelineWidget::PointerTool::MouseReleaseInternal(TimelineViewMouseEvent *event) { - Q_UNUSED(event) - QUndoCommand* command = new QUndoCommand(); QList blocks_to_temp_remove; @@ -203,7 +201,7 @@ void TimelineWidget::PointerTool::MouseReleaseInternal(TimelineViewMouseEvent *e // If we're duplicating (user is holding ALT), no need to remove the original clip. However if the ghost was // trimmed, it can't be duplicated. - if (!duplicate_clips || ghost->mode() != Timeline::kMove) { + if (!duplicate_clips || ghost->mode() != Timeline::kMove || b->type() == Block::kTransition) { blocks_to_temp_remove.append(b); } @@ -243,7 +241,7 @@ void TimelineWidget::PointerTool::MouseReleaseInternal(TimelineViewMouseEvent *e } else { new BlockResizeCommand(b, ghost->AdjustedLength(), command); } - } else if (duplicate_clips && ghost->mode() == Timeline::kMove) { + } else if (duplicate_clips && ghost->mode() == Timeline::kMove && b->type() != Block::kTransition) { // Duplicate rather than move Node* copy = b->copy(); @@ -255,6 +253,15 @@ void TimelineWidget::PointerTool::MouseReleaseInternal(TimelineViewMouseEvent *e // Place the copy instead of the original block b = static_cast(copy); + } else if (b->type() == Block::kTransition) { + // If the block is a dual transition and we're moving it, the mid point should be moved + TransitionBlock* transition = static_cast(b); + + if (transition->connected_in_block() && transition->connected_out_block()) { + new BlockSetMediaInCommand(transition, + transition->media_in() + ghost->InAdjustment(), + command); + } } new TrackPlaceBlockCommand(parent()->timeline_node_->track_list(track_ref.type()), @@ -467,9 +474,11 @@ void TimelineWidget::PointerTool::InitiateGhosts(TimelineViewBlockItem* clicked_ TransitionBlock* transition = static_cast(block); // Create a rolling effect with the attached block - if (transition->connected_in_block() && block_mode == Timeline::kTrimOut) { + if (transition->connected_in_block() && (block_mode == Timeline::kTrimOut || block_mode == Timeline::kMove)) { AddGhostFromBlock(transition->connected_in_block(), clip_item->Track(), Timeline::kTrimIn); - } else if (transition->connected_out_block() && block_mode == Timeline::kTrimIn) { + } + + if (transition->connected_out_block() && (block_mode == Timeline::kTrimIn || block_mode == Timeline::kMove)) { AddGhostFromBlock(transition->connected_out_block(), clip_item->Track(), Timeline::kTrimOut); } } diff --git a/app/widget/timelinewidget/tool/tool.cpp b/app/widget/timelinewidget/tool/tool.cpp index adcfda75d..2a1cbbe92 100644 --- a/app/widget/timelinewidget/tool/tool.cpp +++ b/app/widget/timelinewidget/tool/tool.cpp @@ -23,6 +23,7 @@ #include #include "common/range.h" +#include "node/block/transition/transition.h" TimelineWidget::Tool::Tool(TimelineWidget *parent) : dragging_(false), @@ -101,6 +102,23 @@ rational TimelineWidget::Tool::ValidateFrameMovement(rational movement, const QV continue; } + Block* block = Node::ValueToPtr(ghost->data(TimelineViewGhostItem::kAttachedBlock)); + + if (block && block->type() == Block::kTransition) { + TransitionBlock* transition = static_cast(block); + + // Daul transitions are only allowed to move so that neither of their offsets are < 0 + if (transition->connected_in_block() && transition->connected_out_block()) { + if (movement > transition->out_offset()) { + movement = transition->out_offset(); + } + + if (movement < -transition->in_offset()) { + movement = -transition->in_offset(); + } + } + } + // Prevents any ghosts from going below 0:00:00 time if (ghost->In() + movement < 0) { movement = -ghost->In();