#include "editor_items.h"
#include "mouse_cursors.h"
#include "editing.h"
+#include "track_selection.h"
namespace ARDOUR {
class Location;
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 {
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) {
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.
}
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<ARDOUR::Region> add_midi_region (MidiTimeAxisView*, bool commit, const int32_t sub_num);
+ boost::shared_ptr<ARDOUR::Region> 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);
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
/* 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()
};
std::vector<TimeAxisView*> _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;
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;
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
);
boost::shared_ptr<ARDOUR::Region>,
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 (
/** "Drag" to cut a region (action only on button release) */
class RegionCutDrag : public Drag
{
- public:
+public:
RegionCutDrag (Editor*, ArdourCanvas::Item*, framepos_t);
~RegionCutDrag ();
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
void motion (GdkEvent*, bool);
void finished (GdkEvent*, bool);
void aborted (bool);
- private:
+private:
EditorCursor* line;
};
/** Drags to move MIDI notes */
class NoteDrag : public Drag
{
- public:
+public:
NoteDrag (Editor*, ArdourCanvas::Item*);
void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
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
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<ARDOUR::framecnt_t, int> move_threshold () const {
+ return std::make_pair (0, 0);
+ }
+
+ MidiRegionView* _region_view;
+ framepos_t _last_pos;
+ double _y;
+
+};
+
/** Drag to move MIDI patch changes */
class PatchChangeDrag : public Drag
{
bool _copy;
bool _movable;
- double _grab_bpm;
- XMLNode* before_state;
+ ARDOUR::Tempo _grab_bpm;
+ double _grab_qn;
+ XMLNode* _before_state;
};
/** BBT Ruler drag */
private:
double _grab_qn;
ARDOUR::TempoSection* _tempo;
- XMLNode* before_state;
+ XMLNode* _before_state;
+ bool _drag_valid;
+};
+
+/** 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;
+ bool _drag_valid;
};
/** Drag of the playhead cursor */
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
+
+ //used for zooming
+ int _last_mx;
+ int _last_my;
+ int _last_dx;
+ int _last_y_delta;
};
/** Region fade-in drag */
class MarkerDrag : public Drag
{
public:
- MarkerDrag (Editor *, ArdourCanvas::Item *);
+ MarkerDrag (Editor *, ArdourCanvas::Item *);
~MarkerDrag ();
void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
ArdourMarker* _marker; ///< marker being dragged
bool _selection_changed;
- struct CopiedLocationMarkerInfo {
- ARDOUR::Location* location;
- std::vector<ArdourMarker*> markers;
- bool move_both;
- CopiedLocationMarkerInfo (ARDOUR::Location* l, ArdourMarker* m);
+ struct CopiedLocationMarkerInfo {
+ ARDOUR::Location* location;
+ std::vector<ArdourMarker*> markers;
+ bool move_both;
+ CopiedLocationMarkerInfo (ARDOUR::Location* l, ArdourMarker* m);
};
- typedef std::list<CopiedLocationMarkerInfo> CopiedLocationInfo;
- CopiedLocationInfo _copied_locations;
- ArdourCanvas::Points _points;
+ typedef std::list<CopiedLocationMarkerInfo> CopiedLocationInfo;
+ CopiedLocationInfo _copied_locations;
+ ArdourCanvas::Points _points;
};
/** Control point drag */
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;
};
private:
Operation _operation;
bool _add;
- std::list<TimeAxisView*> _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 */
std::list<ControlPoint*> points; ///< points to drag on the line
std::pair<ARDOUR::framepos_t, ARDOUR::framepos_t> 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<Line> _lines;
*/
class CrossfadeEdgeDrag : public Drag
{
- public:
+public:
CrossfadeEdgeDrag (Editor*, AudioRegionView*, ArdourCanvas::Item*, bool start);
void start_grab (GdkEvent*, Gdk::Cursor* c = 0);
return std::make_pair (4, 4);
}
- private:
+private:
AudioRegionView* arv;
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_ */