diff options
author | Carl Hetherington <carl@carlh.net> | 2007-10-06 20:36:21 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2007-10-06 20:36:21 +0000 |
commit | 9e9c7a85365a924e207f72c6682a45de04ee95b9 (patch) | |
tree | 343e318383a3a639c3e2ce70829b80a27468f1f0 /gtk2_ardour/editor_selection.cc | |
parent | 4940fa348d995fea7d2cc1ab11c953954b407f03 (diff) |
Backport fix from trunk for selection of regions that are in edit groups.
git-svn-id: svn://localhost/ardour2/branches/2.0-ongoing@2527 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_selection.cc')
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 60 |
1 files changed, 42 insertions, 18 deletions
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index c736773dc7..67b4710b7a 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -284,18 +284,47 @@ Editor::get_relevant_audio_tracks (set<AudioTimeAxisView*>& relevant_tracks) } } + +/** + * Call a slot for a given `basis' track and also for any track that is in the same + * active edit group. + * @param sl Slot to call. + * @param basis Basis track. + */ + void -Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&,uint32_t> sl) +Editor::mapover_audio_tracks (slot<void,AudioTimeAxisView&,uint32_t> sl, TimeAxisView* basis) { - set<AudioTimeAxisView*> relevant_tracks; + AudioTimeAxisView* audio_basis = dynamic_cast<AudioTimeAxisView*> (basis); + if (audio_basis == 0) { + return; + } - get_relevant_audio_tracks (relevant_tracks); + /* work out the tracks that we will call the slot for; use + a set here as it will disallow possible duplicates of the + basis track */ + set<AudioTimeAxisView*> tracks; - uint32_t sz = relevant_tracks.size(); + /* always call for the basis */ + tracks.insert (audio_basis); - for (set<AudioTimeAxisView*>::iterator ati = relevant_tracks.begin(); ati != relevant_tracks.end(); ++ati) { - sl (**ati, sz); + RouteGroup* group = audio_basis->route()->edit_group(); + if (group && group->is_active()) { + + /* the basis is a member of an active edit group; find other members */ + for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { + AudioTimeAxisView* v = dynamic_cast<AudioTimeAxisView*> (*i); + if (v && v->route()->edit_group() == group) { + tracks.insert (v); + } + } } + + /* call the slots */ + uint32_t const sz = tracks.size (); + for (set<AudioTimeAxisView*>::iterator i = tracks.begin(); i != tracks.end(); ++i) { + sl (**i, sz); + } } void @@ -330,7 +359,7 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, void Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions) { - mapover_audio_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions)); + mapover_audio_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview()); /* add clicked regionview since we skipped all other regions in the same track as the one it was in */ @@ -387,11 +416,11 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, if (press) { - if (selection->selected (clicked_audio_trackview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions); - } else { - all_equivalent_regions.push_back (clicked_regionview); - } + if (selection->selected (clicked_audio_trackview)) { + get_equivalent_regions (clicked_regionview, all_equivalent_regions); + } else { + all_equivalent_regions.push_back (clicked_regionview); + } /* add all the equivalent regions, but only on button press */ @@ -409,12 +438,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, case Selection::Set: if (!clicked_regionview->get_selected()) { - if (selection->selected (clicked_audio_trackview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions); - } else { - all_equivalent_regions.push_back (clicked_regionview); - } - + get_equivalent_regions (clicked_regionview, all_equivalent_regions); selection->set (all_equivalent_regions); commit = true; } else { |