+void Ruler::mouseMoveEvent(QMouseEvent *e)
+{
+ mouse_point_ = e->pos();
+
+ if (!(e->buttons() & Qt::LeftButton))
+ return;
+
+ if ((e->pos() - mouse_down_point_).manhattanLength() <
+ QApplication::startDragDistance())
+ return;
+
+ // Do the drag
+ dragging_ = true;
+
+ const int delta = e->pos().x() - mouse_down_point_.x();
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto &i : items)
+ if (i->dragging())
+ i->set_time(view_.offset() +
+ (i->drag_point().x() + delta - 0.5) *
+ view_.scale());
+}
+
+void Ruler::mousePressEvent(QMouseEvent *e)
+{
+ if (e->buttons() & Qt::LeftButton) {
+ mouse_down_point_ = e->pos();
+
+ mouse_down_item_.reset();
+
+ clear_selection();
+
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto i = items.rbegin(); i != items.rend(); i++)
+ if ((*i)->label_rect(rect()).contains(e->pos())) {
+ mouse_down_item_ = (*i);
+ break;
+ }
+
+ if (mouse_down_item_) {
+ mouse_down_item_->select();
+ mouse_down_item_->drag();
+ }
+
+ selection_changed();
+ }
+}
+
+void Ruler::mouseReleaseEvent(QMouseEvent *)
+{
+ using pv::widgets::Popup;
+
+ if (!dragging_ && mouse_down_item_) {
+ Popup *const p = mouse_down_item_->create_popup(&view_);
+ if (p) {
+ const QPoint arrpos(mouse_down_item_->get_x(),
+ height() - BaselineOffset);
+ p->set_position(mapToGlobal(arrpos), Popup::Bottom);
+ p->show();
+ }
+ }
+
+ dragging_ = false;
+ mouse_down_item_.reset();
+
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto &i : items)
+ i->drag_release();
+}
+
+void Ruler::leaveEvent(QEvent*)
+{
+ mouse_point_ = QPoint(-1, -1);
+ update();
+}
+
+void Ruler::mouseDoubleClickEvent(QMouseEvent *e)
+{
+ view_.add_flag(view_.offset() + ((double)e->x() + 0.5) * view_.scale());
+}
+
+void Ruler::keyPressEvent(QKeyEvent *e)
+{
+ assert(e);
+
+ if (e->key() == Qt::Key_Delete)
+ {
+ const vector< shared_ptr<TimeItem> > items(view_.time_items());
+ for (auto &i : items)
+ if (i->selected())
+ i->delete_pressed();
+ }