#include "editor_items.h"
#include "mouse_cursors.h"
#include "editing.h"
+#include "track_selection.h"
namespace ARDOUR {
class Location;
+ class TempoSection;
}
namespace ArdourCanvas {
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);
/* 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()
};
class RegionDrag;
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
);
RegionView* insert_region_into_playlist (
boost::shared_ptr<ARDOUR::Region>,
RouteTimeAxisView*,
ARDOUR::layer_t,
- ARDOUR::framecnt_t,
- PlaylistSet&
+ ARDOUR::MusicFrame,
+ double quarter_note,
+ PlaylistSet&,
+ bool for_music = false
);
void remove_region_from_playlist (
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);
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
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;
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<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
{
private:
MeterMarker* _marker;
+ ARDOUR::MeterSection* _real_section;
+
bool _copy;
+ Editing::SnapType _old_snap_type;
+ Editing::SnapMode _old_snap_mode;
XMLNode* before_state;
};
}
bool y_movement_matters () const {
- return false;
+ return true;
}
void setup_pointer_frame_offset ();
ARDOUR::TempoSection* _real_section;
bool _copy;
- XMLNode* before_state;
+ bool _movable;
+ ARDOUR::Tempo _grab_bpm;
+ double _grab_qn;
+ 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;
+};
+
+/** 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 */
class CursorDrag : public Drag
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;
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_ */