diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 9bdd2e26a8..96ae169aed 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -3706,7 +3706,16 @@ Editor::remove_clicked_region () begin_reversible_command (_("remove region")); playlist->clear_changes (); + playlist->clear_owned_changes (); playlist->remove_region (clicked_regionview->region()); + + /* We might have removed regions, which alters other regions' layering_index, + so we need to do a recursive diff here. + */ + vector cmds; + playlist->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command(new StatefulDiffCommand (playlist)); commit_reversible_command (); } @@ -3758,6 +3767,7 @@ Editor::remove_selected_regions () playlists.push_back (playlist); playlist->clear_changes (); + playlist->clear_owned_changes (); playlist->freeze (); playlist->remove_region (*rl); } @@ -3766,6 +3776,14 @@ Editor::remove_selected_regions () for (pl = playlists.begin(); pl != playlists.end(); ++pl) { (*pl)->thaw (); + + /* We might have removed regions, which alters other regions' layering_index, + so we need to do a recursive diff here. + */ + vector cmds; + (*pl)->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command(new StatefulDiffCommand (*pl)); } @@ -3812,6 +3830,7 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) if (fl == freezelist.end()) { pl->clear_changes(); + pl->clear_owned_changes (); pl->freeze (); freezelist.insert (pl); } @@ -3927,6 +3946,14 @@ Editor::cut_copy_regions (CutCopyOp op, RegionSelection& rs) for (FreezeList::iterator pl = freezelist.begin(); pl != freezelist.end(); ++pl) { (*pl)->thaw (); + + /* We might have removed regions, which alters other regions' layering_index, + so we need to do a recursive diff here. + */ + vector cmds; + (*pl)->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command (new StatefulDiffCommand (*pl)); } } @@ -4615,6 +4642,7 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress if (arv->audio_region()->apply (filter, progress) == 0) { playlist->clear_changes (); + playlist->clear_owned_changes (); if (filter.results.empty ()) { @@ -4637,6 +4665,13 @@ Editor::apply_filter (Filter& filter, string command, ProgressReporter* progress } + /* We might have removed regions, which alters other regions' layering_index, + so we need to do a recursive diff here. + */ + vector cmds; + playlist->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command(new StatefulDiffCommand (playlist)); } else { goto out; @@ -5716,6 +5751,7 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList AnalysisFeatureList::const_iterator x; pl->clear_changes (); + pl->clear_owned_changes (); x = positions.begin(); @@ -5802,6 +5838,13 @@ Editor::split_region_at_points (boost::shared_ptr r, AnalysisFeatureList pl->thaw (); + /* We might have removed regions, which alters other regions' layering_index, + so we need to do a recursive diff here. + */ + vector cmds; + pl->rdiff (cmds); + _session->add_commands (cmds); + _session->add_command (new StatefulDiffCommand (pl)); if (select_new) { diff --git a/libs/ardour/ardour/playlist.h b/libs/ardour/ardour/playlist.h index 67cc1ccf54..626df720bd 100644 --- a/libs/ardour/ardour/playlist.h +++ b/libs/ardour/ardour/playlist.h @@ -378,6 +378,10 @@ public: with its constituent regions */ virtual void pre_uncombine (std::vector >&, boost::shared_ptr) {} + +private: + + void setup_layering_indices (RegionList const &) const; }; } /* namespace ARDOUR */ diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index d3a461ea9e..c11e55779c 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -653,6 +653,7 @@ Playlist::flush_notifications (bool from_undo) PLAYLIST OPERATIONS *************************************************************/ +/** Note: this calls set_layer (..., DBL_MAX) so it will reset the layering index of region */ void Playlist::add_region (boost::shared_ptr region, framepos_t position, float times, bool auto_partition) { @@ -2097,7 +2098,7 @@ Playlist::flush_notifications (bool from_undo) freeze (); /* add the added regions */ for (RegionListProperty::ChangeContainer::iterator i = change.added.begin(); i != change.added.end(); ++i) { - add_region ((*i), (*i)->position()); + add_region_internal ((*i), (*i)->position()); } /* remove the removed regions */ for (RegionListProperty::ChangeContainer::iterator i = change.removed.begin(); i != change.removed.end(); ++i) { @@ -2371,13 +2372,19 @@ Playlist::set_layer (boost::shared_ptr region, double new_layer) copy.insert (i, region); - /* Then re-write layering indices */ + setup_layering_indices (copy); +} + +void +Playlist::setup_layering_indices (RegionList const & regions) const +{ uint64_t j = 0; - for (RegionList::iterator k = copy.begin(); k != copy.end(); ++k) { + for (RegionList::const_iterator k = regions.begin(); k != regions.end(); ++k) { (*k)->set_layering_index (j++); } } + /** Take the layering indices of each of our regions, compute the layers * that they should be on, and write the layers back to the regions. */ @@ -2493,6 +2500,12 @@ Playlist::relayer () if (changed) { notify_layering_changed (); } + + /* This relayer() may have been called as a result of a region removal, in which + case we need to setup layering indices so account for the one that has just + gone away. + */ + setup_layering_indices (copy); } void