~DragManager ();
bool motion_handler (GdkEvent *, bool);
- bool window_motion_handler (GdkEvent *, bool);
void abort ();
void add (Drag *);
class Drag
{
public:
- Drag (Editor *, ArdourCanvas::Item *);
+ Drag (Editor *, ArdourCanvas::Item *, bool trackview_only = true);
virtual ~Drag () {}
void set_manager (DragManager* m) {
return _last_pointer_frame;
}
+ double current_pointer_y () const;
+
boost::shared_ptr<ARDOUR::Region> add_midi_region (MidiTimeAxisView*);
void show_verbose_cursor_time (framepos_t);
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
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,
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<ARDOUR::Playlist> initial_playlist;
+ TimeAxisView* initial_time_axis_view;
};
/** Abstract base class for drags that involve region(s) */
void collect_new_region_view (RegionView *);
+ RouteTimeAxisView* create_destination_time_axis (boost::shared_ptr<ARDOUR::Region>, TimeAxisView* original);
bool _copy;
RegionView* _new_region_view;
void finished (GdkEvent *, bool);
void aborted (bool);
protected:
- bool y_movement_allowed (int delta_track, double delta_layer) const {
- std::cerr << "RegionRippleDrag::y_movement_allowed (" << delta_track << ", " << delta_layer << ")..." << std::endl;
- if (RegionMotionDrag::y_movement_allowed (delta_track, delta_layer)) {
- if (delta_track) {
- return allow_moves_across_tracks;
- } else {
- return true;
- }
- }
- return false;
- }
+ 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
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);
+ 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 */
{
public:
enum Operation {
+ CreateSkipMarker,
CreateRangeMarker,
CreateTransportMarker,
CreateCDMarker