summaryrefslogtreecommitdiff
path: root/scripts/tomsloop.lua
diff options
context:
space:
mode:
authorRobin Gareus <robin@gareus.org>2016-04-10 02:01:27 +0200
committerRobin Gareus <robin@gareus.org>2016-04-10 02:01:27 +0200
commitfcb9092e2cfb00f2ee9a20001b73d74718dc6be9 (patch)
treed3046928b621bc60101c68e854e08b6f09138ac0 /scripts/tomsloop.lua
parent0e70b779b4dc812faefa8ab4708fc1249bd89b0d (diff)
add undo to the lua bounce+loop example script, just because.
Diffstat (limited to 'scripts/tomsloop.lua')
-rw-r--r--scripts/tomsloop.lua44
1 files changed, 33 insertions, 11 deletions
diff --git a/scripts/tomsloop.lua b/scripts/tomsloop.lua
index 23c422d6ea..2a7880111e 100644
--- a/scripts/tomsloop.lua
+++ b/scripts/tomsloop.lua
@@ -26,9 +26,19 @@ function factory () return function ()
-- make sure we have a loop, and the playhead (edit point) is after it
-- TODO: only print an error and return
-- TODO: use the edit-point (not playhead) ? maybe.
- assert (loop)
+ if not loop then
+ print ("A Loop range must be set.")
+ goto errorout
+ end
assert (loop:start () < loop:_end ())
- assert (loop:_end () < playhead)
+ if loop:_end () >= playhead then
+ print ("The Playhead (paste point) needs to be after the loop.")
+ goto errorout
+ end
+
+ -- prepare undo operation
+ Session:begin_reversible_command ("Tom's Loop")
+ local add_undo = false -- keep track if something has changed
for route in Session:get_tracks ():iter () do
-- skip muted tracks
@@ -38,30 +48,42 @@ function factory () return function ()
-- test if bouncing is possible
local track = route:to_track ()
if not track:bounceable (proc, false) then
- goto continue;
+ goto continue
end
-- only audio tracks
local playlist = track:playlist ()
- if playlist:data_type ():to_string() ~= "audio" then
+ if playlist:data_type ():to_string () ~= "audio" then
goto continue
end
-- check if there are any regions in the loop-range of this track
local range = Evoral.Range (loop:start (), loop:_end ())
- if playlist:regions_with_start_within (range):empty () then
- goto continue
- end
- if playlist:regions_with_end_within (range):empty () then
+ if playlist:regions_with_start_within (range):empty ()
+ and playlist:regions_with_end_within (range):empty () then
goto continue
end
- -- all set
- --print (track:name ())
+ -- clear existing changes, prepare "diff" of state
+ playlist:to_stateful ():clear_changes ()
-- do the actual work
local region = track:bounce_range (loop:start (), loop:_end (), itt, proc, false)
- playlist:add_region(region, playhead, npaste, false)
+ playlist:add_region (region, playhead, npaste, false)
+
+ -- create a diff of the performed work, add it to the session's undo stack
+ -- and check if it is not empty
+ if not Session:add_stateful_diff_command (playlist:to_statefuldestructible ()):empty () then
+ add_undo = true
+ end
::continue::
end
+ -- all done, commit the combined Undo Operation
+ if add_undo then
+ -- the 'nil' Commend here mean to use the collected diffs added above
+ Session:commit_reversible_command (nil)
+ else
+ Session:abort_reversible_command ()
+ end
+ ::errorout::
end end