13
0

Fix undo when removing multiple regions on the same track

This commit is contained in:
Robin Gareus 2024-08-13 03:07:24 +02:00
parent 9f0b829cfb
commit b501eaf43a
Signed by: rgareus
GPG Key ID: A090BCE02CF57F04

View File

@ -5002,6 +5002,13 @@ Editor::remove_regions (const RegionSelection& sel, bool can_ripple, bool as_par
vector<std::shared_ptr<Playlist> > 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<std::shared_ptr<Region> >::iterator rl = regions_to_remove.begin(); rl != regions_to_remove.end(); ++rl) {
std::shared_ptr<Playlist> playlist = (*rl)->playlist();
@ -5011,16 +5018,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()) {
@ -5029,27 +5034,24 @@ Editor::remove_regions (const RegionSelection& sel, bool can_ripple, bool as_par
}
vector<std::shared_ptr<Playlist> >::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<Command*> 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 ();
}
}