Brush Drag: refactor Brush-drag into its own Drag class (operation is still weird though)

This commit is contained in:
Ben Loftis 2021-06-15 16:09:24 -05:00
parent 69af0e6964
commit 45bd2c47d8
4 changed files with 129 additions and 84 deletions

View file

@ -576,6 +576,8 @@ public:
void do_remove_gaps (); void do_remove_gaps ();
void remove_gaps (samplecnt_t threshold, samplecnt_t leave, bool markers_too); void remove_gaps (samplecnt_t threshold, samplecnt_t leave, bool markers_too);
void mouse_brush_insert_region (RegionView*, samplepos_t pos);
void mouse_add_new_tempo_event (samplepos_t where); void mouse_add_new_tempo_event (samplepos_t where);
void mouse_add_new_meter_event (samplepos_t where); void mouse_add_new_meter_event (samplepos_t where);
void edit_tempo_section (ARDOUR::TempoSection*); void edit_tempo_section (ARDOUR::TempoSection*);
@ -1608,8 +1610,6 @@ private:
bool can_remove_control_point (ArdourCanvas::Item*); bool can_remove_control_point (ArdourCanvas::Item*);
void remove_control_point (ArdourCanvas::Item*); void remove_control_point (ArdourCanvas::Item*);
void mouse_brush_insert_region (RegionView*, samplepos_t pos);
/* Canvas event handlers */ /* Canvas event handlers */
bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas); bool canvas_scroll_event (GdkEventScroll* event, bool from_canvas);

View file

@ -675,6 +675,20 @@ RegionDrag::setup_video_sample_offset ()
_preview_video = true; _preview_video = true;
} }
void
RegionDrag::add_stateful_diff_commands_for_playlists (PlaylistSet const & playlists)
{
for (PlaylistSet::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
StatefulDiffCommand* c = new StatefulDiffCommand (*i);
if (!c->empty()) {
_editor->session()->add_command (c);
} else {
delete c;
}
}
}
RegionSlipContentsDrag::RegionSlipContentsDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v) RegionSlipContentsDrag::RegionSlipContentsDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
: RegionDrag (e, i, p, v) : RegionDrag (e, i, p, v)
{ {
@ -731,9 +745,61 @@ RegionSlipContentsDrag::aborted (bool movement_occurred)
} }
RegionMotionDrag::RegionMotionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool b) RegionBrushDrag::RegionBrushDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
: RegionDrag (e, i, p, v)
{
DEBUG_TRACE (DEBUG::Drags, "New RegionBrushDrag\n");
_y_constrained = true;
}
void
RegionBrushDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
{
Drag::start_grab (event, _editor->cursors()->trimmer);
}
void
RegionBrushDrag::motion (GdkEvent* event, bool first_move)
{
if (first_move) {
_editor->begin_reversible_command (_("Region brush drag"));
_already_pasted.insert(_primary->region()->position());
} else {
MusicSample snapped (0, 0);
snapped.sample = adjusted_current_sample(event, false);
_editor->snap_to (snapped, RoundDownAlways, SnapToGrid_Scaled, false);
if(_already_pasted.find(snapped.sample) == _already_pasted.end()) {
_editor->mouse_brush_insert_region (_primary, snapped.sample);
_already_pasted.insert(snapped.sample);
}
}
}
void
RegionBrushDrag::finished (GdkEvent *, bool movement_occurred)
{
if (!movement_occurred) {
return;
}
PlaylistSet modified_playlists;
modified_playlists.insert(_primary->region()->playlist());
add_stateful_diff_commands_for_playlists(modified_playlists);
_editor->commit_reversible_command ();
_already_pasted.clear();
}
void
RegionBrushDrag::aborted (bool movement_occurred)
{
_already_pasted.clear();
/* ToDo: revert to the original playlist properties */
_editor->abort_reversible_command ();
}
RegionMotionDrag::RegionMotionDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
: RegionDrag (e, i, p, v) : RegionDrag (e, i, p, v)
, _brushing (b)
, _ignore_video_lock (false) , _ignore_video_lock (false)
, _last_position (0, 0) , _last_position (0, 0)
, _total_x_delta (0) , _total_x_delta (0)
@ -765,11 +831,6 @@ RegionMotionDrag::start_grab (GdkEvent* event, Gdk::Cursor* cursor)
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::TertiaryModifier))) { if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::TertiaryModifier))) {
_ignore_video_lock = true; _ignore_video_lock = true;
} }
if (_brushing) {
/* cross track dragging seems broken here. disabled for now. */
_y_constrained = true;
}
} }
double double
@ -1277,9 +1338,6 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
i->time_axis_view = track_index; i->time_axis_view = track_index;
i->layer += this_delta_layer; i->layer += this_delta_layer;
if (_brushing) {
_editor->mouse_brush_insert_region (rv, pending_region_position.sample);
} else {
Duple track_origin; Duple track_origin;
/* Get the y coordinate of the top of the track that this region is now over */ /* Get the y coordinate of the top of the track that this region is now over */
@ -1306,8 +1364,6 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
y_delta = track_origin.y - rv->get_canvas_group()->canvas_origin().y; y_delta = track_origin.y - rv->get_canvas_group()->canvas_origin().y;
}
MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv); MidiRegionView* mrv = dynamic_cast<MidiRegionView*>(rv);
if (mrv) { if (mrv) {
MidiStreamView* msv; MidiStreamView* msv;
@ -1327,12 +1383,11 @@ RegionMotionDrag::motion (GdkEvent* event, bool first_move)
} else { } else {
rv->move (x_delta, y_delta); rv->move (x_delta, y_delta);
} }
} /* foreach region */ } /* foreach region */
_total_x_delta += x_delta; _total_x_delta += x_delta;
if (x_delta != 0 && !_brushing) { if (x_delta != 0) {
show_verbose_cursor_time (_last_position.sample); show_verbose_cursor_time (_last_position.sample);
show_view_preview (_last_position.sample + _video_sample_offset); show_view_preview (_last_position.sample + _video_sample_offset);
} }
@ -1404,12 +1459,10 @@ void
RegionMoveDrag::motion (GdkEvent* event, bool first_move) RegionMoveDrag::motion (GdkEvent* event, bool first_move)
{ {
if (_copy && first_move) { if (_copy && first_move) {
if (_x_constrained && !_brushing) { if (_x_constrained) {
_editor->begin_reversible_command (Operations::fixed_time_region_copy); _editor->begin_reversible_command (Operations::fixed_time_region_copy);
} else if (!_brushing) { } else {
_editor->begin_reversible_command (Operations::region_copy); _editor->begin_reversible_command (Operations::region_copy);
} else if (_brushing) {
_editor->begin_reversible_command (Operations::drag_region_brush);
} }
/* duplicate the regionview(s) and region(s) */ /* duplicate the regionview(s) and region(s) */
@ -1470,12 +1523,10 @@ RegionMoveDrag::motion (GdkEvent* event, bool first_move)
} }
} else if (!_copy && first_move) { } else if (!_copy && first_move) {
if (_x_constrained && !_brushing) { if (_x_constrained) {
_editor->begin_reversible_command (_("fixed time region drag")); _editor->begin_reversible_command (_("fixed time region drag"));
} else if (!_brushing) { } else {
_editor->begin_reversible_command (Operations::region_drag); _editor->begin_reversible_command (Operations::region_drag);
} else if (_brushing) {
_editor->begin_reversible_command (Operations::drag_region_brush);
} }
} }
RegionMotionDrag::motion (event, first_move); RegionMotionDrag::motion (event, first_move);
@ -1627,13 +1678,6 @@ RegionMoveDrag::finished_copy (bool const changed_position, bool const changed_t
const double last_pos_qn = tmap.exact_qn_at_sample (last_position.sample, last_position.division); const double last_pos_qn = tmap.exact_qn_at_sample (last_position.sample, last_position.division);
const double qn_delta = _primary->region()->quarter_note() - last_pos_qn; const double qn_delta = _primary->region()->quarter_note() - last_pos_qn;
if (_brushing) {
/* all changes were made during motion event handlers */
clear_draggingview_list();
_editor->commit_reversible_command ();
return;
}
/*x_contrained on the same track: this will just make a duplicate region in the same place: abort the operation */ /*x_contrained on the same track: this will just make a duplicate region in the same place: abort the operation */
if (_x_constrained && !changed_tracks) { if (_x_constrained && !changed_tracks) {
clear_draggingview_list(); clear_draggingview_list();
@ -1947,7 +1991,6 @@ RegionMoveDrag::finished_no_copy (
/* write commands for the accumulated diffs for all our modified playlists */ /* write commands for the accumulated diffs for all our modified playlists */
add_stateful_diff_commands_for_playlists (modified_playlists); add_stateful_diff_commands_for_playlists (modified_playlists);
/* applies to _brushing */
_editor->commit_reversible_command (); _editor->commit_reversible_command ();
/* We have futzed with the layering of canvas items on our streamviews. /* We have futzed with the layering of canvas items on our streamviews.
@ -2043,20 +2086,6 @@ RegionMoveDrag::collect_new_region_view (RegionView* rv)
_new_region_view = rv; _new_region_view = rv;
} }
void
RegionMoveDrag::add_stateful_diff_commands_for_playlists (PlaylistSet const & playlists)
{
for (PlaylistSet::const_iterator i = playlists.begin(); i != playlists.end(); ++i) {
StatefulDiffCommand* c = new StatefulDiffCommand (*i);
if (!c->empty()) {
_editor->session()->add_command (c);
} else {
delete c;
}
}
}
void void
RegionMoveDrag::aborted (bool movement_occurred) RegionMoveDrag::aborted (bool movement_occurred)
{ {
@ -2097,8 +2126,8 @@ RegionMotionDrag::aborted (bool)
/** @param b true to brush, otherwise false. /** @param b true to brush, otherwise false.
* @param c true to make copies of the regions being moved, otherwise false. * @param c true to make copies of the regions being moved, otherwise false.
*/ */
RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool b, bool c) RegionMoveDrag::RegionMoveDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v, bool c)
: RegionMotionDrag (e, i, p, v, b) : RegionMotionDrag (e, i, p, v)
, _copy (c) , _copy (c)
, _new_region_view (0) , _new_region_view (0)
{ {
@ -2114,7 +2143,7 @@ RegionMoveDrag::setup_pointer_sample_offset ()
} }
RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, RouteTimeAxisView* v, samplepos_t pos) RegionInsertDrag::RegionInsertDrag (Editor* e, boost::shared_ptr<Region> r, RouteTimeAxisView* v, samplepos_t pos)
: RegionMotionDrag (e, 0, 0, list<RegionView*> (), false) : RegionMotionDrag (e, 0, 0, list<RegionView*> ())
{ {
DEBUG_TRACE (DEBUG::Drags, "New RegionInsertDrag\n"); DEBUG_TRACE (DEBUG::Drags, "New RegionInsertDrag\n");
@ -2178,7 +2207,7 @@ RegionInsertDrag::aborted (bool)
} }
RegionSpliceDrag::RegionSpliceDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v) RegionSpliceDrag::RegionSpliceDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
: RegionMoveDrag (e, i, p, v, false, false) : RegionMoveDrag (e, i, p, v, false)
{ {
DEBUG_TRACE (DEBUG::Drags, "New RegionSpliceDrag\n"); DEBUG_TRACE (DEBUG::Drags, "New RegionSpliceDrag\n");
} }
@ -2367,7 +2396,7 @@ RegionRippleDrag::y_movement_allowed (int delta_track, double delta_layer, int s
} }
RegionRippleDrag::RegionRippleDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v) RegionRippleDrag::RegionRippleDrag (Editor* e, ArdourCanvas::Item* i, RegionView* p, list<RegionView*> const & v)
: RegionMoveDrag (e, i, p, v, false, false) : RegionMoveDrag (e, i, p, v, false)
{ {
DEBUG_TRACE (DEBUG::Drags, "New RegionRippleDrag\n"); DEBUG_TRACE (DEBUG::Drags, "New RegionRippleDrag\n");
// compute length of selection // compute length of selection

View file

@ -365,6 +365,10 @@ protected:
friend class DraggingView; friend class DraggingView;
protected:
typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
void add_stateful_diff_commands_for_playlists (PlaylistSet const &);
private: private:
void region_going_away (RegionView *); void region_going_away (RegionView *);
@ -385,12 +389,28 @@ public:
virtual void aborted (bool); virtual void aborted (bool);
}; };
/** Brush on a region to repeat it */
class RegionBrushDrag : public RegionDrag
{
public:
RegionBrushDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
virtual ~RegionBrushDrag () {}
virtual void start_grab (GdkEvent *, Gdk::Cursor *);
virtual void motion (GdkEvent *, bool);
virtual void finished (GdkEvent *, bool);
virtual void aborted (bool);
private:
typedef std::set<samplepos_t> SamplePositionSet;
SamplePositionSet _already_pasted;
};
/** Drags involving region motion from somewhere */ /** Drags involving region motion from somewhere */
class RegionMotionDrag : public RegionDrag class RegionMotionDrag : public RegionDrag
{ {
public: public:
RegionMotionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &, bool); RegionMotionDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &);
virtual ~RegionMotionDrag () {} virtual ~RegionMotionDrag () {}
virtual void start_grab (GdkEvent *, Gdk::Cursor *); virtual void start_grab (GdkEvent *, Gdk::Cursor *);
@ -408,7 +428,6 @@ protected:
double compute_x_delta (GdkEvent const *, ARDOUR::MusicSample *); double compute_x_delta (GdkEvent const *, ARDOUR::MusicSample *);
virtual bool y_movement_allowed (int, double, int skip_invisible = 0) const; virtual bool y_movement_allowed (int, double, int skip_invisible = 0) const;
bool _brushing;
bool _ignore_video_lock; bool _ignore_video_lock;
ARDOUR::MusicSample _last_position; ///< last position of the thing being dragged ARDOUR::MusicSample _last_position; ///< last position of the thing being dragged
double _total_x_delta; double _total_x_delta;
@ -427,7 +446,7 @@ private:
class RegionMoveDrag : public RegionMotionDrag class RegionMoveDrag : public RegionMotionDrag
{ {
public: public:
RegionMoveDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &, bool, bool); RegionMoveDrag (Editor *, ArdourCanvas::Item *, RegionView *, std::list<RegionView*> const &, bool);
virtual ~RegionMoveDrag () {} virtual ~RegionMoveDrag () {}
void motion (GdkEvent *, bool); void motion (GdkEvent *, bool);
@ -450,10 +469,6 @@ public:
void setup_pointer_sample_offset (); void setup_pointer_sample_offset ();
protected:
typedef std::set<boost::shared_ptr<ARDOUR::Playlist> > PlaylistSet;
void add_stateful_diff_commands_for_playlists (PlaylistSet const &);
private: private:
void finished_no_copy ( void finished_no_copy (
bool const, bool const,

View file

@ -2586,7 +2586,7 @@ Editor::add_region_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* region
_drags->add (new RegionRippleDrag (this, item, region_view, selection->regions.by_layer())); _drags->add (new RegionRippleDrag (this, item, region_view, selection->regions.by_layer()));
break; break;
default: default:
_drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, false)); _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false));
break; break;
} }
@ -2601,7 +2601,7 @@ Editor::add_region_copy_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView* r
return; return;
} }
_drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), false, true)); _drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true));
} }
void void
@ -2617,7 +2617,8 @@ Editor::add_region_brush_drag (ArdourCanvas::Item* item, GdkEvent*, RegionView*
return; return;
} }
_drags->add (new RegionMoveDrag (this, item, region_view, selection->regions.by_layer(), true, false)); std::list<RegionView*> empty;
_drags->add (new RegionBrushDrag (this, item, region_view, empty));
} }
/** Start a grab where a time range is selected, track(s) are selected, and the /** Start a grab where a time range is selected, track(s) are selected, and the
@ -2681,7 +2682,7 @@ Editor::start_selection_grab (ArdourCanvas::Item* /*item*/, GdkEvent* event)
commit_reversible_command (); commit_reversible_command ();
_drags->set (new RegionMoveDrag (this, latest_regionviews.front()->get_canvas_group(), latest_regionviews.front(), latest_regionviews, false, false), event); _drags->set (new RegionMoveDrag (this, latest_regionviews.front()->get_canvas_group(), latest_regionviews.front(), latest_regionviews, false), event);
} }
void void