timeline: cleaned up pointer tool derivatives and fixed bug introduced by earlier behavior improvement

This commit is contained in:
itsmattkc
2020-06-01 17:38:24 +10:00
parent 1fce380cc6
commit 001b7179c5
5 changed files with 56 additions and 50 deletions
+10 -8
View File
@@ -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;
};
+30 -26
View File
@@ -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<TimelineViewBlockItem*> 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);
+10 -8
View File
@@ -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<Block>(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<NodeGraph*>(b->parent()), b, command);
+3 -3
View File
@@ -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_) {
+3 -5
View File
@@ -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<TrackBlockListPair> blocks_per_track;