Fix finding session templates
[ardour.git] / gtk2_ardour / editor_drag.h
index 4b7114c67ca027b1d2f15b6fcb52f08767558628..3c1eef70f6152fb3424ccfcd074eb917fab9fa38 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) */
@@ -379,6 +382,7 @@ private:
 
 
        void collect_new_region_view (RegionView *);
+       RouteTimeAxisView* create_destination_time_axis (boost::shared_ptr<ARDOUR::Region>, TimeAxisView* original);
 
        bool _copy;
        RegionView* _new_region_view;
@@ -421,17 +425,8 @@ public:
        void finished (GdkEvent *, bool);
        void aborted (bool);
 protected:
-       bool y_movement_allowed (int delta_track, double delta_layer) const {
-               std::cerr << "RegionRippleDrag::y_movement_allowed (" << delta_track << ", " << delta_layer << ")..." << std::endl;
-               if (RegionMotionDrag::y_movement_allowed (delta_track, delta_layer)) {
-                       if (delta_track) {
-                               return allow_moves_across_tracks;
-                       } else {
-                               return true;
-                       }
-               }
-               return false;
-       }
+       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
@@ -441,8 +436,23 @@ private:
        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);
+       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 */
@@ -981,6 +991,7 @@ class RangeMarkerBarDrag : public Drag
 {
 public:
        enum Operation {
+               CreateSkipMarker,
                CreateRangeMarker,
                CreateTransportMarker,
                CreateCDMarker