From eb132d93de57ce6f78f87b99513ffcb3d558b784 Mon Sep 17 00:00:00 2001 From: itsmattkc Date: Sun, 24 Jan 2021 09:36:05 +1100 Subject: [PATCH] timebasedviews: only drag playhead when there's no item underneath the cursor --- app/widget/keyframeview/keyframeviewbase.cpp | 6 ++-- app/widget/timelinewidget/timelinewidget.cpp | 12 +------ .../timelinewidget/view/timelineview.cpp | 31 ++++++++++++++++--- app/widget/timelinewidget/view/timelineview.h | 2 ++ 4 files changed, 32 insertions(+), 19 deletions(-) diff --git a/app/widget/keyframeview/keyframeviewbase.cpp b/app/widget/keyframeview/keyframeviewbase.cpp index b10ca6f3b..40359913a 100644 --- a/app/widget/keyframeview/keyframeviewbase.cpp +++ b/app/widget/keyframeview/keyframeviewbase.cpp @@ -113,7 +113,9 @@ KeyframeViewItem *KeyframeViewBase::AddKeyframeInternal(NodeKeyframe* key) void KeyframeViewBase::mousePressEvent(QMouseEvent *event) { - if (HandPress(event) || PlayheadPress(event)) { + QGraphicsItem* item_under_cursor = itemAt(event->pos()); + + if (HandPress(event) || (!item_under_cursor && PlayheadPress(event))) { return; } @@ -123,8 +125,6 @@ void KeyframeViewBase::mousePressEvent(QMouseEvent *event) QGraphicsView::mousePressEvent(event); if (active_tool_ == Tool::kPointer) { - QGraphicsItem* item_under_cursor = itemAt(event->pos()); - if (item_under_cursor) { drag_start_ = event->pos(); diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 9de9c62d6..a302176dc 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -1441,17 +1441,7 @@ void TimelineWidget::SetSelections(const TimelineWidgetSelections &s) Block *TimelineWidget::GetItemAtScenePos(const TimelineCoordinate& coord) { - Track* track = GetTrackFromReference(coord.GetTrack()); - - foreach (Block* b, added_blocks_) { - if (b->in() <= coord.GetFrame() - && b->out() > coord.GetFrame() - && b->track() == track) { - return b; - } - } - - return nullptr; + return views_.at(coord.GetTrack().type())->view()->GetItemAtScenePos(coord.GetFrame(), coord.GetTrack().index()); } struct SnapData { diff --git a/app/widget/timelinewidget/view/timelineview.cpp b/app/widget/timelinewidget/view/timelineview.cpp index f3acb0008..192ea02bb 100644 --- a/app/widget/timelinewidget/view/timelineview.cpp +++ b/app/widget/timelinewidget/view/timelineview.cpp @@ -55,23 +55,29 @@ TimelineView::TimelineView(Qt::Alignment vertical_alignment, QWidget *parent) : void TimelineView::mousePressEvent(QMouseEvent *event) { - if (HandPress(event) || PlayheadPress(event)) { + TimelineViewMouseEvent timeline_event = CreateMouseEvent(event); + + if (HandPress(event) + || (!GetItemAtScenePos(timeline_event.GetFrame(), timeline_event.GetTrack().index()) && PlayheadPress(event))) { // Let the parent handle this return; } if (dragMode() != GetDefaultDragMode()) { + // Use default behavior when hand dragging for instance TimeBasedView::mousePressEvent(event); return; } - TimelineViewMouseEvent timeline_event = CreateMouseEvent(event); - emit MousePressed(&timeline_event); } void TimelineView::mouseMoveEvent(QMouseEvent *event) { + TimelineViewMouseEvent timeline_event = CreateMouseEvent(event); + + + if (HandMove(event) || PlayheadMove(event)) { // Let the parent handle this return; @@ -82,8 +88,6 @@ void TimelineView::mouseMoveEvent(QMouseEvent *event) return; } - TimelineViewMouseEvent timeline_event = CreateMouseEvent(event); - emit MouseMoved(&timeline_event); } @@ -560,6 +564,23 @@ int TimelineView::SceneToTrack(double y) return track; } +Block *TimelineView::GetItemAtScenePos(const rational &time, int track_index) const +{ + if (connected_track_list_) { + Track* track = connected_track_list_->GetTrackAt(track_index); + + if (track) { + foreach (Block* b, track->Blocks()) { + if (b->in() <= time && b->out() > time) { + return b; + } + } + } + } + + return nullptr; +} + void TimelineView::UserSetTime(const int64_t &time) { SetTime(time); diff --git a/app/widget/timelinewidget/view/timelineview.h b/app/widget/timelinewidget/view/timelineview.h index bccc6c2a7..ed554a364 100644 --- a/app/widget/timelinewidget/view/timelineview.h +++ b/app/widget/timelinewidget/view/timelineview.h @@ -68,6 +68,8 @@ public: int SceneToTrack(double y); + Block* GetItemAtScenePos(const rational& time, int track_index) const; + signals: void MousePressed(TimelineViewMouseEvent* event); void MouseMoved(TimelineViewMouseEvent* event);