X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_drag.h;h=3c1eef70f6152fb3424ccfcd074eb917fab9fa38;hb=45fd3593eba84e2d89290f5112f4541bb9399209;hp=3f4c82d2d006ac9116d711812209ff4a6c3597b7;hpb=045ef69ac37550cf376d40443555a57a931fe7b0;p=ardour.git diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 3f4c82d2d0..3c1eef70f6 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -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 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 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 > 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, 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 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 */ @@ -943,6 +991,7 @@ class RangeMarkerBarDrag : public Drag { public: enum Operation { + CreateSkipMarker, CreateRangeMarker, CreateTransportMarker, CreateCDMarker