diff options
author | Johannes Mueller <github@johannes-mueller.org> | 2020-04-14 21:41:57 +0200 |
---|---|---|
committer | Johannes Mueller <github@johannes-mueller.org> | 2020-04-14 22:43:15 +0200 |
commit | d2f5edf64fdffb8e66139579e62b2237ca4a09cc (patch) | |
tree | 1d87489d7377e8e2668aa987af4aab8ef7235858 /gtk2_ardour/editor_drag.cc | |
parent | 07709b39c118381b5495dc2550af2103002fe3bf (diff) |
Fix #8012 to some extent.
As soon as we ripple drag the selected region out of the original track,
::remove_unselected_from_views() is called and the rippled regions on the
original track are not covered when ::remove_selected_from_views() is called
again in ::finished(). Therefore we need to shift the regions remaining on the
original track back and forth again, in order to have them properly in the undo
history.
Diffstat (limited to 'gtk2_ardour/editor_drag.cc')
-rw-r--r-- | gtk2_ardour/editor_drag.cc | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index 32fd9a1935..84dfe38cc3 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -2314,6 +2314,9 @@ RegionRippleDrag::RegionRippleDrag (Editor* e, ArdourCanvas::Item* i, RegionView if (allow_moves_across_tracks) { orig_tav = &(*selected_regions.begin())->get_time_axis_view(); + for (std::list<DraggingView>::const_iterator it = _views.begin(); it != _views.end(); ++it) { + _orig_tav_ripples.push_back((*it).view->region()); + } } else { orig_tav = NULL; } @@ -2423,6 +2426,26 @@ RegionRippleDrag::finished (GdkEvent* event, bool movement_occurred) orig_tav->playlist()->clear_changes(); orig_tav->playlist()->clear_owned_changes(); remove_unselected_from_views (prev_amount, true); + + std::list<boost::shared_ptr<Region> >::const_iterator it = _orig_tav_ripples.begin(); + for (; it != _orig_tav_ripples.end(); ++it) { + const boost::shared_ptr<Region> r = *it; + bool found = false; + for (std::list<DraggingView>::const_iterator it = _views.begin(); it != _views.end(); ++it) { + if (it->view->region() == r) { + found = true; + break; + } + } + if (!found) { + const samplecnt_t pos_after = r->position(); + const samplecnt_t pos_before = pos_after + selection_length; + r->set_position(pos_before); + r->clear_changes(); + r->set_position(pos_after); + } + } + vector<Command*> cmds; orig_tav->playlist()->rdiff (cmds); _editor->session()->add_commands (cmds); |