diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index 8ced386c0d..6c04faad69 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -4937,11 +4937,10 @@ Editor::remove_clicked_region () playlist->remove_region (region); if (should_ripple()) { - do_ripple (playlist, region->position(), - region->length(), std::shared_ptr(), true); - } else { - playlist->rdiff_and_add_command (_session); + do_ripple (playlist, region->position(), - region->length(), std::shared_ptr(), false); } + playlist->rdiff_and_add_command (_session); commit_reversible_command (); } @@ -5009,6 +5008,13 @@ Editor::remove_regions (const RegionSelection& sel, bool can_ripple, bool as_par vector > playlists; + if (!as_part_of_other_command) { + /* we need to start the undo coammd here, since + * other playlists maybe modified as result of a ripple + */ + begin_reversible_command (_("remove regions")); + } + for (list >::iterator rl = regions_to_remove.begin(); rl != regions_to_remove.end(); ++rl) { std::shared_ptr playlist = (*rl)->playlist(); @@ -5018,16 +5024,14 @@ Editor::remove_regions (const RegionSelection& sel, bool can_ripple, bool as_par continue; } - /* get_regions_from_selection_and_entered() guarantees that - the playlists involved are unique, so there is no need - to check here. - */ + if (std::find (playlists.begin(), playlists.end(), playlist) == playlists.end()) { + playlists.push_back (playlist); - playlists.push_back (playlist); + playlist->clear_changes (); + playlist->clear_owned_changes (); + playlist->freeze (); + } - playlist->clear_changes (); - playlist->clear_owned_changes (); - playlist->freeze (); playlist->remove_region (*rl); if (can_ripple && should_ripple()) { @@ -5036,27 +5040,24 @@ Editor::remove_regions (const RegionSelection& sel, bool can_ripple, bool as_par } vector >::iterator pl; - bool in_command = false; + + bool commit_result = false; for (pl = playlists.begin(); pl != playlists.end(); ++pl) { + commit_result = true; (*pl)->thaw (); /* We might have removed regions, which alters other regions' layering_index, so we need to do a recursive diff here. */ - if (!in_command && !as_part_of_other_command) { - begin_reversible_command (_("remove region")); - in_command = true; - } vector cmds; (*pl)->rdiff (cmds); _session->add_commands (cmds); - _session->add_command(new StatefulDiffCommand (*pl)); } - if (in_command && !as_part_of_other_command) { + if (commit_result && !as_part_of_other_command) { commit_reversible_command (); } }