diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2008-01-09 18:26:47 +0000 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2008-01-09 18:26:47 +0000 |
commit | 9c88023faf6d63806fa747eda541294f22a1e5f3 (patch) | |
tree | 0e7891587cf986aa9c2b4bd0de6587982a1c4c32 /gtk2_ardour/editor_ops.cc | |
parent | b007f7fe621e8390b41df5a725fbb697d3d69fb9 (diff) |
make separate work with/without selected tracks; make align-regions-*-relative work correctly; make waveform muted color show correctly
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2855 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_ops.cc')
-rw-r--r-- | gtk2_ardour/editor_ops.cc | 80 |
1 files changed, 67 insertions, 13 deletions
diff --git a/gtk2_ardour/editor_ops.cc b/gtk2_ardour/editor_ops.cc index faf1ff41db..59e3e39cdd 100644 --- a/gtk2_ardour/editor_ops.cc +++ b/gtk2_ardour/editor_ops.cc @@ -2574,10 +2574,34 @@ Editor::separate_regions_between (const TimeSelection& ts) bool in_command = false; boost::shared_ptr<Playlist> playlist; RegionSelection new_selection; + TrackSelection tmptracks; + + if (selection->tracks.empty()) { - sort_track_selection (); + /* use tracks with selected regions */ - for (TrackSelection::iterator i = selection->tracks.begin(); i != selection->tracks.end(); ++i) { + for (RegionSelection::iterator i = selection->regions.begin(); i != selection->regions.end(); ++i) { + TimeAxisView* tv = &(*i)->get_time_axis_view(); + + if (find (tmptracks.begin(), tmptracks.end(), tv) == tmptracks.end()) { + tmptracks.push_back (tv); + } + } + + if (tmptracks.empty()) { + /* no regions selected: use all tracks */ + tmptracks = track_views; + } + + } else { + + tmptracks = selection->tracks; + + } + + sort_track_selection (&tmptracks); + + for (TrackSelection::iterator i = tmptracks.begin(); i != tmptracks.end(); ++i) { AudioTimeAxisView* atv; @@ -3003,29 +3027,59 @@ Editor::align_selection_relative (RegionPoint point, nframes_t position, const R switch (point) { case Start: - pos = r->first_frame (); + pos = position; + if (position > r->position()) { + distance = position - r->position(); + dir = 1; + } else { + distance = r->position() - position; + dir = -1; + } break; - + case End: - pos = r->last_frame(); + if (position > r->last_frame()) { + distance = position - r->last_frame(); + pos = r->position() + distance; + dir = 1; + } else { + distance = r->last_frame() - position; + pos = r->position() - distance; + dir = -1; + } break; case SyncPoint: - pos = r->adjust_to_sync (r->first_frame()); + pos = r->adjust_to_sync (position); + if (pos > r->position()) { + distance = pos - r->position(); + dir = 1; + } else { + distance = r->position() - pos; + dir = -1; + } break; } - if (pos > position) { - distance = pos - position; - dir = -1; - } else { - distance = position - pos; - dir = 1; + if (pos == r->position()) { + return; } begin_reversible_command (_("align selection (relative)")); - for (RegionSelection::const_iterator i = rs.begin(); i != rs.end(); ++i) { + /* move first one specially */ + + XMLNode &before = r->playlist()->get_state(); + r->set_position (pos, this); + XMLNode &after = r->playlist()->get_state(); + session->add_command(new MementoCommand<Playlist>(*(r->playlist()), &before, &after)); + + /* move rest by the same amount */ + + RegionSelection::const_iterator i = rs.begin(); + ++i; + + for (; i != rs.end(); ++i) { boost::shared_ptr<Region> region ((*i)->region()); |