- int h = 0;
- const vector< shared_ptr<Trace> > traces(_view.get_traces());
- BOOST_FOREACH(const shared_ptr<Trace> t, traces) {
- assert(t);
- h = max(t->get_v_offset() + View::SignalHeight, h);
+ if (item && item->is_draggable())
+ setCursor(dynamic_pointer_cast<RowItem>(item) ?
+ Qt::SizeVerCursor : Qt::SizeHorCursor);
+ else
+ unsetCursor();
+}
+
+void Viewport::drag()
+{
+ drag_offset_ = view_.offset();
+}
+
+void Viewport::drag_by(const QPoint &delta)
+{
+ if (drag_offset_ == boost::none)
+ return;
+
+ view_.set_scale_offset(view_.scale(),
+ (*drag_offset_ - delta.x() * view_.scale()));
+}
+
+void Viewport::drag_release()
+{
+ drag_offset_ = boost::none;
+}
+
+vector< shared_ptr<ViewItem> > Viewport::items()
+{
+ vector< shared_ptr<ViewItem> > items;
+ const std::vector< shared_ptr<ViewItem> > view_items(
+ view_.list_by_type<ViewItem>());
+ copy(view_items.begin(), view_items.end(), back_inserter(items));
+ const vector< shared_ptr<TimeItem> > time_items(view_.time_items());
+ copy(time_items.begin(), time_items.end(), back_inserter(items));
+ return items;
+}
+
+bool Viewport::touch_event(QTouchEvent *event)
+{
+ QList<QTouchEvent::TouchPoint> touchPoints = event->touchPoints();
+
+ if (touchPoints.count() != 2) {
+ pinch_zoom_active_ = false;
+ return false;