+bool ViewWidget::accept_drag() const
+{
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+
+ const bool any_row_items_selected = any_of(view_.begin(), view_.end(),
+ [](const shared_ptr<RowItem> &r) { return r->selected(); });
+
+ const bool any_time_items_selected = any_of(items.begin(), items.end(),
+ [](const shared_ptr<TimeItem> &i) { return i->selected(); });
+
+ if (any_row_items_selected && !any_time_items_selected)
+ {
+ // 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 false;
+ }
+
+ return true;
+ }
+ else if (any_time_items_selected && !any_row_items_selected)
+ {
+ return true;
+ }
+
+ return false;
+}
+
+void ViewWidget::drag_items(const QPoint &delta)
+{
+ // Drag the row items
+ RowItemOwner *item_owner = nullptr;
+ for (std::shared_ptr<RowItem> r : view_)
+ if (r->dragging()) {
+ item_owner = r->owner();
+ r->drag_by(delta);
+
+ // Ensure the trace is selected
+ r->select();
+ }
+
+ if (item_owner) {
+ item_owner->restack_items();
+ for (const auto &r : *item_owner)
+ r->animate_to_layout_v_offset();
+ }
+
+ // Drag the time items
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto &i : items)
+ if (i->dragging())
+ i->drag_by(delta);
+}
+