/*
- Copyright (C) 2009 Paul Davis
+ Copyright (C) 2009 Paul Davis
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
/** Abstract base class for dragging of things within the editor */
class Drag
{
-
+
public:
Drag (Editor *, ArdourCanvas::Item *);
virtual ~Drag () {}
return false;
}
- /** Called when a subclass should update the editor's selection following a drag */
- virtual void update_selection () {}
+ virtual bool allow_vertical_autoscroll () const {
+ return true;
+ }
protected:
nframes64_t adjusted_current_frame (GdkEvent *) const;
-
+
Editor* _editor; ///< our editor
ArdourCanvas::Item* _item; ///< our item
nframes64_t _pointer_frame_offset; ///< offset from the mouse's position for the drag
bool _x_constrained; ///< true if x motion is constrained, otherwise false
bool _y_constrained; ///< true if y motion is constrained, otherwise false
bool _was_rolling; ///< true if the session was rolling before the drag started, otherwise false
+ bool _have_transaction; ///< true if a transaction has been started, false otherwise. Must be set true by derived class.
private:
-
+
bool _ending; ///< true if end_grab is in progress, otherwise false
bool _had_movement; ///< true if movement has occurred, otherwise false
bool _move_threshold_passed; ///< true if the move threshold has been passed, otherwise false
RegionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
virtual ~RegionDrag () {}
- void update_selection ();
-
protected:
-
+
RegionView* _primary; ///< the view that was clicked on (or whatever) to start the drag
std::list<RegionView*> _views; ///< all views that are being dragged
class RegionMotionDrag : public RegionDrag
{
public:
-
+
RegionMotionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &, bool);
virtual ~RegionMotionDrag () {}
protected:
struct TimeAxisViewSummary {
TimeAxisViewSummary () : height_list(512) {}
-
+
std::bitset<512> tracks;
std::vector<int32_t> height_list;
int visible_y_low;
int visible_y_high;
};
-
+
void copy_regions (GdkEvent *);
bool y_movement_disallowed (int, int, int, TimeAxisViewSummary const &) const;
- std::map<RegionView*, RouteTimeAxisView*> find_time_axis_views ();
+ std::map<RegionView*, std::pair<RouteTimeAxisView*, int> > find_time_axis_views_and_layers ();
double compute_x_delta (GdkEvent const *, nframes64_t *);
bool compute_y_delta (
TimeAxisView const *, TimeAxisView*, int32_t, int32_t, TimeAxisViewSummary const &,
);
TimeAxisViewSummary get_time_axis_view_summary ();
- virtual bool x_move_allowed () const = 0;
-
+ bool x_move_allowed () const;
+
TimeAxisView* _dest_trackview;
ARDOUR::layer_t _dest_layer;
bool check_possible (RouteTimeAxisView **, ARDOUR::layer_t *);
virtual void start_grab (GdkEvent *, Gdk::Cursor *);
void motion (GdkEvent *, bool);
void finished (GdkEvent *, bool);
-
+
bool apply_move_threshold () const {
return true;
}
private:
- bool x_move_allowed () const;
-
bool _copy;
};
RegionInsertDrag (Editor *, boost::shared_ptr<ARDOUR::Region>, RouteTimeAxisView*, nframes64_t);
void finished (GdkEvent *, bool);
-
-private:
- bool x_move_allowed () const;
};
/** Region drag in splice mode */
TimeAxisView* _dest_trackview;
};
+/** Drags to resize MIDI notes */
+class NoteResizeDrag : public Drag
+{
+public:
+ NoteResizeDrag (Editor *, ArdourCanvas::Item *);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+
+private:
+ MidiRegionView* region;
+ bool relative;
+ bool at_front;
+};
+
+class NoteDrag : public Drag
+{
+ public:
+ NoteDrag (Editor*, ArdourCanvas::Item*);
+
+ void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
+ void motion (GdkEvent *, bool);
+ void finished (GdkEvent *, bool);
+
+ private:
+ MidiRegionView* region;
+ double last_x;
+ double last_y;
+ double drag_delta_x;
+ double drag_delta_note;
+ bool was_selected;
+};
+
/** Drag of region gain */
class RegionGainDrag : public Drag
{
void motion (GdkEvent *, bool);
void finished (GdkEvent *, bool);
+ bool active (Editing::MouseMode) {
+ return true;
+ }
+
+ bool allow_vertical_autoscroll () const {
+ return false;
+ }
+
private:
EditorCursor* _cursor; ///< cursor being dragged
bool _stop; ///< true to stop the transport on starting the drag, otherwise false
-
+
};
/** Region fade-in drag */
private:
void update_item (ARDOUR::Location *);
-
+
Marker* _marker; ///< marker being dragged
std::list<ARDOUR::Location*> _copied_locations;
ArdourCanvas::Line* _line;
void motion (GdkEvent *, bool);
void finished (GdkEvent *, bool);
- bool active (Editing::MouseMode m) {
- return (m == Editing::MouseGain);
- }
+ bool active (Editing::MouseMode m);
private:
-
+
ControlPoint* _point;
double _cumulative_x_drag;
double _cumulative_y_drag;
void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
void motion (GdkEvent *, bool);
void finished (GdkEvent *, bool);
-
+
bool active (Editing::MouseMode) {
return true;
}
{
public:
ScrubDrag (Editor *e, ArdourCanvas::Item *i) : Drag (e, i) {}
-
+
void start_grab (GdkEvent *, Gdk::Cursor* c = 0);
void motion (GdkEvent *, bool);
void finished (GdkEvent *, bool);