summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohannes Mueller <github@johannes-mueller.org>2020-04-14 21:41:57 +0200
committerJohannes Mueller <github@johannes-mueller.org>2020-04-14 22:43:15 +0200
commitd2f5edf64fdffb8e66139579e62b2237ca4a09cc (patch)
tree1d87489d7377e8e2668aa987af4aab8ef7235858
parent07709b39c118381b5495dc2550af2103002fe3bf (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.
-rw-r--r--gtk2_ardour/editor_drag.cc23
-rw-r--r--gtk2_ardour/editor_drag.h3
2 files changed, 25 insertions, 1 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);
diff --git a/gtk2_ardour/editor_drag.h b/gtk2_ardour/editor_drag.h
index f4a76cb599..6c3e99d057 100644
--- a/gtk2_ardour/editor_drag.h
+++ b/gtk2_ardour/editor_drag.h
@@ -44,6 +44,7 @@
namespace ARDOUR {
class Location;
+ class Region;
class TempoSection;
}
@@ -520,6 +521,7 @@ private:
void add_all_after_to_views (TimeAxisView *tav, ARDOUR::samplepos_t where, const RegionSelection &exclude, bool drag_in_progress);
void remove_unselected_from_views (ARDOUR::samplecnt_t amount, bool move_regions);
+ std::list<boost::shared_ptr<ARDOUR::Region> > _orig_tav_ripples;
};
/** "Drag" to cut a region (action only on button release) */
@@ -1328,4 +1330,3 @@ private:
};
#endif /* __gtk2_ardour_editor_drag_h_ */
-