X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fselection.cc;h=43dd75df61f9606af3d73570cecb9494c926b39d;hb=fc7a2e9ee1616cdcb78d6b60804baff336ad07ee;hp=3c1aea1ec85caa30ff33236cf07a925c7e8311e8;hpb=868f557f2612903f72614a2b3a317c7a528188d1;p=ardour.git diff --git a/gtk2_ardour/selection.cc b/gtk2_ardour/selection.cc index 3c1aea1ec8..43dd75df61 100644 --- a/gtk2_ardour/selection.cc +++ b/gtk2_ardour/selection.cc @@ -15,16 +15,16 @@ along with this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. - $Id$ */ #include #include #include +#include #include -#include "regionview.h" +#include "region_view.h" #include "selection.h" #include "selection_templates.h" #include "time_axis_view.h" @@ -33,6 +33,7 @@ #include "i18n.h" using namespace ARDOUR; +using namespace PBD; using namespace sigc; struct AudioRangeComparator { @@ -45,7 +46,7 @@ Selection& Selection::operator= (const Selection& other) { if (&other != this) { - audio_regions = other.audio_regions; + regions = other.regions; tracks = other.tracks; time = other.time; lines = other.lines; @@ -56,52 +57,53 @@ Selection::operator= (const Selection& other) bool operator== (const Selection& a, const Selection& b) { - return a.audio_regions == b.audio_regions && + return a.regions == b.regions && a.tracks == b.tracks && a.time.track == b.time.track && a.time.group == b.time.group && a.time == b.time && a.lines == b.lines && a.playlists == b.playlists && - a.redirects == b.redirects; + a.processors == b.processors; } +/** Clear everything from the Selection */ void Selection::clear () { clear_tracks (); - clear_audio_regions (); + clear_regions (); clear_points (); clear_lines(); clear_time (); clear_playlists (); - clear_redirects (); + clear_processors (); } void Selection::dump_region_layers() { cerr << "region selection layer dump" << endl; - for (AudioRegionSelection::iterator i = audio_regions.begin(); i != audio_regions.end(); ++i) { - cerr << "layer: " << (int)(*i)->region.layer() << endl; + for (RegionSelection::iterator i = regions.begin(); i != regions.end(); ++i) { + cerr << "layer: " << (int)(*i)->region()->layer() << endl; } } void -Selection::clear_redirects () +Selection::clear_processors () { - if (!redirects.empty()) { - redirects.clear (); - RedirectsChanged (); + if (!processors.empty()) { + processors.clear (); + ProcessorsChanged (); } } void -Selection::clear_audio_regions () +Selection::clear_regions () { - if (!audio_regions.empty()) { - audio_regions.clear_all (); + if (!regions.empty()) { + regions.clear_all (); RegionsChanged(); } } @@ -131,7 +133,9 @@ Selection::clear_playlists () /* Selections own their playlists */ for (PlaylistSelection::iterator i = playlists.begin(); i != playlists.end(); ++i) { - (*i)->unref (); + /* selections own their own regions, which are copies of the "originals". make them go away */ + (*i)->drop_regions (); + (*i)->release (); } if (!playlists.empty()) { @@ -150,26 +154,26 @@ Selection::clear_lines () } void -Selection::toggle (Redirect* r) +Selection::toggle (boost::shared_ptr r) { - RedirectSelection::iterator i; + ProcessorSelection::iterator i; - if ((i = find (redirects.begin(), redirects.end(), r)) == redirects.end()) { - redirects.push_back (r); + if ((i = find (processors.begin(), processors.end(), r)) == processors.end()) { + processors.push_back (r); } else { - redirects.erase (i); + processors.erase (i); } - RedirectsChanged(); + ProcessorsChanged(); } void -Selection::toggle (Playlist* pl) +Selection::toggle (boost::shared_ptr pl) { PlaylistSelection::iterator i; if ((i = find (playlists.begin(), playlists.end(), pl)) == playlists.end()) { - pl->ref (); + pl->use (); playlists.push_back(pl); } else { playlists.erase (i); @@ -178,6 +182,14 @@ Selection::toggle (Playlist* pl) PlaylistsChanged (); } +void +Selection::toggle (const list& track_list) +{ + for (list::const_iterator i = track_list.begin(); i != track_list.end(); ++i) { + toggle ( (*i) ); + } +} + void Selection::toggle (TimeAxisView* track) { @@ -195,29 +207,29 @@ Selection::toggle (TimeAxisView* track) } void -Selection::toggle (AudioRegionView* r) +Selection::toggle (RegionView* r) { - AudioRegionSelection::iterator i; + RegionSelection::iterator i; - if ((i = find (audio_regions.begin(), audio_regions.end(), r)) == audio_regions.end()) { - audio_regions.add (r); + if ((i = find (regions.begin(), regions.end(), r)) == regions.end()) { + add (r); } else { - audio_regions.erase (i); + remove (*i); } RegionsChanged (); } void -Selection::toggle (vector& r) +Selection::toggle (vector& r) { - AudioRegionSelection::iterator i; + RegionSelection::iterator i; - for (vector::iterator x = r.begin(); x != r.end(); ++x) { - if ((i = find (audio_regions.begin(), audio_regions.end(), (*x))) == audio_regions.end()) { - audio_regions.add ((*x)); + for (vector::iterator x = r.begin(); x != r.end(); ++x) { + if ((i = find (regions.begin(), regions.end(), (*x))) == regions.end()) { + add ((*x)); } else { - audio_regions.erase (i); + remove (*x); } } @@ -225,7 +237,7 @@ Selection::toggle (vector& r) } long -Selection::toggle (jack_nframes_t start, jack_nframes_t end) +Selection::toggle (nframes_t start, nframes_t end) { AudioRangeComparator cmp; @@ -242,32 +254,32 @@ Selection::toggle (jack_nframes_t start, jack_nframes_t end) void -Selection::add (Redirect* r) +Selection::add (boost::shared_ptr i) { - if (find (redirects.begin(), redirects.end(), r) == redirects.end()) { - redirects.push_back (r); - RedirectsChanged(); + if (find (processors.begin(), processors.end(), i) == processors.end()) { + processors.push_back (i); + ProcessorsChanged(); } } void -Selection::add (Playlist* pl) +Selection::add (boost::shared_ptr pl) { if (find (playlists.begin(), playlists.end(), pl) == playlists.end()) { - pl->ref (); + pl->use (); playlists.push_back(pl); PlaylistsChanged (); } } void -Selection::add (const list& pllist) +Selection::add (const list >& pllist) { bool changed = false; - for (list::const_iterator i = pllist.begin(); i != pllist.end(); ++i) { + for (list >::const_iterator i = pllist.begin(); i != pllist.end(); ++i) { if (find (playlists.begin(), playlists.end(), (*i)) == playlists.end()) { - (*i)->ref (); + (*i)->use (); playlists.push_back (*i); changed = true; } @@ -309,23 +321,26 @@ Selection::add (TimeAxisView* track) } void -Selection::add (AudioRegionView* r) +Selection::add (RegionView* r) { - if (find (audio_regions.begin(), audio_regions.end(), r) == audio_regions.end()) { - audio_regions.add (r); + if (find (regions.begin(), regions.end(), r) == regions.end()) { + regions.add (r); + add (&r->get_trackview()); RegionsChanged (); } } void -Selection::add (vector& v) +Selection::add (vector& v) { bool changed = false; - for (vector::iterator i = v.begin(); i != v.end(); ++i) { - if (find (audio_regions.begin(), audio_regions.end(), (*i)) == audio_regions.end()) { - audio_regions.add ((*i)); - changed = true; + for (vector::iterator i = v.begin(); i != v.end(); ++i) { + if (find (regions.begin(), regions.end(), (*i)) == regions.end()) { + changed = regions.add ((*i)); + if (changed) { + add (&(*i)->get_trackview()); + } } } @@ -335,7 +350,7 @@ Selection::add (vector& v) } long -Selection::add (jack_nframes_t start, jack_nframes_t end) +Selection::add (nframes_t start, nframes_t end) { AudioRangeComparator cmp; @@ -351,7 +366,7 @@ Selection::add (jack_nframes_t start, jack_nframes_t end) } void -Selection::replace (uint32_t sid, jack_nframes_t start, jack_nframes_t end) +Selection::replace (uint32_t sid, nframes_t start, nframes_t end) { for (list::iterator i = time.begin(); i != time.end(); ++i) { if ((*i).id == sid) { @@ -380,12 +395,12 @@ Selection::add (AutomationList* ac) } void -Selection::remove (Redirect* r) +Selection::remove (boost::shared_ptr r) { - list::iterator i; - if ((i = find (redirects.begin(), redirects.end(), r)) != redirects.end()) { - redirects.erase (i); - RedirectsChanged (); + ProcessorSelection::iterator i; + if ((i = find (processors.begin(), processors.end(), r)) != processors.end()) { + processors.erase (i); + ProcessorsChanged (); } } @@ -420,9 +435,9 @@ Selection::remove (const list& track_list) } void -Selection::remove (Playlist* track) +Selection::remove (boost::shared_ptr track) { - list::iterator i; + list >::iterator i; if ((i = find (playlists.begin(), playlists.end(), track)) != playlists.end()) { playlists.erase (i); PlaylistsChanged(); @@ -430,13 +445,13 @@ Selection::remove (Playlist* track) } void -Selection::remove (const list& pllist) +Selection::remove (const list >& pllist) { bool changed = false; - for (list::const_iterator i = pllist.begin(); i != pllist.end(); ++i) { + for (list >::const_iterator i = pllist.begin(); i != pllist.end(); ++i) { - list::iterator x; + list >::iterator x; if ((x = find (playlists.begin(), playlists.end(), (*i))) != playlists.end()) { playlists.erase (x); @@ -450,10 +465,15 @@ Selection::remove (const list& pllist) } void -Selection::remove (AudioRegionView* r) +Selection::remove (RegionView* r) { - audio_regions.remove (r); - RegionsChanged (); + if (regions.remove (r)) { + RegionsChanged (); + } + + if (!regions.involves (r->get_trackview())) { + remove (&r->get_trackview()); + } } @@ -475,7 +495,7 @@ Selection::remove (uint32_t selection_id) } void -Selection::remove (jack_nframes_t start, jack_nframes_t end) +Selection::remove (nframes_t start, nframes_t end) { } @@ -490,10 +510,10 @@ Selection::remove (AutomationList *ac) } void -Selection::set (Redirect *r) +Selection::set (boost::shared_ptr i) { - clear_redirects (); - add (r); + clear_processors (); + add (i); } void @@ -511,38 +531,39 @@ Selection::set (const list& track_list) } void -Selection::set (Playlist* playlist) +Selection::set (boost::shared_ptr playlist) { clear_playlists (); add (playlist); } void -Selection::set (const list& pllist) +Selection::set (const list >& pllist) { clear_playlists (); add (pllist); } void -Selection::set (AudioRegionView* r) +Selection::set (RegionView* r) { - clear_audio_regions (); + clear_regions (); + clear_tracks (); add (r); } void -Selection::set (vector& v) +Selection::set (vector& v) { - - clear_audio_regions (); + clear_tracks (); + clear_regions (); // make sure to deselect any automation selections clear_points(); add (v); } long -Selection::set (TimeAxisView* track, jack_nframes_t start, jack_nframes_t end) +Selection::set (TimeAxisView* track, nframes_t start, nframes_t end) { if ((start == 0 && end == 0) || end < start) { return 0; @@ -589,56 +610,103 @@ Selection::selected (TimeAxisView* tv) } bool -Selection::selected (AudioRegionView* arv) +Selection::selected (RegionView* rv) { - return find (audio_regions.begin(), audio_regions.end(), arv) != audio_regions.end(); + return find (regions.begin(), regions.end(), rv) != regions.end(); } bool Selection::empty () { - return audio_regions.empty () && + return regions.empty () && tracks.empty () && points.empty () && playlists.empty () && lines.empty () && time.empty () && playlists.empty () && - redirects.empty () + processors.empty () ; } +void +Selection::toggle (const vector& autos) +{ + for (vector::const_iterator x = autos.begin(); x != autos.end(); ++x) { + if ((*x)->get_selected()) { + points.remove (**x); + } else { + points.push_back (**x); + } + + delete *x; + } + + PointsChanged (); /* EMIT SIGNAL */ +} + +void +Selection::toggle (list& selectables) +{ + RegionView* rv; + AutomationSelectable* as; + vector rvs; + vector autos; + + for (std::list::iterator i = selectables.begin(); i != selectables.end(); ++i) { + if ((rv = dynamic_cast (*i)) != 0) { + rvs.push_back (rv); + } else if ((as = dynamic_cast (*i)) != 0) { + autos.push_back (as); + } else { + fatal << _("programming error: ") + << X_("unknown selectable type passed to Selection::toggle()") + << endmsg; + /*NOTREACHED*/ + } + } + + if (!rvs.empty()) { + toggle (rvs); + } + + if (!autos.empty()) { + toggle (autos); + } +} + void Selection::set (list& selectables) { - clear_audio_regions(); + clear_regions(); clear_points (); add (selectables); } + void Selection::add (list& selectables) { - AudioRegionView* arv; + RegionView* rv; AutomationSelectable* as; - vector arvs; + vector rvs; vector autos; for (std::list::iterator i = selectables.begin(); i != selectables.end(); ++i) { - if ((arv = dynamic_cast (*i)) != 0) { - arvs.push_back (arv); + if ((rv = dynamic_cast (*i)) != 0) { + rvs.push_back (rv); } else if ((as = dynamic_cast (*i)) != 0) { autos.push_back (as); } else { fatal << _("programming error: ") - << X_("unknown selectable type passed to Selection::set()") + << X_("unknown selectable type passed to Selection::add()") << endmsg; /*NOTREACHED*/ } } - if (!arvs.empty()) { - add (arvs); + if (!rvs.empty()) { + add (rvs); } if (!autos.empty()) { @@ -660,7 +728,6 @@ Selection::add (vector& autos) { for (vector::iterator i = autos.begin(); i != autos.end(); ++i) { points.push_back (**i); - delete *i; } PointsChanged ();