+ // Save the offsets of any signals which will be dragged
+ for (const shared_ptr<RowItem> r : view_)
+ if (r->selected())
+ r->drag();
+
+ selection_changed();
+ update();
+}
+
+void Header::mousePressEvent(QMouseEvent *event)
+{
+ assert(event);
+
+ mouse_down_point_ = event->pos();
+ mouse_down_item_ = get_mouse_over_row_item(event->pos());
+
+ if (event->button() & Qt::LeftButton)
+ mouseLeftPressEvent(event);
+}
+
+void Header::mouseLeftReleaseEvent(QMouseEvent *event)
+{
+ assert(event);
+
+ const bool ctrl_pressed =
+ QApplication::keyboardModifiers() & Qt::ControlModifier;
+
+ // Unselect everything if control is not pressed
+ const shared_ptr<RowItem> mouse_over =
+ get_mouse_over_row_item(event->pos());
+
+ for (auto &r : view_)
+ r->drag_release();
+
+ if (dragging_)
+ view_.restack_all_row_items();
+ else
+ {
+ if (!ctrl_pressed) {
+ for (shared_ptr<RowItem> r : view_)
+ if (mouse_down_item_ != r)
+ r->select(false);
+
+ if (mouse_down_item_)
+ show_popup(mouse_down_item_);
+ }
+ }
+
+ dragging_ = false;
+}
+
+void Header::mouseReleaseEvent(QMouseEvent *event)
+{
+ assert(event);
+ if (event->button() & Qt::LeftButton)
+ mouseLeftReleaseEvent(event);
+
+ mouse_down_item_ = nullptr;