From 6ac0aae35fbe82e570d69159ee3ae6c5715a5283 Mon Sep 17 00:00:00 2001 From: Robin Gareus Date: Fri, 9 Jun 2023 17:22:55 +0200 Subject: [PATCH] Implement playlist switch undo/redo --- gtk2_ardour/playlist_selector.cc | 11 +++++++ gtk2_ardour/route_ui.cc | 55 ++++++++++++++++++++++++-------- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/gtk2_ardour/playlist_selector.cc b/gtk2_ardour/playlist_selector.cc index 72e06b2b4e..f823c26af5 100644 --- a/gtk2_ardour/playlist_selector.cc +++ b/gtk2_ardour/playlist_selector.cc @@ -397,9 +397,11 @@ PlaylistSelector::selection_changed () return; } + XMLNode* before = &_rui->track ()->playlist_state (); switch (_mode) { /* @Robin: I dont see a way to undo these playlist actions * @Ben: me neither :) + * @Robin: Now I do. */ case plCopy: { @@ -426,6 +428,15 @@ PlaylistSelector::selection_changed () } break; } + + XMLNode* after = &_rui->track ()->playlist_state (); + if (*before != *after) { + _session->begin_reversible_command (string_compose (_("Switch Playlist for track %1"), _rui->track ()->name ())); + _session->commit_reversible_command (new MementoCommand(*_rui->track (), before, after)); + } else { + delete before; + delete after; + } } } diff --git a/gtk2_ardour/route_ui.cc b/gtk2_ardour/route_ui.cc index d4e8b9027b..fee05a7124 100644 --- a/gtk2_ardour/route_ui.cc +++ b/gtk2_ardour/route_ui.cc @@ -2562,13 +2562,28 @@ RouteUI::use_new_playlist (std::string name, std::string gid, vectorplaylist_state (); + if (copy) { tr->use_copy_playlist (); } else { tr->use_default_new_playlist (); } + + tr->playlist()->clear_changes (); + tr->playlist()->clear_owned_changes (); tr->playlist()->set_name (name); tr->playlist()->set_pgroup_id (gid); + + XMLNode* after = &tr->playlist_state (); + if (*before != *after) { + _session->begin_reversible_command (string_compose (_("New Playlist for track %1"), tr->name ())); + tr->playlist()->rdiff_and_add_command (_session); + _session->commit_reversible_command (new MementoCommand(*tr, before, after)); + } else { + delete before; + delete after; + } } void @@ -2692,24 +2707,26 @@ RouteUI::select_playlist_matching (std::weak_ptr wpl) return; } - if (track()->id() == pl->get_orig_track_id()) { + std::shared_ptr ipl; + std::shared_ptr t = track (); + XMLNode* before = &t->playlist_state (); + + if (t->id() == pl->get_orig_track_id()) { /* this playlist is one of this track's own, no need to match by pgroup-id or name */ - track()->use_playlist(track()->data_type(), pl); - return; + t->use_playlist(t->data_type(), pl); + goto checkdiff; } /* Search for a matching playlist .. either by pgroup_id or name */ - std::string pgrp_id = pl->pgroup_id(); - std::shared_ptr ipl = session()->playlists()->for_pgroup(pgrp_id, track()->id()); - if (ipl) { - //found a playlist that matches the pgroup_id, use it - track()->use_playlist (track()->data_type(), ipl); - } else { //fallback to prior behavior ... try to find matching names /*DEPRECATED*/ + if (0 != (ipl = session()->playlists()->for_pgroup(pl->pgroup_id(), t->id()))) { + // found a playlist that matches the pgroup_id, use it + t->use_playlist (t->data_type(), ipl); + } else { // fallback to prior behavior ... try to find matching names /*DEPRECATED*/ std::string take_name = pl->name(); std::string group_name; - if (track()->route_group()) { - group_name = track()->route_group()->name(); + if (t->route_group()) { + group_name = t->route_group()->name(); } std::string group_string = "." + group_name + "."; @@ -2717,14 +2734,24 @@ RouteUI::select_playlist_matching (std::weak_ptr wpl) if (idx != std::string::npos) { take_name = take_name.substr(idx + group_string.length()); // find the bit containing the take number / name - std::string playlist_name = track()->name()+group_string+take_name; + std::string playlist_name = t->name()+group_string+take_name; std::shared_ptr ipl = session()->playlists()->by_name(playlist_name); if (ipl) { - track()->use_playlist(track()->data_type(), ipl); + t->use_playlist(t->data_type(), ipl); } } - } //fallback + } + +checkdiff: + XMLNode* after = &t->playlist_state (); + if (*before != *after) { + _session->begin_reversible_command (string_compose (_("Switch Playlist for track %1"), t->name ())); + _session->commit_reversible_command (new MementoCommand(*t, before, after)); + } else { + delete before; + delete after; + } } void