fix up some basic conceptual errors with canvas-simpleline, mostly relating to coordi...
[ardour.git] / gtk2_ardour / editor_drag.h
index 80ffbb927c01d1e7b9402b71fecaf574af56ddb8..1268cbf8c4fef84f226e53be8860e7bc76aaff50 100644 (file)
@@ -42,6 +42,7 @@ namespace PBD {
 namespace Gnome {
        namespace Canvas {
                class CanvasNoteEvent;
+               class CanvasPatchChange;
        }
 }
 
@@ -146,8 +147,9 @@ public:
 
        /** Called to abort a drag and return things to how
         *  they were before it started.
+        *  @param m true if some movement occurred, otherwise false.
         */
-       virtual void aborted () = 0;
+       virtual void aborted (bool m) = 0;
 
        /** @param m Mouse mode.
         *  @return true if this drag should happen in this mouse mode.
@@ -175,6 +177,11 @@ public:
                return true;
        }
 
+       /** Set up the _pointer_frame_offset */
+       virtual void setup_pointer_frame_offset () {
+               _pointer_frame_offset = 0;
+       }
+
 protected:
 
        double grab_x () const {
@@ -239,6 +246,8 @@ struct DraggingView
        /** layer that this region is currently being displayed on */
        ARDOUR::layer_t layer;
        double initial_y; ///< the initial y position of the view before any reparenting
+       framepos_t initial_position; ///< initial position of the region
+       framepos_t initial_end; ///< initial end position of the region
        boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
 };
 
@@ -281,7 +290,7 @@ public:
        virtual void start_grab (GdkEvent *, Gdk::Cursor *);
        virtual void motion (GdkEvent *, bool);
        virtual void finished (GdkEvent *, bool) = 0;
-       virtual void aborted ();
+       virtual void aborted (bool);
 
        /** @return true if the regions being `moved' came from somewhere on the canvas;
         *  false if they came from outside (e.g. from the region list).
@@ -310,10 +319,9 @@ public:
        RegionMoveDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &, bool, bool);
        virtual ~RegionMoveDrag () {}
 
-       virtual void start_grab (GdkEvent *, Gdk::Cursor *);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool regions_came_from_canvas () const {
                return true;
@@ -323,6 +331,8 @@ public:
                return std::make_pair (4, 4);
        }
 
+       void setup_pointer_frame_offset ();
+
 private:
        typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
 
@@ -367,7 +377,7 @@ public:
        RegionInsertDrag (Editor *, boost::shared_ptr<ARDOUR::Region>, RouteTimeAxisView*, ARDOUR::framepos_t);
 
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool regions_came_from_canvas () const {
                return false;
@@ -382,7 +392,7 @@ public:
 
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 };
 
 /** Drags to create regions */
@@ -393,11 +403,12 @@ public:
 
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
 private:
        MidiTimeAxisView* _view;
        boost::shared_ptr<ARDOUR::Region> _region;
+        void add_region ();
 };
 
 /** Drags to resize MIDI notes */
@@ -409,7 +420,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
 private:
        MidiRegionView*     region;
@@ -426,7 +437,7 @@ class NoteDrag : public Drag
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
   private:
 
@@ -441,6 +452,28 @@ class NoteDrag : public Drag
        double _note_height;
 };
 
+/** Drag to move MIDI patch changes */
+class PatchChangeDrag : public Drag
+{
+public:
+       PatchChangeDrag (Editor *, ArdourCanvas::CanvasPatchChange *, MidiRegionView *);
+
+       void motion (GdkEvent *, bool);
+       void finished (GdkEvent *, bool);
+       void aborted (bool);
+
+       bool y_movement_matters () const {
+               return false;
+       }
+
+       void setup_pointer_frame_offset ();
+
+private:
+       MidiRegionView* _region_view;
+       ArdourCanvas::CanvasPatchChange* _patch_change;
+       double _cumulative_dx;
+};
+
 /** Drag of region gain */
 class RegionGainDrag : public Drag
 {
@@ -453,7 +486,7 @@ public:
                return (m == Editing::MouseGain);
        }
 
-       void aborted ();
+       void aborted (bool);
 };
 
 /** Drag to trim region(s) */
@@ -471,16 +504,17 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool y_movement_matters () const {
                return false;
        }
 
+       void setup_pointer_frame_offset ();
+       
 private:
 
        Operation _operation;
-       bool _have_transaction; ///< true if a transaction has been started, false otherwise. Must be set true by derived class.
 };
 
 /** Meter marker drag */
@@ -492,7 +526,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool allow_vertical_autoscroll () const {
                return false;
@@ -501,6 +535,8 @@ public:
        bool y_movement_matters () const {
                return false;
        }
+
+       void setup_pointer_frame_offset ();
        
 private:
        MeterMarker* _marker;
@@ -516,7 +552,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool allow_vertical_autoscroll () const {
                return false;
@@ -526,13 +562,15 @@ public:
                return false;
        }
 
+       void setup_pointer_frame_offset ();
+       
 private:
        TempoMarker* _marker;
        bool _copy;
 };
 
 
-/** Drag of a cursor */
+/** Drag of the playhead cursor */
 class CursorDrag : public Drag
 {
 public:
@@ -541,7 +579,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool active (Editing::MouseMode) {
                return true;
@@ -554,11 +592,11 @@ public:
        bool y_movement_matters () const {
                return false;
        }
-
+       
 private:
-       EditorCursor* _cursor; ///< cursor being dragged
+       void fake_locate (framepos_t);
+       
        bool _stop; ///< true to stop the transport on starting the drag, otherwise false
-
 };
 
 /** Region fade-in drag */
@@ -570,11 +608,13 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool y_movement_matters () const {
                return false;
        }
+
+       void setup_pointer_frame_offset ();
 };
 
 /** Region fade-out drag */
@@ -586,11 +626,13 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool y_movement_matters () const {
                return false;
        }
+
+       void setup_pointer_frame_offset ();
 };
 
 /** Marker drag */
@@ -603,7 +645,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool allow_vertical_autoscroll () const {
                return false;
@@ -612,13 +654,14 @@ public:
        bool y_movement_matters () const {
                return false;
        }
+
+       void setup_pointer_frame_offset ();
        
 private:
        void update_item (ARDOUR::Location *);
 
        Marker* _marker; ///< marker being dragged
        std::list<ARDOUR::Location*> _copied_locations;
-       ArdourCanvas::Line* _line;
        ArdourCanvas::Points _points;
 };
 
@@ -631,7 +674,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool active (Editing::MouseMode m);
 
@@ -654,7 +697,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool active (Editing::MouseMode) {
                return true;
@@ -679,7 +722,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool active (Editing::MouseMode) {
                return true;
@@ -706,7 +749,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        std::pair<ARDOUR::framecnt_t, int> move_threshold () const {
                return std::make_pair (8, 1);
@@ -722,7 +765,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 };
 
 /** Scrub drag in audition mode */
@@ -734,7 +777,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 };
 
 /** Drag in range select mode */
@@ -753,7 +796,9 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
+
+       void setup_pointer_frame_offset ();
 
 private:
        Operation _operation;
@@ -778,7 +823,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool allow_vertical_autoscroll () const {
                return false;
@@ -805,7 +850,14 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       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 */
@@ -817,7 +869,7 @@ public:
        void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
        void motion (GdkEvent *, bool);
        void finished (GdkEvent *, bool);
-       void aborted ();
+       void aborted (bool);
 
        bool x_movement_matters () const {
                return false;