+
+ if (!(event->buttons() & Qt::LeftButton))
+ return;
+
+ if ((event->pos() - _mouse_down_point).manhattanLength() <
+ QApplication::startDragDistance())
+ return;
+
+ // Check all the drag items share a common owner
+ RowItemOwner *item_owner = nullptr;
+ for (shared_ptr<RowItem> r : _view)
+ if (r->dragging()) {
+ if (!item_owner)
+ item_owner = r->owner();
+ else if(item_owner != r->owner())
+ return;
+ }
+
+ if (!item_owner)
+ return;
+
+ // Do the drag
+ _dragging = true;
+
+ const int delta = event->pos().y() - _mouse_down_point.y();
+
+ for (std::shared_ptr<RowItem> r : _view)
+ if (r->dragging()) {
+ r->force_to_v_offset(r->drag_point().y() + delta);
+
+ // Ensure the trace is selected
+ r->select();
+ }
+
+ item_owner->restack_items();
+ for (const auto &r : *item_owner)
+ r->animate_to_layout_v_offset();
+ signals_moved();
+