+ XMLNode* _before_state;
+ bool _drag_valid;
+};
+
+/** tempo curve twist drag */
+class TempoTwistDrag : public Drag
+{
+public:
+ TempoTwistDrag (Editor *, ArdourCanvas::Item *);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+ void aborted (bool);
+
+ bool allow_vertical_autoscroll () const {
+ return false;
+ }
+
+ bool y_movement_matters () const {
+ return true;
+ }
+
+ void setup_pointer_sample_offset ();
+
+private:
+ double _grab_qn;
+ ARDOUR::Tempo _grab_tempo;
+ ARDOUR::TempoSection* _tempo;
+ ARDOUR::TempoSection* _next_tempo;
+ bool _drag_valid;
+ XMLNode* _before_state;
+};
+
+
+/** tempo curve twist drag */
+class TempoEndDrag : public Drag
+{
+public:
+ TempoEndDrag (Editor *, ArdourCanvas::Item *);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+ void aborted (bool);
+
+ bool allow_vertical_autoscroll () const {
+ return false;
+ }
+
+ bool y_movement_matters () const {
+ return true;
+ }
+
+ void setup_pointer_sample_offset ();
+
+private:
+ double _grab_qn;
+ ARDOUR::TempoSection* _tempo;
+ XMLNode* _before_state;
+ bool _drag_valid;