diff options
author | Carl Hetherington <carl@carlh.net> | 2011-12-27 20:21:00 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2011-12-27 20:21:00 +0000 |
commit | f440f91849a807e9026d79c06075bbd15852cbf6 (patch) | |
tree | 5742bfbca514337cd2de0fe236a3c277b6a4e219 /gtk2_ardour/editor_ops.cc | |
parent | 86cb9348e829e61b7c1e324930882af147f504c9 (diff) |
Try to make new layering stuff play nicely with undo.
git-svn-id: svn://localhost/ardour2/branches/3.0@11097 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_ops.cc')
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 81 |
1 files changed, 77 insertions, 4 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index a07f16b5c8..d387f7c0eb 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2134,27 +2134,100 @@ Editor::loop_location (Location& location) } void +Editor::do_layer_operation (LayerOperation op) +{ + if (selection->regions.empty ()) { + return; + } + + bool const multiple = selection->regions.size() > 1; + switch (op) { + case Raise: + if (multiple) { + begin_reversible_command (_("raise regions")); + } else { + begin_reversible_command (_("raise region")); + } + break; + + case RaiseToTop: + if (multiple) { + begin_reversible_command (_("raise regions to top")); + } else { + begin_reversible_command (_("raise region to top")); + } + break; + + case Lower: + if (multiple) { + begin_reversible_command (_("lower regions")); + } else { + begin_reversible_command (_("lower region")); + } + break; + + case LowerToBottom: + if (multiple) { + begin_reversible_command (_("lower regions to bottom")); + } else { + begin_reversible_command (_("lower region")); + } + break; + } + + set<boost::shared_ptr<Playlist> > playlists = selection->regions.playlists (); + for (set<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) { + (*i)->clear_owned_changes (); + } + + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + boost::shared_ptr<Region> r = (*i)->region (); + switch (op) { + case Raise: + r->raise (); + break; + case RaiseToTop: + r->raise_to_top (); + break; + case Lower: + r->lower (); + break; + case LowerToBottom: + r->lower_to_bottom (); + } + } + + for (set<boost::shared_ptr<Playlist> >::iterator i = playlists.begin(); i != playlists.end(); ++i) { + vector<Command*> cmds; + (*i)->rdiff (cmds); + _session->add_commands (cmds); + } + + commit_reversible_command (); +} + +void Editor::raise_region () { - selection->foreach_region (&Region::raise); + do_layer_operation (Raise); } void Editor::raise_region_to_top () { - selection->foreach_region (&Region::raise_to_top); + do_layer_operation (RaiseToTop); } void Editor::lower_region () { - selection->foreach_region (&Region::lower); + do_layer_operation (Lower); } void Editor::lower_region_to_bottom () { - selection->foreach_region (&Region::lower_to_bottom); + do_layer_operation (LowerToBottom); } /** Show the region editor for the selected regions */ |