diff options
author | Carl Hetherington <carl@carlh.net> | 2009-06-25 20:58:32 +0000 |
---|---|---|
committer | Carl Hetherington <carl@carlh.net> | 2009-06-25 20:58:32 +0000 |
commit | 498afeb63edeb8a5ce0103296ffda4216d64186d (patch) | |
tree | 1af722a4075a7df05a67c580a8e5c3d0fe09f1a6 /gtk2_ardour/editor_selection.cc | |
parent | 8e7a5d77414a40550a28d61abf6eeb1e89a1ec25 (diff) |
Various adjustments to make more operations respect the Edit property on route groups.
git-svn-id: svn://localhost/ardour2/branches/3.0@5273 d708f5d6-7413-0410-9779-e7cbd77b26cf
Diffstat (limited to 'gtk2_ardour/editor_selection.cc')
-rw-r--r-- | gtk2_ardour/editor_selection.cc | 121 |
1 files changed, 68 insertions, 53 deletions
diff --git a/gtk2_ardour/editor_selection.cc b/gtk2_ardour/editor_selection.cc index bb9a392c9c..7c70400e39 100644 --- a/gtk2_ardour/editor_selection.cc +++ b/gtk2_ardour/editor_selection.cc @@ -261,76 +261,66 @@ Editor::get_onscreen_tracks (TrackViewList& tvl) } } +/** Given a track, find any other tracks that are in the same active route group with a given property. + * @param basis Base track. + * @param equivs Filled with the base track and the found tracks. + * @param prop Property to look for in route groups. + */ + void -Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks) +Editor::get_equivalent_tracks (RouteTimeAxisView* basis, set<RouteTimeAxisView*> & equivs, RouteGroup::Property prop) const { - /* step one: get all selected tracks and all tracks in the relevant edit groups */ - - for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) { + equivs.insert (basis); - RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*>(*ti); + RouteGroup* group = basis->route()->route_group(); + if (group && group->active_property (prop)) { - if (!rtv) { - continue; + /* the basis is a member of an active route group, with the appropriate + properties; find other members */ + + for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { + RouteTimeAxisView* v = dynamic_cast<RouteTimeAxisView*> (*i); + if (v && v->route()->route_group() == group) { + equivs.insert (v); + } } + } +} - RouteGroup* group = rtv->route()->route_group(); - - if (group && group->is_active()) { - - /* active group for this track, loop over all tracks and get every member of the group */ +/** Find tracks that are selected, and also those that are in the same `selection'-enabled route + * group as one that is selected. + * @param relevant_tracks set to add tracks to. + */ - for (TrackViewList::iterator i = track_views.begin(); i != track_views.end(); ++i) { - - RouteTimeAxisView* trtv; - - if ((trtv = dynamic_cast<RouteTimeAxisView*> (*i)) != 0) { - - if (trtv->route()->route_group() == group) { - relevant_tracks.insert (trtv); - } - } - } - } else { - relevant_tracks.insert (rtv); +void +Editor::get_relevant_tracks (set<RouteTimeAxisView*>& relevant_tracks) const +{ + for (TrackSelection::iterator ti = selection->tracks.begin(); ti != selection->tracks.end(); ++ti) { + RouteTimeAxisView* rtv = dynamic_cast<RouteTimeAxisView*> (*ti); + if (rtv) { + get_equivalent_tracks (rtv, relevant_tracks, RouteGroup::Select); } } } -/** - * Call a slot for a given `basis' track and also for any track that is in the same - * active route group with the `select' property. +/** Call a slot for a given `basis' track and also for any track that is in the same + * active route group with a particular set of properties. + * * @param sl Slot to call. * @param basis Basis track. + * @param prop Properties that active edit groups must share to be included in the map. */ void -Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis) const +Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisView* basis, RouteGroup::Property prop) const { RouteTimeAxisView* route_basis = dynamic_cast<RouteTimeAxisView*> (basis); if (route_basis == 0) { return; } - - /* 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<RouteTimeAxisView*> tracks; - - /* always call for the basis */ - tracks.insert (route_basis); - - RouteGroup* group = route_basis->route()->route_group(); - if (group && group->active_property (RouteGroup::Select)) { - - /* the basis is a member of an active edit group; find other members */ - for (TrackViewList::const_iterator i = track_views.begin(); i != track_views.end(); ++i) { - RouteTimeAxisView* v = dynamic_cast<RouteTimeAxisView*> (*i); - if (v && v->route()->route_group() == group) { - tracks.insert (v); - } - } - } + get_equivalent_tracks (route_basis, tracks, prop); /* call the slots */ uint32_t const sz = tracks.size (); @@ -340,7 +330,7 @@ Editor::mapover_tracks (slot<void, RouteTimeAxisView&, uint32_t> sl, TimeAxisVie } void -Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, RegionView* basis, vector<RegionView*>* all_equivs) const +Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, RegionView * basis, vector<RegionView*>* all_equivs) const { boost::shared_ptr<Playlist> pl; vector<boost::shared_ptr<Region> > results; @@ -369,15 +359,40 @@ Editor::mapped_get_equivalent_regions (RouteTimeAxisView& tv, uint32_t ignored, } void -Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions) const +Editor::get_equivalent_regions (RegionView* basis, vector<RegionView*>& equivalent_regions, RouteGroup::Property prop) const { - mapover_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview()); + mapover_tracks (bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), basis, &equivalent_regions), &basis->get_trackview(), prop); /* add clicked regionview since we skipped all other regions in the same track as the one it was in */ equivalent_regions.push_back (basis); } +RegionSelection +Editor::get_equivalent_regions (RegionSelection & basis, RouteGroup::Property prop) const +{ + RegionSelection equivalent; + + for (RegionSelection::const_iterator i = basis.begin(); i != basis.end(); ++i) { + + vector<RegionView*> eq; + + mapover_tracks ( + bind (mem_fun (*this, &Editor::mapped_get_equivalent_regions), *i, &eq), + &(*i)->get_trackview(), prop + ); + + for (vector<RegionView*>::iterator j = eq.begin(); j != eq.end(); ++j) { + equivalent.add (*j); + } + + equivalent.add (*i); + } + + return equivalent; +} + + int Editor::get_regionview_count_from_region_list (boost::shared_ptr<Region> region) { @@ -467,7 +482,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, if (press) { if (selection->selected (clicked_routeview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions); + get_equivalent_regions (clicked_regionview, all_equivalent_regions, RouteGroup::Select); } else { all_equivalent_regions.push_back (clicked_regionview); } @@ -487,7 +502,7 @@ Editor::set_selected_regionview_from_click (bool press, Selection::Operation op, case Selection::Set: if (!selection->selected (clicked_regionview)) { - get_equivalent_regions (clicked_regionview, all_equivalent_regions); + get_equivalent_regions (clicked_regionview, all_equivalent_regions, RouteGroup::Select); selection->set (all_equivalent_regions); commit = true; } else { |