colinf's vertical double arrow track resize cursor patch
[ardour.git] / gtk2_ardour / editor_drag.h
index 2b0207c7df1f4ea233bf28910def2fbcf809e662..fb66a2c74665a86baa060312665c670d504310eb 100644 (file)
@@ -37,29 +37,35 @@ namespace ARDOUR {
 class Editor;
 class EditorCursor;
 class TimeAxisView;
+class Drag;
 
-/** Abstract base class for dragging of things within the editor */
-class Drag
+/** Class to manage current drags */
+class DragManager
 {
-
 public:
-       Drag (Editor *, ArdourCanvas::Item *);
-       virtual ~Drag () {}
 
-       /** @return the canvas item being dragged */
-       ArdourCanvas::Item* item () const {
-               return _item;
-       }
+       DragManager (Editor* e);
+       ~DragManager ();
 
-       void swap_grab (ArdourCanvas::Item *, Gdk::Cursor *, uint32_t);
-       bool motion_handler (GdkEvent*, bool);
+       bool motion_handler (GdkEvent *, bool);
+
+       void abort ();
        void break_drag ();
+       void add (Drag *);
+       void set (Drag *, GdkEvent *, Gdk::Cursor* c = 0);
+       void start_grab (GdkEvent *);
+       bool end_grab (GdkEvent *);
+       bool have_item (ArdourCanvas::Item *) const;
 
-       /** @return true if an end drag is in progress */
+       /** @return true if an end drag or break_drag is in progress */
        bool ending () const {
                return _ending;
        }
 
+       bool active () const {
+               return !_drags.empty ();
+       }
+
        /** @return current pointer x position in trackview coordinates */
        double current_pointer_x () const {
                return _current_pointer_x;
@@ -70,6 +76,40 @@ public:
                return _current_pointer_y;
        }
 
+       /** @return current pointer frame */
+       nframes64_t current_pointer_frame () const {
+               return _current_pointer_frame;
+       }
+
+private:
+       Editor* _editor;
+       std::list<Drag*> _drags;
+       bool _ending; ///< true if end_grab or break_drag is in progress, otherwise false
+       double _current_pointer_x; ///< trackview x of the current pointer
+       double _current_pointer_y; ///< trackview y of the current pointer
+       nframes64_t _current_pointer_frame; ///< frame that the pointer is now at
+};
+
+/** Abstract base class for dragging of things within the editor */
+class Drag
+{
+public:
+       Drag (Editor *, ArdourCanvas::Item *);
+       virtual ~Drag () {}
+
+       void set_manager (DragManager* m) {
+               _drags = m;
+       }
+
+       /** @return the canvas item being dragged */
+       ArdourCanvas::Item* item () const {
+               return _item;
+       }
+
+       void swap_grab (ArdourCanvas::Item *, Gdk::Cursor *, uint32_t);
+       bool motion_handler (GdkEvent*, bool);
+       void break_drag ();
+
        nframes64_t adjusted_frame (nframes64_t, GdkEvent const *, bool snap = true) const;
        nframes64_t adjusted_current_frame (GdkEvent const *, bool snap = true) const;
        
@@ -124,11 +164,6 @@ public:
                return true;
        }
 
-       /** @return current x extent of the thing being dragged; ie
-        *  a pair of (leftmost_position, rightmost_position)
-        */
-       virtual std::pair<nframes64_t, nframes64_t> extent () const;
-
 protected:
 
        double grab_x () const {
@@ -156,27 +191,23 @@ protected:
        }
 
        Editor* _editor; ///< our editor
+       DragManager* _drags;
        ArdourCanvas::Item* _item; ///< our item
        /** Offset from the mouse's position for the drag to the start of the thing that is being dragged */
        nframes64_t _pointer_frame_offset;
        bool _x_constrained; ///< true if x motion is constrained, otherwise false
        bool _y_constrained; ///< true if y motion is constrained, otherwise false
        bool _was_rolling; ///< true if the session was rolling before the drag started, otherwise false
-       bool _have_transaction; ///< true if a transaction has been started, false otherwise. Must be set true by derived class.
 
 private:
 
-       bool _ending; ///< true if end_grab or break_drag is in progress, otherwise false
        bool _move_threshold_passed; ///< true if the move threshold has been passed, otherwise false
        double _grab_x; ///< trackview x of the grab start position
        double _grab_y; ///< trackview y of the grab start position
-       double _current_pointer_x; ///< trackview x of the current pointer
-       double _current_pointer_y; ///< trackview y of the current pointer
        double _last_pointer_x; ///< trackview x of the pointer last time a motion occurred
        double _last_pointer_y; ///< trackview y of the pointer last time a motion occurred
        nframes64_t _grab_frame; ///< adjusted_frame that the mouse was at when start_grab was called, or 0
        nframes64_t _last_pointer_frame; ///< adjusted_frame the last time a motion occurred
-       nframes64_t _current_pointer_frame; ///< frame that the pointer is now at
 };
 
 
@@ -187,8 +218,6 @@ public:
        RegionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
        virtual ~RegionDrag () {}
 
-       std::pair<nframes64_t, nframes64_t> extent () const;
-
 protected:
 
        RegionView* _primary; ///< the view that was clicked on (or whatever) to start the drag
@@ -378,6 +407,7 @@ public:
 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 */