X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_drag.h;h=bc30486b584094774f1d0c4c3a28416b07f958d3;hb=47d186d1a301c8cbc8ed8c3b6cbe0c84bb6b681f;hp=b4d5994a63402da89b7de2f923de6aac87785827;hpb=c315c6f140a7b48d85d352fdc8e2fb21936a3b2d;p=ardour.git diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index b4d5994a63..bc30486b58 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -25,6 +25,7 @@ #include #include +#include "ardour/tempo.h" #include "ardour/types.h" #include "canvas/types.h" @@ -36,6 +37,7 @@ namespace ARDOUR { class Location; + class TempoSection; } namespace ArdourCanvas { @@ -202,7 +204,7 @@ public: bool initially_vertical() const { return _initially_vertical; } - + /** Set up the _pointer_frame_offset */ virtual void setup_pointer_frame_offset () { _pointer_frame_offset = 0; @@ -246,7 +248,7 @@ protected: /* sets snap delta from unsnapped pos */ void setup_snap_delta (framepos_t pos); - boost::shared_ptr add_midi_region (MidiTimeAxisView*); + boost::shared_ptr add_midi_region (MidiTimeAxisView*, bool commit, const int32_t sub_num); void show_verbose_cursor_time (framepos_t); void show_verbose_cursor_duration (framepos_t, framepos_t, double xoffset = 0); @@ -280,6 +282,7 @@ private: */ ARDOUR::frameoffset_t _snap_delta; CursorContext::Handle _cursor_ctx; ///< cursor change context + bool _constraint_pressed; ///< if the keyboard indicated constraint modifier was pressed on start_grab() }; class RegionDrag; @@ -324,6 +327,7 @@ 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; @@ -405,13 +409,15 @@ private: void finished_no_copy ( bool const, bool const, - ARDOUR::framecnt_t const + ARDOUR::framecnt_t const, + int32_t const ev_state ); void finished_copy ( bool const, bool const, - ARDOUR::framecnt_t const + ARDOUR::framecnt_t const, + int32_t const ev_state ); RegionView* insert_region_into_playlist ( @@ -419,7 +425,8 @@ private: RouteTimeAxisView*, ARDOUR::layer_t, ARDOUR::framecnt_t, - PlaylistSet& + PlaylistSet&, + const int32_t sub_num ); void remove_region_from_playlist ( @@ -533,6 +540,7 @@ private: MidiRegionView* region; bool relative; bool at_front; + bool _was_selected; double _snap_delta; }; @@ -556,7 +564,7 @@ class NoteDrag : public Drag NoteBase* _primary; double _cumulative_dx; double _cumulative_dy; - bool _was_selected; + bool _was_selected; double _note_height; }; @@ -582,12 +590,48 @@ public: private: double y_to_region (double) const; ARDOUR::framecnt_t grid_frames (framepos_t) const; - + + /** @return minimum number of frames (in x) and pixels (in y) that should be considered a movement */ + virtual std::pair move_threshold () const { + return std::make_pair (0, 0); + } + MidiRegionView* _region_view; ArdourCanvas::Rectangle* _drag_rect; framepos_t _note[2]; }; +class HitCreateDrag : public Drag +{ +public: + HitCreateDrag (Editor *, ArdourCanvas::Item *, MidiRegionView *); + ~HitCreateDrag (); + + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); + void motion (GdkEvent *, bool); + void finished (GdkEvent *, bool); + void aborted (bool); + + bool active (Editing::MouseMode mode) { + return mode == Editing::MouseDraw || mode == Editing::MouseContent; + } + + bool y_movement_matters () const { + return false; + } + +private: + double y_to_region (double) const; + ARDOUR::framecnt_t grid_frames (framepos_t) const; + + /** @return minimum number of frames (in x) and pixels (in y) that should be considered a movement */ + virtual std::pair move_threshold () const { + return std::make_pair (0, 0); + } + + MidiRegionView* _region_view; +}; + /** Drag to move MIDI patch changes */ class PatchChangeDrag : public Drag { @@ -675,7 +719,7 @@ public: private: Operation _operation; - + bool _preserve_fade_anchor; bool _jump_position_when_done; }; @@ -703,7 +747,11 @@ public: private: MeterMarker* _marker; + ARDOUR::MeterSection* _real_section; + bool _copy; + Editing::SnapType _old_snap_type; + Editing::SnapMode _old_snap_mode; XMLNode* before_state; }; @@ -723,17 +771,47 @@ public: } bool y_movement_matters () const { - return false; + return true; } void setup_pointer_frame_offset (); private: TempoMarker* _marker; + ARDOUR::TempoSection* _real_section; + bool _copy; + bool _movable; + double _grab_bpm; XMLNode* before_state; }; +/** BBT Ruler drag */ +class BBTRulerDrag : public Drag +{ +public: + BBTRulerDrag (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 false; + } + + void setup_pointer_frame_offset (); + +private: + double _grab_qn; + ARDOUR::TempoSection* _tempo; + XMLNode* before_state; +}; /** Drag of the playhead cursor */ class CursorDrag : public Drag @@ -824,7 +902,7 @@ private: void update_item (ARDOUR::Location *); ArdourMarker* _marker; ///< marker being dragged - + bool _selection_changed; struct CopiedLocationMarkerInfo { ARDOUR::Location* location; std::vector markers; @@ -932,7 +1010,7 @@ public: * @param drag_in_progress true if the drag is currently happening. */ virtual void select_things (int button_state, framepos_t x1, framepos_t x2, double y1, double y2, bool drag_in_progress) = 0; - + virtual void deselect_things () = 0; protected: @@ -1042,7 +1120,7 @@ public: RangeMarkerBarDrag (Editor *, ArdourCanvas::Item *, Operation); ~RangeMarkerBarDrag (); - + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); void finished (GdkEvent *, bool); @@ -1134,7 +1212,7 @@ class CrossfadeEdgeDrag : public Drag void motion (GdkEvent*, bool); void finished (GdkEvent*, bool); void aborted (bool); - + bool y_movement_matters () const { return false; } @@ -1148,5 +1226,21 @@ class CrossfadeEdgeDrag : public Drag bool start; }; +class RulerZoomDrag : public Drag +{ +public: + RulerZoomDrag (Editor*, ArdourCanvas::Item*); + + void start_grab (GdkEvent*, Gdk::Cursor* c = 0); + void motion (GdkEvent *, bool); + void finished (GdkEvent*, bool); + void aborted (bool); + + virtual bool allow_vertical_autoscroll () const { + return false; + } + +}; + #endif /* __gtk2_ardour_editor_drag_h_ */