X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Feditor_drag.h;h=259dc50778c697a040e6ea8b2c8bdd2b87f4b4f1;hb=ea3918ba2d72984334e97e1d2af5d1717d23b2ea;hp=61273559654cd80e333081f9103be0855e4d1b46;hpb=e89bdcd9ebb774294119cf349b3faaf0fa9ffd1f;p=ardour.git diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h index 6127355965..259dc50778 100644 --- a/gtk2_ardour/editor_drag.h +++ b/gtk2_ardour/editor_drag.h @@ -27,7 +27,6 @@ #include "ardour/types.h" -#include "canvas.h" #include "editor_items.h" namespace ARDOUR { @@ -38,18 +37,13 @@ namespace PBD { class StatefulDiffCommand; } -namespace Gnome { - namespace Canvas { - class CanvasNoteEvent; - class CanvasPatchChange; - } -} - +class PatchChange; class Editor; class EditorCursor; class TimeAxisView; class MidiTimeAxisView; class Drag; +class NoteBase; /** Class to manage current drags */ class DragManager @@ -60,6 +54,7 @@ public: ~DragManager (); bool motion_handler (GdkEvent *, bool); + bool window_motion_handler (GdkEvent *, bool); void abort (); void add (Drag *); @@ -68,6 +63,8 @@ public: bool end_grab (GdkEvent *); bool have_item (ArdourCanvas::Item *) const; + void mark_double_click (); + /** @return true if an end drag or abort is in progress */ bool ending () const { return _ending; @@ -77,12 +74,12 @@ public: return !_drags.empty (); } - /** @return current pointer x position in trackview coordinates */ + /** @return current pointer x position in canvas coordinates */ double current_pointer_x () const { return _current_pointer_x; } - /** @return current pointer y position in trackview coordinates */ + /** @return current pointer y position in canvas coordinates */ double current_pointer_y () const { return _current_pointer_y; } @@ -96,8 +93,8 @@ private: Editor* _editor; std::list _drags; bool _ending; ///< true if end_grab or abort is in progress, otherwise false - double _current_pointer_x; ///< trackview x of the current pointer - double _current_pointer_y; ///< trackview y of the current pointer + double _current_pointer_x; ///< canvas-coordinate space x of the current pointer + double _current_pointer_y; ///< canvas-coordinate space y of the current pointer ARDOUR::framepos_t _current_pointer_frame; ///< frame that the pointer is now at bool _old_follow_playhead; ///< state of Editor::follow_playhead() before the drags started }; @@ -106,7 +103,7 @@ private: class Drag { public: - Drag (Editor *, ArdourCanvas::Item *); + Drag (Editor *, ArdourCanvas::Item *); virtual ~Drag () {} void set_manager (DragManager* m) { @@ -125,6 +122,9 @@ public: ARDOUR::framepos_t 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; } + /** Called to start a grab of an item. * @param e Event that caused the grab to start. * @param c Cursor to use, or 0. @@ -230,6 +230,7 @@ protected: private: 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 _last_pointer_x; ///< trackview x of the pointer last time a motion occurred @@ -260,6 +261,7 @@ 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; }; @@ -377,6 +379,7 @@ private: void add_stateful_diff_commands_for_playlists (PlaylistSet const &); void collect_new_region_view (RegionView *); + RouteTimeAxisView* create_destination_time_axis (boost::shared_ptr); bool _copy; RegionView* _new_region_view; @@ -456,7 +459,7 @@ class NoteDrag : public Drag int8_t total_dy () const; MidiRegionView* _region; - Gnome::Canvas::CanvasNoteEvent* _primary; + NoteBase* _primary; double _cumulative_dx; double _cumulative_dy; bool _was_selected; @@ -479,7 +482,7 @@ private: framecnt_t grid_frames (framepos_t) const; MidiRegionView* _region_view; - ArdourCanvas::SimpleRect* _drag_rect; + ArdourCanvas::Rectangle* _drag_rect; framepos_t _note[2]; }; @@ -487,7 +490,7 @@ private: class PatchChangeDrag : public Drag { public: - PatchChangeDrag (Editor *, ArdourCanvas::CanvasPatchChange *, MidiRegionView *); + PatchChangeDrag (Editor *, PatchChange *, MidiRegionView *); void motion (GdkEvent *, bool); void finished (GdkEvent *, bool); @@ -501,10 +504,48 @@ public: private: MidiRegionView* _region_view; - ArdourCanvas::CanvasPatchChange* _patch_change; + PatchChange* _patch_change; double _cumulative_dx; }; +/** Container for details about audio regions being dragged along with video */ +class AVDraggingView +{ +public: + AVDraggingView (RegionView *); + + RegionView* view; ///< the view + framepos_t initial_position; ///< initial position of the region +}; + +/** Drag of video offset */ +class VideoTimeLineDrag : public Drag +{ +public: + VideoTimeLineDrag (Editor *e, ArdourCanvas::Item *i); + + void motion (GdkEvent *, bool); + void finished (GdkEvent *, bool); + void start_grab (GdkEvent *, Gdk::Cursor* c = 0); + + bool y_movement_matters () const { + return false; + } + + bool allow_vertical_autoscroll () const { + return false; + } + + void aborted (bool); + +protected: + std::list _views; ///< information about all audio that are being dragged along + +private: + ARDOUR::frameoffset_t _startdrag_video_offset; + ARDOUR::frameoffset_t _max_backwards_drag; +}; + /** Drag to trim region(s) */ class TrimDrag : public RegionDrag { @@ -515,7 +556,7 @@ public: ContentsTrim, }; - TrimDrag (Editor *, ArdourCanvas::Item *, RegionView*, std::list const &); + TrimDrag (Editor *, ArdourCanvas::Item *, RegionView*, std::list const &, bool preserve_fade_anchor = false); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); @@ -531,6 +572,9 @@ public: private: Operation _operation; + + bool _preserve_fade_anchor; + bool _jump_position_when_done; }; /** Meter marker drag */ @@ -592,7 +636,7 @@ private: class CursorDrag : public Drag { public: - CursorDrag (Editor *, ArdourCanvas::Item *, bool); + CursorDrag (Editor *, EditorCursor&, bool); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); void motion (GdkEvent *, bool); @@ -614,6 +658,7 @@ public: private: void fake_locate (framepos_t); + 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 }; @@ -658,7 +703,7 @@ public: class MarkerDrag : public Drag { public: - MarkerDrag (Editor *, ArdourCanvas::Item *); + MarkerDrag (Editor *, ArdourCanvas::Item *); ~MarkerDrag (); void start_grab (GdkEvent *, Gdk::Cursor* c = 0); @@ -680,7 +725,16 @@ private: void update_item (ARDOUR::Location *); Marker* _marker; ///< marker being dragged - std::list _copied_locations; + + struct CopiedLocationMarkerInfo { + ARDOUR::Location* location; + std::vector markers; + bool move_both; + CopiedLocationMarkerInfo (ARDOUR::Location* l, Marker* m); + }; + + typedef std::list CopiedLocationInfo; + CopiedLocationInfo _copied_locations; ArdourCanvas::Points _points; }; @@ -704,6 +758,8 @@ private: double _fixed_grab_y; double _cumulative_x_drag; double _cumulative_y_drag; + bool _pushing; + uint32_t _final_index; static double _zero_gain_fraction; }; @@ -860,7 +916,8 @@ public: CreateSelection, SelectionStartTrim, SelectionEndTrim, - SelectionMove + SelectionMove, + SelectionExtend }; SelectionDrag (Editor *, ArdourCanvas::Item *, Operation); @@ -874,11 +931,14 @@ public: private: Operation _operation; - bool _copy; + 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; + framepos_t end_at_start; }; /** Range marker drag */ @@ -910,7 +970,7 @@ private: void update_item (ARDOUR::Location *); Operation _operation; - ArdourCanvas::SimpleRect* _drag_rect; + ArdourCanvas::Rectangle* _drag_rect; bool _copy; }; @@ -957,7 +1017,8 @@ public: private: void setup (std::list > const &); - + double y_fraction (boost::shared_ptr, double global_y_position) const; + std::list _ranges; /** A line that is part of the drag */ @@ -970,7 +1031,7 @@ private: }; std::list _lines; - TimeAxisView* track_view; + double y_origin; bool _nothing_to_drag; };