+void Viewport::item_hover(const shared_ptr<ViewItem> &item)
+{
+ if (item && item->is_draggable())
+ setCursor(dynamic_pointer_cast<RowItem>(item) ?
+ Qt::SizeVerCursor : Qt::SizeHorCursor);
+ else
+ unsetCursor();
+}
+
+void Viewport::drag()
+{
+ drag_offset_ = view_.offset();
+ drag_v_offset_ = view_.owner_visual_v_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()));
+
+ view_.set_v_offset(-drag_v_offset_ - delta.y());
+}
+
+void Viewport::drag_release()
+{
+ drag_offset_ = boost::none;
+}
+