some code shuffling to make sure that cut mode always operates at the mouse location...
[ardour.git] / gtk2_ardour / editor_drag.h
index 3f4c82d2d006ac9116d711812209ff4a6c3597b7..378162621e5a9efde9bb2ecfdeea5a46da2f6931 100644 (file)
@@ -54,7 +54,6 @@ public:
        ~DragManager ();
 
        bool motion_handler (GdkEvent *, bool);
-       bool window_motion_handler (GdkEvent *, bool);
 
        void abort ();
        void add (Drag *);
@@ -103,7 +102,7 @@ private:
 class Drag
 {
 public:
-        Drag (Editor *, ArdourCanvas::Item *);
+        Drag (Editor *, ArdourCanvas::Item *, bool trackview_only = true);
        virtual ~Drag () {}
 
        void set_manager (DragManager* m) {
@@ -212,6 +211,8 @@ protected:
                return _last_pointer_frame;
        }
 
+       double current_pointer_y () const;
+
        boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*);
 
        void show_verbose_cursor_time (framepos_t);
@@ -228,11 +229,11 @@ protected:
        bool _was_rolling; ///< true if the session was rolling before the drag started, otherwise false
 
 private:
-
+       bool _trackview_only; ///< true if pointer y value should always be relative to the top of the trackview group
        bool _move_threshold_passed; ///< true if the move threshold has been passed, otherwise false
         bool _was_double_click; ///< true if drag initiated by a double click event
        double _grab_x; ///< trackview x of the grab start position
-       double _grab_y; ///< trackview y of the grab start position
+       double _grab_y; ///< y of the grab start position, possibly adjusted if _trackview_only is true
        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
        ARDOUR::framepos_t _raw_grab_frame; ///< unsnapped frame that the mouse was at when start_grab was called, or 0
@@ -246,7 +247,7 @@ class RegionDrag;
 class DraggingView
 {
 public:
-       DraggingView (RegionView *, RegionDrag *);
+       DraggingView (RegionView *, RegionDrag *, TimeAxisView* original_tav);
 
        RegionView* view; ///< the view
        /** index into RegionDrag::_time_axis_views of the view that this region is currently being displayed on,
@@ -261,7 +262,9 @@ public:
        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
+       framepos_t anchored_fade_length; ///< fade_length when anchored during drag
        boost::shared_ptr<ARDOUR::Playlist> initial_playlist;
+       TimeAxisView* initial_time_axis_view;
 };
 
 /** Abstract base class for drags that involve region(s) */
@@ -313,7 +316,7 @@ public:
 protected:
 
        double compute_x_delta (GdkEvent const *, ARDOUR::framepos_t *);
-       bool y_movement_allowed (int, double) const;
+       virtual bool y_movement_allowed (int, double) const;
 
        bool _brushing;
        ARDOUR::framepos_t _last_frame_position; ///< last position of the thing being dragged
@@ -346,9 +349,11 @@ public:
 
        void setup_pointer_frame_offset ();
 
-private:
+protected:
        typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
+       void add_stateful_diff_commands_for_playlists (PlaylistSet const &);
 
+private:
        void finished_no_copy (
                bool const,
                bool const,
@@ -375,9 +380,9 @@ private:
                PlaylistSet& modified_playlists
                );
 
-       void add_stateful_diff_commands_for_playlists (PlaylistSet const &);
 
        void collect_new_region_view (RegionView *);
+       RouteTimeAxisView* create_destination_time_axis (boost::shared_ptr<ARDOUR::Region>, TimeAxisView* original);
 
        bool _copy;
        RegionView* _new_region_view;
@@ -408,6 +413,48 @@ public:
        void aborted (bool);
 };
 
+/** Region drag in ripple mode */
+
+class RegionRippleDrag : public RegionMoveDrag
+{
+public:
+       RegionRippleDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
+       ~RegionRippleDrag () { delete exclude; }
+
+       void motion (GdkEvent *, bool);
+       void finished (GdkEvent *, bool);
+       void aborted (bool);
+protected:
+       bool y_movement_allowed (int delta_track, double delta_layer) const;
+
+private:
+       TimeAxisView *prev_tav;         // where regions were most recently dragged from
+       TimeAxisView *orig_tav;         // where drag started
+       framecnt_t prev_amount;
+       framepos_t prev_position;
+       framecnt_t selection_length;
+       bool allow_moves_across_tracks; // only if all selected regions are on one track
+       ARDOUR::RegionList *exclude;
+       void add_all_after_to_views (TimeAxisView *tav, framepos_t where, const RegionSelection &exclude, bool drag_in_progress);
+       void remove_unselected_from_views (framecnt_t amount, bool move_regions);
+
+};
+
+/** "Drag" to cut a region (action only on button release) */
+class RegionCutDrag : public Drag
+{
+    public:
+       RegionCutDrag (Editor*, ArdourCanvas::Item*, framepos_t);
+       ~RegionCutDrag ();
+
+       void motion (GdkEvent*, bool);
+       void finished (GdkEvent*, bool);
+       void aborted (bool);
+
+    private:
+       EditorCursor* line;
+};
+
 /** Drags to create regions */
 class RegionCreateDrag : public Drag
 {
@@ -572,6 +619,7 @@ private:
        Operation _operation;
        
        bool _preserve_fade_anchor;
+       bool _jump_position_when_done;
 };
 
 /** Meter marker drag */