X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_drag.h;h=ae4191909ea9f03056bdad52e7082b9529cfcd1f;hb=b637c2223f0d2bbe5eff1f10ad7b1ba0c5ccc86a;hp=3f4c82d2d006ac9116d711812209ff4a6c3597b7;hpb=cf806123ca5faaef483f898daba3f7bd38ec62eb;p=ardour.git diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 3f4c82d2d0..ae4191909e 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -27,7 +27,9 @@ #include "ardour/types.h" +#include "cursor_context.h" #include "editor_items.h" +#include "mouse_cursors.h" namespace ARDOUR { class Location; @@ -54,12 +56,11 @@ public: ~DragManager (); bool motion_handler (GdkEvent *, bool); - bool window_motion_handler (GdkEvent *, bool); void abort (); void add (Drag *); - void set (Drag *, GdkEvent *, Gdk::Cursor* c = 0); - void start_grab (GdkEvent *, Gdk::Cursor* c = 0); + void set (Drag *, GdkEvent *, Gdk::Cursor* c = MouseCursors::invalid_cursor()); + void start_grab (GdkEvent *, Gdk::Cursor* c = MouseCursors::invalid_cursor()); bool end_grab (GdkEvent *); bool have_item (ArdourCanvas::Item *) const; @@ -103,7 +104,7 @@ private: class Drag { public: - Drag (Editor *, ArdourCanvas::Item *); + Drag (Editor *, ArdourCanvas::Item *, bool trackview_only = true); virtual ~Drag () {} void set_manager (DragManager* m) { @@ -155,7 +156,7 @@ public: * @return true if this drag should happen in this mouse mode. */ virtual bool active (Editing::MouseMode m) { - return (m != Editing::MouseGain); + return true; } /** @return minimum number of frames (in x) and pixels (in y) that should be considered a movement */ @@ -177,6 +178,10 @@ public: return true; } + bool initially_vertical() const { + return _initially_vertical; + } + /** Set up the _pointer_frame_offset */ virtual void setup_pointer_frame_offset () { _pointer_frame_offset = 0; @@ -212,6 +217,9 @@ protected: return _last_pointer_frame; } + double current_pointer_x () const; + double current_pointer_y () const; + boost::shared_ptr add_midi_region (MidiTimeAxisView*); void show_verbose_cursor_time (framepos_t); @@ -228,16 +236,19 @@ 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 _starting_point_passed; ///< true if we called move () with first_move flag, otherwise false + bool _initially_vertical; ///< true if after move threshold is passed we appear to be moving vertically; undefined before that 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 ARDOUR::framepos_t _grab_frame; ///< adjusted_frame that the mouse was at when start_grab was called, or 0 ARDOUR::framepos_t _last_pointer_frame; ///< adjusted_frame the last time a motion occurred + CursorContext::Handle _cursor_ctx; ///< cursor change context }; class RegionDrag; @@ -246,7 +257,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 +272,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) */ @@ -279,6 +292,7 @@ protected: /** a list of the non-hidden TimeAxisViews sorted by editor order key */ std::vector _time_axis_views; int find_time_axis_view (TimeAxisView *) const; + int apply_track_delta (const int start, const int delta, const int skip) const; int _visible_y_low; int _visible_y_high; @@ -313,13 +327,14 @@ 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, int skip_invisible = 0) const; bool _brushing; ARDOUR::framepos_t _last_frame_position; ///< last position of the thing being dragged double _total_x_delta; int _last_pointer_time_axis_view; double _last_pointer_layer; + bool _single_axis; }; @@ -346,9 +361,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 +392,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 +425,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, int skip_invisible = 0) 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 { @@ -475,6 +534,14 @@ public: void finished (GdkEvent *, bool); void aborted (bool); + bool active (Editing::MouseMode mode) { + return mode == Editing::MouseDraw; + } + + bool y_movement_matters () const { + return false; + } + private: double y_to_region (double) const; framecnt_t grid_frames (framepos_t) const; @@ -572,6 +639,7 @@ private: Operation _operation; bool _preserve_fade_anchor; + bool _jump_position_when_done; }; /** Meter marker drag */ @@ -640,10 +708,6 @@ public: void finished (GdkEvent *, bool); void aborted (bool); - bool active (Editing::MouseMode) { - return true; - } - bool allow_vertical_autoscroll () const { return false; } @@ -771,17 +835,11 @@ public: void finished (GdkEvent *, bool); void aborted (bool); - bool active (Editing::MouseMode) { - return true; - } - private: AutomationLine* _line; double _fixed_grab_x; double _fixed_grab_y; - uint32_t _before; - uint32_t _after; double _cumulative_y_drag; }; @@ -796,10 +854,6 @@ public: void finished (GdkEvent *, bool); void aborted (bool); - bool active (Editing::MouseMode) { - return true; - } - private: ArdourCanvas::Line* _line; @@ -929,9 +983,7 @@ public: private: Operation _operation; bool _add; - bool _extend; int _original_pointer_time_axis; - int _last_pointer_time_axis; std::list _added_time_axes; bool _time_selection_at_start; framepos_t start_at_start; @@ -943,13 +995,15 @@ class RangeMarkerBarDrag : public Drag { public: enum Operation { + CreateSkipMarker, CreateRangeMarker, CreateTransportMarker, CreateCDMarker }; RangeMarkerBarDrag (Editor *, ArdourCanvas::Item *, Operation); - + ~RangeMarkerBarDrag (); + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); void finished (GdkEvent *, bool); @@ -997,7 +1051,7 @@ class AutomationRangeDrag : public Drag { public: AutomationRangeDrag (Editor *, AutomationTimeAxisView *, std::list const &); - AutomationRangeDrag (Editor *, AudioRegionView *, std::list const &); + AutomationRangeDrag (Editor *, RegionView *, std::list const &); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); @@ -1008,13 +1062,10 @@ public: return false; } - bool active (Editing::MouseMode) { - return true; - } - private: void setup (std::list > const &); - double y_fraction (boost::shared_ptr, double global_y_position) const; + double y_fraction (boost::shared_ptr, double global_y_position) const; + double value (boost::shared_ptr list, double x) const; std::list _ranges; @@ -1028,8 +1079,9 @@ private: }; std::list _lines; - double y_origin; - bool _nothing_to_drag; + double _y_origin; + bool _nothing_to_drag; + bool _integral; }; /** Drag of one edge of an xfade