diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 4c9015503..94251d0bc 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -230,8 +230,7 @@ private: virtual void FinishDrag(TimelineViewMouseEvent *event); virtual void InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming); + Timeline::MovementMode trim_mode); TimelineViewGhostItem* AddGhostFromBlock(Block *block, const TrackReference& track, Timeline::MovementMode mode); @@ -280,6 +279,11 @@ private: trim_overwrite_allowed_ = e; } + void SetGapTrimmingAllowed(bool e) + { + gap_trimming_allowed_ = e; + } + private: Timeline::MovementMode IsCursorInTrimHandle(TimelineViewBlockItem* block, qreal cursor_x); @@ -293,6 +297,7 @@ private: bool trimming_allowed_; bool track_movement_allowed_; bool trim_overwrite_allowed_; + bool gap_trimming_allowed_; bool rubberband_selecting_; Timeline::TrackType drag_track_type_; @@ -359,8 +364,7 @@ private: virtual void FinishDrag(TimelineViewMouseEvent *event) override; virtual void InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) override; + Timeline::MovementMode trim_mode) override; }; class RollingTool : public PointerTool @@ -372,8 +376,7 @@ private: virtual void FinishDrag(TimelineViewMouseEvent *event) override; virtual void InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) override; + Timeline::MovementMode trim_mode) override; }; class SlideTool : public PointerTool @@ -384,8 +387,7 @@ private: protected: virtual void FinishDrag(TimelineViewMouseEvent *event) override; virtual void InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) override; + Timeline::MovementMode trim_mode) override; }; diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 39c20e006..d1d53e178 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -42,6 +42,7 @@ TimelineWidget::PointerTool::PointerTool(TimelineWidget *parent) : trimming_allowed_(true), track_movement_allowed_(true), trim_overwrite_allowed_(false), + gap_trimming_allowed_(false), rubberband_selecting_(false) { } @@ -59,6 +60,22 @@ void TimelineWidget::PointerTool::MousePress(TimelineViewMouseEvent *event) // Cache the clip's type for use later drag_track_type_ = clicked_item_->Track().type(); + // If we haven't started dragging yet, we'll initiate a drag here + // Record where the drag started in timeline coordinates + drag_start_ = event->GetCoordinates(); + + // Determine whether we're trimming or moving based on the position of the cursor + drag_movement_mode_ = IsCursorInTrimHandle(clicked_item_, + event->GetSceneX()); + + // If we're not in a trim mode, we must be in a move mode (provided the tool allows movement and + // the block is not a gap) + if (drag_movement_mode_ == Timeline::kNone + && movement_allowed_ + && clicked_item_->block()->type() != Block::kGap) { + drag_movement_mode_ = Timeline::kMove; + } + // If this item is already selected, no further selection needs to be made if (clicked_item_->isSelected()) { @@ -100,41 +117,29 @@ void TimelineWidget::PointerTool::MousePress(TimelineViewMouseEvent *event) void TimelineWidget::PointerTool::MouseMove(TimelineViewMouseEvent *event) { if (rubberband_selecting_) { - // Process rubberband select parent()->MoveRubberBandSelect(true, !(event->GetModifiers() & Qt::AltModifier)); + return; + } + + if (!dragging_) { - } else if (!dragging_) { // Now that the cursor has moved, we will assume the intention is to drag - // If we haven't started dragging yet, we'll initiate a drag here - // Record where the drag started in timeline coordinates - drag_start_ = event->GetCoordinates(); - // Clear snap points snap_points_.clear(); - // Determine whether we're trimming or moving based on the position of the cursor - drag_movement_mode_ = IsCursorInTrimHandle(clicked_item_, - event->GetSceneX()); - - // If we're not in a trim mode, we must be in a move mode (provided the tool allows movement and - // the block is not a gap) - if (drag_movement_mode_ == Timeline::kNone - && movement_allowed_ - && clicked_item_->block()->type() != Block::kGap) { - drag_movement_mode_ = Timeline::kMove; - } - // If we're performing an action, we can initiate ghosts if (drag_movement_mode_ != Timeline::kNone) { - InitiateDrag(clicked_item_, drag_movement_mode_, false); + InitiateDrag(clicked_item_, drag_movement_mode_); } // Set dragging to true here so no matter what, the drag isn't re-initiated until it's completed dragging_ = true; - } else if (!parent()->ghost_items_.isEmpty()) { + } + + if (dragging_ && !parent()->ghost_items_.isEmpty()) { // We're already dragging AND we have ghosts to work with ProcessDrag(event->GetCoordinates()); @@ -145,8 +150,8 @@ void TimelineWidget::PointerTool::MouseMove(TimelineViewMouseEvent *event) void TimelineWidget::PointerTool::MouseRelease(TimelineViewMouseEvent *event) { if (rubberband_selecting_) { + // Finish rubberband select parent()->EndRubberBandSelect(true, !(event->GetModifiers() & Qt::AltModifier)); - rubberband_selecting_ = false; return; } @@ -158,9 +163,9 @@ void TimelineWidget::PointerTool::MouseRelease(TimelineViewMouseEvent *event) parent()->ClearGhosts(); snap_points_.clear(); - } - dragging_ = false; + dragging_ = false; + } } void TimelineWidget::PointerTool::HoverMove(TimelineViewMouseEvent *event) @@ -391,8 +396,7 @@ Timeline::MovementMode TimelineWidget::PointerTool::IsCursorInTrimHandle(Timelin } void TimelineWidget::PointerTool::InitiateDrag(TimelineViewBlockItem* clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) + Timeline::MovementMode trim_mode) { // Get list of selected blocks QList clips = parent()->GetSelectedBlocks(); @@ -431,7 +435,7 @@ void TimelineWidget::PointerTool::InitiateDrag(TimelineViewBlockItem* clicked_it // Some tools interpret "gap trimming" as equivalent to resizing the adjacent block. In that // scenario, we include the adjacent block instead. - if (block->type() == Block::kGap && !allow_gap_trimming) { + if (block->type() == Block::kGap && !gap_trimming_allowed_) { block = (trim_mode == Timeline::kTrimIn) ? block->previous() : block->next(); block_mode = FlipTrimMode(trim_mode); diff --git a/app/widget/timelinewidget/tool/ripple.cpp b/app/widget/timelinewidget/tool/ripple.cpp index 5c3efca98..7d9c5221a 100644 --- a/app/widget/timelinewidget/tool/ripple.cpp +++ b/app/widget/timelinewidget/tool/ripple.cpp @@ -30,15 +30,13 @@ TimelineWidget::RippleTool::RippleTool(TimelineWidget* parent) : { SetMovementAllowed(false); SetTrimOverwriteAllowed(true); + SetGapTrimmingAllowed(true); } void TimelineWidget::RippleTool::InitiateDrag(TimelineViewBlockItem *clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) + Timeline::MovementMode trim_mode) { - Q_UNUSED(allow_gap_trimming) - - PointerTool::InitiateDrag(clicked_item, trim_mode, true); + PointerTool::InitiateDrag(clicked_item, trim_mode); if (parent()->ghost_items_.isEmpty()) { return; @@ -61,6 +59,10 @@ void TimelineWidget::RippleTool::InitiateDrag(TimelineViewBlockItem *clicked_ite // For each track that does NOT have a ghost, we need to make one for Gaps foreach (TrackOutput* track, parent()->GetConnectedNode()->GetTracks()) { + if (track->IsLocked()) { + continue; + } + // Determine if we've already created a ghost on this track bool ghost_on_this_track_exists = false; @@ -77,7 +79,7 @@ void TimelineWidget::RippleTool::InitiateDrag(TimelineViewBlockItem *clicked_ite Block* block_before_ripple = track->NearestBlockBefore(earliest_ripple); // If block is null, there will be no blocks after to ripple - if (block_before_ripple != nullptr) { + if (block_before_ripple) { TimelineViewGhostItem* ghost; TrackReference track_ref(track->track_type(), track->Index()); @@ -110,7 +112,7 @@ void TimelineWidget::RippleTool::FinishDrag(TimelineViewMouseEvent *event) foreach (TimelineViewGhostItem* ghost, parent()->ghost_items_) { Block* b = Node::ValueToPtr(ghost->data(TimelineViewGhostItem::kAttachedBlock)); - if (b == nullptr) { + if (!b) { // This is a gap we are creating // Make sure there's actually a gap being created @@ -136,7 +138,7 @@ void TimelineWidget::RippleTool::FinishDrag(TimelineViewMouseEvent *event) new BlockResizeCommand(b, ghost->AdjustedLength(), command); } } else { - // Assumed the Block was a Gap and it was reduced to zero length, remove it here + // Assume the Block was a Gap and it was reduced to zero length, remove it here new TrackRippleRemoveBlockCommand(parent()->GetTrackFromReference(ghost->Track()), b, command); new NodeRemoveWithExclusiveDeps(static_cast(b->parent()), b, command); diff --git a/app/widget/timelinewidget/tool/rolling.cpp b/app/widget/timelinewidget/tool/rolling.cpp index f70ba9f7d..6baf25316 100644 --- a/app/widget/timelinewidget/tool/rolling.cpp +++ b/app/widget/timelinewidget/tool/rolling.cpp @@ -30,13 +30,13 @@ TimelineWidget::RollingTool::RollingTool(TimelineWidget* parent) : { SetMovementAllowed(false); SetTrimOverwriteAllowed(true); + SetGapTrimmingAllowed(true); } void TimelineWidget::RollingTool::InitiateDrag(TimelineViewBlockItem *clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) + Timeline::MovementMode trim_mode) { - PointerTool::InitiateDrag(clicked_item, trim_mode, true); + PointerTool::InitiateDrag(clicked_item, trim_mode); // For each ghost, we make an equivalent Ghost on the next/previous block foreach (TimelineViewGhostItem* ghost, parent()->ghost_items_) { diff --git a/app/widget/timelinewidget/tool/slide.cpp b/app/widget/timelinewidget/tool/slide.cpp index 3d53e3078..26423f335 100644 --- a/app/widget/timelinewidget/tool/slide.cpp +++ b/app/widget/timelinewidget/tool/slide.cpp @@ -31,6 +31,7 @@ TimelineWidget::SlideTool::SlideTool(TimelineWidget* parent) : SetTrimmingAllowed(false); SetTrackMovementAllowed(false); SetTrimOverwriteAllowed(true); + SetGapTrimmingAllowed(true); } struct TrackBlockListPair { @@ -39,12 +40,9 @@ struct TrackBlockListPair { }; void TimelineWidget::SlideTool::InitiateDrag(TimelineViewBlockItem *clicked_item, - Timeline::MovementMode trim_mode, - bool allow_gap_trimming) + Timeline::MovementMode trim_mode) { - Q_UNUSED(allow_gap_trimming) - - PointerTool::InitiateDrag(clicked_item, trim_mode, true); + PointerTool::InitiateDrag(clicked_item, trim_mode); // Sort blocks into tracks QList blocks_per_track;