#include "editor_items.h"
#include "mouse_cursors.h"
#include "editing.h"
+#include "track_selection.h"
namespace ARDOUR {
class Location;
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; }
}
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);
/* 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 (
void finished (GdkEvent *, bool);
void aborted (bool);
+ 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
}
MidiRegionView* _region_view;
+ framepos_t _last_pos;
+ double _y;
+
};
/** Drag to move MIDI patch changes */
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;
+};
+
+/** 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 */
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;