X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_drag.h;h=17e459ba67c1608ba041bf05f58d93301dc8ac10;hb=0310f8997147cc50600a98f05ef1a6c486e688c7;hp=f235881d035287376d7bcabd1ce77d828f3b8b6a;hpb=62f37da98930b055406a90b4206aa26a949d2959;p=ardour.git diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index f235881d03..17e459ba67 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -34,6 +34,7 @@ #include "editor_items.h" #include "mouse_cursors.h" #include "editing.h" +#include "track_selection.h" namespace ARDOUR { class Location; @@ -87,7 +88,7 @@ public: bool end_grab (GdkEvent *); bool have_item (ArdourCanvas::Item *) const; - void mark_double_click (); + void mark_double_click (); /** @return true if an end drag or abort is in progress */ bool ending () const { @@ -127,7 +128,7 @@ private: class Drag { public: - Drag (Editor *, ArdourCanvas::Item *, bool trackview_only = true); + Drag (Editor *, ArdourCanvas::Item *, bool trackview_only = true); virtual ~Drag () {} void set_manager (DragManager* m) { @@ -143,11 +144,11 @@ public: bool motion_handler (GdkEvent*, bool); void abort (); - ARDOUR::framepos_t adjusted_frame (ARDOUR::framepos_t, GdkEvent const *, bool snap = true) const; + ARDOUR::MusicFrame adjusted_frame (ARDOUR::framepos_t, GdkEvent const *, bool snap = true) const; ARDOUR::framepos_t adjusted_current_frame (GdkEvent const *, bool snap = true) const; - bool was_double_click() const { return _was_double_click; } - void set_double_click (bool yn) { _was_double_click = yn; } + bool was_double_click() const { return _was_double_click; } + void set_double_click (bool yn) { _was_double_click = yn; } /** Called to start a grab of an item. * @param e Event that caused the grab to start. @@ -241,14 +242,15 @@ protected: } ARDOUR::frameoffset_t snap_delta (guint const) const; + double snap_delta_music (guint const) const; double current_pointer_x () const; double current_pointer_y () const; /* sets snap delta from unsnapped pos */ - void setup_snap_delta (framepos_t pos); + void setup_snap_delta (ARDOUR::MusicFrame pos); - boost::shared_ptr add_midi_region (MidiTimeAxisView*, bool commit, const int32_t sub_num); + boost::shared_ptr add_midi_region (MidiTimeAxisView*, bool commit); void show_verbose_cursor_time (framepos_t); void show_verbose_cursor_duration (framepos_t, framepos_t, double xoffset = 0); @@ -268,7 +270,7 @@ private: 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 + 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; ///< 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 @@ -280,7 +282,8 @@ private: /* difference between some key position's snapped and unsnapped * framepos. used for relative snap. */ - ARDOUR::frameoffset_t _snap_delta; + framepos_t _snap_delta; + double _snap_delta_music; CursorContext::Handle _cursor_ctx; ///< cursor change context bool _constraint_pressed; ///< if the keyboard indicated constraint modifier was pressed on start_grab() }; @@ -327,7 +330,6 @@ protected: 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 bool distance_only = false) const; - int32_t current_music_divisor (framepos_t pos, int32_t button_state); int _visible_y_low; int _visible_y_high; @@ -362,12 +364,12 @@ public: protected: - double compute_x_delta (GdkEvent const *, ARDOUR::framepos_t *); + double compute_x_delta (GdkEvent const *, ARDOUR::MusicFrame *); virtual bool y_movement_allowed (int, double, int skip_invisible = 0) const; bool _brushing; bool _ignore_video_lock; - ARDOUR::framepos_t _last_frame_position; ///< last position of the thing being dragged + ARDOUR::MusicFrame _last_position; ///< last position of the thing being dragged double _total_x_delta; int _last_pointer_time_axis_view; double _last_pointer_layer; @@ -409,14 +411,14 @@ private: void finished_no_copy ( bool const, bool const, - ARDOUR::framecnt_t const, + ARDOUR::MusicFrame, int32_t const ev_state ); void finished_copy ( bool const, bool const, - ARDOUR::framecnt_t const, + ARDOUR::MusicFrame, int32_t const ev_state ); @@ -424,9 +426,10 @@ private: boost::shared_ptr, RouteTimeAxisView*, ARDOUR::layer_t, - ARDOUR::framecnt_t, + ARDOUR::MusicFrame, + double quarter_note, PlaylistSet&, - const int32_t sub_num + bool for_music = false ); void remove_region_from_playlist ( @@ -498,7 +501,7 @@ private: /** "Drag" to cut a region (action only on button release) */ class RegionCutDrag : public Drag { - public: +public: RegionCutDrag (Editor*, ArdourCanvas::Item*, framepos_t); ~RegionCutDrag (); @@ -507,7 +510,7 @@ class RegionCutDrag : public Drag void finished (GdkEvent*, bool); void aborted (bool); - private: +private: EditorCursor* line; }; @@ -548,7 +551,7 @@ private: /** Drags to move MIDI notes */ class NoteDrag : public Drag { - public: +public: NoteDrag (Editor*, ArdourCanvas::Item*); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); @@ -556,17 +559,20 @@ class NoteDrag : public Drag void finished (GdkEvent *, bool); void aborted (bool); - private: + void setup_pointer_frame_offset (); +private: - ARDOUR::frameoffset_t total_dx (const guint) const; + double total_dx (GdkEvent * event) const; // total movement in quarter notes int8_t total_dy () const; MidiRegionView* _region; NoteBase* _primary; double _cumulative_dx; double _cumulative_dy; + double _earliest; // earliest quarter note in note selection bool _was_selected; double _note_height; + bool _copy; }; class NoteCreateDrag : public Drag @@ -632,7 +638,7 @@ private: MidiRegionView* _region_view; framepos_t _last_pos; - double _last_y; + double _y; }; @@ -786,8 +792,9 @@ private: bool _copy; bool _movable; - double _grab_bpm; - XMLNode* before_state; + ARDOUR::Tempo _grab_bpm; + double _grab_qn; + XMLNode* _before_state; }; /** BBT Ruler drag */ @@ -814,7 +821,65 @@ public: private: double _grab_qn; ARDOUR::TempoSection* _tempo; - XMLNode* before_state; + XMLNode* _before_state; +}; + +/** tempo curve twist drag */ +class TempoTwistDrag : public Drag +{ +public: + TempoTwistDrag (Editor *, ArdourCanvas::Item *); + + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); + void motion (GdkEvent *, bool); + void finished (GdkEvent *, bool); + void aborted (bool); + + bool allow_vertical_autoscroll () const { + return false; + } + + bool y_movement_matters () const { + return true; + } + + void setup_pointer_frame_offset (); + +private: + double _grab_qn; + ARDOUR::Tempo _grab_tempo; + ARDOUR::TempoSection* _tempo; + ARDOUR::TempoSection* _next_tempo; + bool _drag_valid; + XMLNode* _before_state; +}; + + +/** tempo curve twist drag */ +class TempoEndDrag : public Drag +{ +public: + TempoEndDrag (Editor *, ArdourCanvas::Item *); + + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); + void motion (GdkEvent *, bool); + void finished (GdkEvent *, bool); + void aborted (bool); + + bool allow_vertical_autoscroll () const { + return false; + } + + bool y_movement_matters () const { + return true; + } + + void setup_pointer_frame_offset (); + +private: + double _grab_qn; + ARDOUR::TempoSection* _tempo; + XMLNode* _before_state; }; /** Drag of the playhead cursor */ @@ -839,7 +904,7 @@ public: private: void fake_locate (framepos_t); - EditorCursor& _cursor; + EditorCursor& _cursor; bool _stop; ///< true to stop the transport on starting the drag, otherwise false double _grab_zoom; ///< editor frames per unit when our grab started }; @@ -884,7 +949,7 @@ public: class MarkerDrag : public Drag { public: - MarkerDrag (Editor *, ArdourCanvas::Item *); + MarkerDrag (Editor *, ArdourCanvas::Item *); ~MarkerDrag (); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); @@ -907,16 +972,16 @@ private: ArdourMarker* _marker; ///< marker being dragged bool _selection_changed; - struct CopiedLocationMarkerInfo { - ARDOUR::Location* location; - std::vector markers; - bool move_both; - CopiedLocationMarkerInfo (ARDOUR::Location* l, ArdourMarker* m); + struct CopiedLocationMarkerInfo { + ARDOUR::Location* location; + std::vector markers; + bool move_both; + CopiedLocationMarkerInfo (ARDOUR::Location* l, ArdourMarker* m); }; - typedef std::list CopiedLocationInfo; - CopiedLocationInfo _copied_locations; - ArdourCanvas::Points _points; + typedef std::list CopiedLocationInfo; + CopiedLocationInfo _copied_locations; + ArdourCanvas::Points _points; }; /** Control point drag */ @@ -939,7 +1004,7 @@ private: double _fixed_grab_y; double _cumulative_x_drag; double _cumulative_y_drag; - bool _pushing; + bool _pushing; uint32_t _final_index; static double _zero_gain_fraction; }; @@ -1105,10 +1170,10 @@ public: private: Operation _operation; bool _add; - std::list _added_time_axes; + TrackSelection _track_selection_at_start; bool _time_selection_at_start; - framepos_t start_at_start; - framepos_t end_at_start; + framepos_t start_at_start; + framepos_t end_at_start; }; /** Range marker drag */ @@ -1196,7 +1261,7 @@ private: std::list points; ///< points to drag on the line std::pair range; ///< the range of all points on the line, in session frames XMLNode* state; ///< the XML state node before the drag - double original_fraction; ///< initial y-fraction before the drag + double original_fraction; ///< initial y-fraction before the drag }; std::list _lines; @@ -1209,7 +1274,7 @@ private: */ class CrossfadeEdgeDrag : public Drag { - public: +public: CrossfadeEdgeDrag (Editor*, AudioRegionView*, ArdourCanvas::Item*, bool start); void start_grab (GdkEvent*, Gdk::Cursor* c = 0); @@ -1225,7 +1290,7 @@ class CrossfadeEdgeDrag : public Drag return std::make_pair (4, 4); } - private: +private: AudioRegionView* arv; bool start; };