diff --git a/gtk2_ardour/editor_drag.cc b/gtk2_ardour/editor_drag.cc index caa807de3d..41044a4577 100644 --- a/gtk2_ardour/editor_drag.cc +++ b/gtk2_ardour/editor_drag.cc @@ -4240,8 +4240,7 @@ SelectionDrag::motion (GdkEvent* event, bool first_move) } /* select all tracks within the rectangle that we've marked out so far */ - TrackViewList to_be_added_to_selection; - TrackViewList to_be_removed_from_selection; + TrackViewList new_selection; TrackViewList& all_tracks (_editor->track_views); ArdourCanvas::Coord const top = grab_y(); @@ -4249,27 +4248,28 @@ SelectionDrag::motion (GdkEvent* event, bool first_move) if (top >= 0 && bottom >= 0) { + //first, find the tracks that are covered in the y range selection for (TrackViewList::const_iterator i = all_tracks.begin(); i != all_tracks.end(); ++i) { - if ((*i)->covered_by_y_range (top, bottom)) { - to_be_added_to_selection.push_back (*i); + new_selection.push_back (*i); } } - //add any tracks that are GROUPED with the tracks we selected - TrackViewList grouped_add = to_be_added_to_selection; - for (TrackViewList::const_iterator i = to_be_added_to_selection.begin(); i != to_be_added_to_selection.end(); ++i) { - RouteTimeAxisView *add = dynamic_cast(*i); - if ( add && add->route()->route_group() && add->route()->route_group()->is_active() ) { + //now find any tracks that are GROUPED with the tracks we selected + TrackViewList grouped_add = new_selection; + for (TrackViewList::const_iterator i = new_selection.begin(); i != new_selection.end(); ++i) { + RouteTimeAxisView *n = dynamic_cast(*i); + if ( n && n->route()->route_group() && n->route()->route_group()->is_active() ) { for (TrackViewList::const_iterator j = all_tracks.begin(); j != all_tracks.end(); ++j) { - RouteTimeAxisView *rem = dynamic_cast(*j); - if ( rem && (add != rem) && (rem->route()->route_group() == add->route()->route_group()) ) + RouteTimeAxisView *check = dynamic_cast(*j); + if ( check && (n != check) && (check->route()->route_group() == n->route()->route_group()) ) grouped_add.push_back (*j); } } } - //now compare our list with the current selection, and add or remove as necessary ( most mouse moves don't change the selection so we can't just SET it for every mouse move; it gets clunky ) + //now compare our list with the current selection, and add or remove as necessary + //( NOTE: most mouse moves don't change the selection so we can't just SET it for every mouse move; it gets clunky ) TrackViewList tracks_to_add; TrackViewList tracks_to_remove; for (TrackViewList::const_iterator i = grouped_add.begin(); i != grouped_add.end(); ++i) @@ -4278,10 +4278,8 @@ SelectionDrag::motion (GdkEvent* event, bool first_move) for (TrackViewList::const_iterator i = _editor->selection->tracks.begin(); i != _editor->selection->tracks.end(); ++i) if ( !grouped_add.contains ( *i ) ) tracks_to_remove.push_back ( *i ); - _editor->selection->add(tracks_to_add); _editor->selection->remove(tracks_to_remove); - } }