+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+ void aborted (bool);
+
+ std::pair<ARDOUR::framecnt_t, int> move_threshold () const {
+ return std::make_pair (4, 4);
+ }
+
+private:
+ bool _zoom_out;
+};
+
+/** Drag of a range of automation data, changing value but not position */
+class AutomationRangeDrag : public Drag
+{
+public:
+ AutomationRangeDrag (Editor *, ArdourCanvas::Item *, std::list<ARDOUR::AudioRange> const &);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+ void aborted (bool);
+
+ bool x_movement_matters () const {
+ return false;
+ }
+
+private:
+ std::list<ARDOUR::AudioRange> _ranges;
+ AutomationTimeAxisView* _atav;
+
+ /** A line that is part of the drag */
+ struct Line {
+ boost::shared_ptr<AutomationLine> line; ///< the line
+ std::list<ControlPoint*> points; ///< points to drag on the line
+ std::pair<ARDOUR::framepos_t, ARDOUR::framepos_t> range; ///< the range of all points on the line, in session frames
+ XMLNode* state; ///< the XML state node before the drag
+ };
+
+ std::list<Line> _lines;
+
+ bool _nothing_to_drag;