diff --git a/share/scripts/collapse_playlists.lua b/share/scripts/collapse_playlists.lua new file mode 100644 index 0000000000..a49b1ecd61 --- /dev/null +++ b/share/scripts/collapse_playlists.lua @@ -0,0 +1,64 @@ +ardour { ["type"] = "EditorAction", name = "Collapse Playlists", + license = "MIT", + author = "Ardour Team", + description = [[Add regions of all playlists to the current playlist of each selected track]] +} + +function factory (params) return function () + + -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:Selection + local sel = Editor:get_selection () + + -- prepare undo operation + -- see http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Session + Session:begin_reversible_command ("Collapse Playlists") + local add_undo = false -- keep track if something has changed + + -- Track/Bus Selection -- iterate over all Editor-GUI selected tracks + -- http://manual.ardour.org/lua-scripting/class_reference/#ArdourUI:TrackSelection + for route in sel.tracks:routelist():iter() do + + -- each of the items 'route' is-a + -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Route + local track = route:to_track() -- see if it's a track + if track:isnil() then + -- if not, skip it + goto continue + end + + -- get track's current playlist + -- http://manual.ardour.org/lua-scripting/class_reference/#ARDOUR:Playlist + local playlist = track:playlist() + + -- clear existing changes, prepare "diff" of state for undo + playlist:to_stateful():clear_changes() + + -- get and iterate over all playlists for the current track + for p in Session:playlists():playlists_for_track (track):iter() do + -- skip current active playlist + if (p ~= playlist) then + -- for each region of the playlist + for r in p:region_list():iter() do + -- add it to the current playlist + playlist:add_region (r, r:position(), 1, false, 0, 0, false) + end + end + end + + -- collect undo data + if not Session:add_stateful_diff_command (playlist:to_statefuldestructible()):empty() then + -- is something has changed, we need to save it at the end. + add_undo = true + end + + ::continue:: + end + + -- all done, commit the combined Undo Operation + if add_undo then + -- the 'nil' Command here mean to use the collected diffs added above + Session:commit_reversible_command (nil) + else + Session:abort_reversible_command () + end +end end