summaryrefslogtreecommitdiff
path: root/gtk2_ardour/editor_ops.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2008-01-09 18:26:47 +0000
committerPaul Davis <paul@linuxaudiosystems.com>2008-01-09 18:26:47 +0000
commit9c88023faf6d63806fa747eda541294f22a1e5f3 (patch)
tree0e7891587cf986aa9c2b4bd0de6587982a1c4c32 /gtk2_ardour/editor_ops.cc
parentb007f7fe621e8390b41df5a725fbb697d3d69fb9 (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.cc80
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());