diff --git a/app/widget/timelinewidget/timelinewidget.cpp b/app/widget/timelinewidget/timelinewidget.cpp index 0ff33241a..05baf88b6 100644 --- a/app/widget/timelinewidget/timelinewidget.cpp +++ b/app/widget/timelinewidget/timelinewidget.cpp @@ -1427,16 +1427,19 @@ void TimelineWidget::RestoreSplitterState(const QByteArray &state) view_splitter_->restoreState(state); } -void TimelineWidget::StartRubberBandSelect(bool enable_selecting, bool select_links) +void TimelineWidget::StartRubberBandSelect(const QPoint &global_cursor_start) { - drag_origin_ = QCursor::pos(); + drag_origin_ = global_cursor_start; + + // Start rubberband at origin + QPoint local_origin = mapFromGlobal(drag_origin_); + rubberband_.setGeometry(QRect(local_origin.x(), local_origin.y(), 0, 0)); + rubberband_.show(); // We don't touch any blocks that are already selected. If you want these to be deselected by // default, call DeselectAll() before calling StartRubberBandSelect() rubberband_old_selections_ = selections_; - - MoveRubberBandSelect(enable_selecting, select_links); } void TimelineWidget::MoveRubberBandSelect(bool enable_selecting, bool select_links) diff --git a/app/widget/timelinewidget/timelinewidget.h b/app/widget/timelinewidget/timelinewidget.h index 7c0ec3a2b..3c5e728cf 100644 --- a/app/widget/timelinewidget/timelinewidget.h +++ b/app/widget/timelinewidget/timelinewidget.h @@ -138,7 +138,7 @@ public: void InsertGapsAt(const rational& time, const rational& length, QUndoCommand* command); - void StartRubberBandSelect(bool enable_selecting, bool select_links); + void StartRubberBandSelect(const QPoint& global_cursor_start); void MoveRubberBandSelect(bool enable_selecting, bool select_links); void EndRubberBandSelect(); diff --git a/app/widget/timelinewidget/tool/pointer.cpp b/app/widget/timelinewidget/tool/pointer.cpp index 768483bcd..cac8e355a 100644 --- a/app/widget/timelinewidget/tool/pointer.cpp +++ b/app/widget/timelinewidget/tool/pointer.cpp @@ -121,21 +121,38 @@ void PointerTool::MousePress(TimelineViewMouseEvent *event) parent()->SignalSelectedBlocks(selected_blocks); - } else if (event->GetButton() == Qt::LeftButton) { + } - // Start rubberband drag - parent()->StartRubberBandSelect(true, !(event->GetModifiers() & Qt::AltModifier)); - - rubberband_selecting_ = true; + can_rubberband_select_ = (event->GetButton() == Qt::LeftButton // Only rubberband select from the primary mouse button + && (!selectable_item || drag_movement_mode_ == Timeline::kNone)); // And if no item was selected OR the item isn't draggable + if (can_rubberband_select_) { + drag_global_start_ = QCursor::pos(); } } void PointerTool::MouseMove(TimelineViewMouseEvent *event) { - if (rubberband_selecting_) { + if (can_rubberband_select_) { + + if (!rubberband_selecting_) { + + // If we clicked an item but are rubberband selecting anyway, deselect it now + if (clicked_item_) { + parent()->RemoveSelection(clicked_item_); + parent()->SignalDeselectedBlocks({clicked_item_->block()}); + clicked_item_ = nullptr; + } + + parent()->StartRubberBandSelect(drag_global_start_); + + rubberband_selecting_ = true; + + } + // Process rubberband select parent()->MoveRubberBandSelect(true, !(event->GetModifiers() & Qt::AltModifier)); + } else { // Process drag if (!dragging_) { diff --git a/app/widget/timelinewidget/tool/pointer.h b/app/widget/timelinewidget/tool/pointer.h index 9a72fa597..aa96059e6 100644 --- a/app/widget/timelinewidget/tool/pointer.h +++ b/app/widget/timelinewidget/tool/pointer.h @@ -113,6 +113,7 @@ private: bool trimming_allowed_; bool track_movement_allowed_; bool gap_trimming_allowed_; + bool can_rubberband_select_; bool rubberband_selecting_; Timeline::TrackType drag_track_type_; @@ -120,6 +121,8 @@ private: TimelineViewBlockItem* clicked_item_; + QPoint drag_global_start_; + }; } diff --git a/app/widget/timelinewidget/tool/zoom.cpp b/app/widget/timelinewidget/tool/zoom.cpp index 350e98560..063a4afc6 100644 --- a/app/widget/timelinewidget/tool/zoom.cpp +++ b/app/widget/timelinewidget/tool/zoom.cpp @@ -31,19 +31,21 @@ ZoomTool::ZoomTool(TimelineWidget *parent) : void ZoomTool::MousePress(TimelineViewMouseEvent *event) { Q_UNUSED(event) + + drag_global_start_ = QCursor::pos(); } void ZoomTool::MouseMove(TimelineViewMouseEvent *event) { Q_UNUSED(event) - if (dragging_) { - parent()->MoveRubberBandSelect(false, false); - } else { - parent()->StartRubberBandSelect(false, false); + if (!dragging_) { + parent()->StartRubberBandSelect(drag_global_start_); dragging_ = true; } + + parent()->MoveRubberBandSelect(false, false); } void ZoomTool::MouseRelease(TimelineViewMouseEvent *event) diff --git a/app/widget/timelinewidget/tool/zoom.h b/app/widget/timelinewidget/tool/zoom.h index 26940d8d0..6557ca0b2 100644 --- a/app/widget/timelinewidget/tool/zoom.h +++ b/app/widget/timelinewidget/tool/zoom.h @@ -34,6 +34,9 @@ public: virtual void MouseMove(TimelineViewMouseEvent *event) override; virtual void MouseRelease(TimelineViewMouseEvent *event) override; +private: + QPoint drag_global_start_; + }; }