make waveforms centered when height hits NAME_HIGHLIGHT_THRESHOLD
[ardour.git] / gtk2_ardour / selection.cc
index f96d649b0467f6796190c80d40b200a50235a670..2e4ed8a1176caba4287e60b7d9f78199ba21ac8c 100644 (file)
@@ -33,6 +33,7 @@
 #include "i18n.h"
 
 using namespace ARDOUR;
+using namespace PBD;
 using namespace sigc;
 
 struct AudioRangeComparator {
@@ -149,6 +150,98 @@ Selection::clear_lines ()
        }
 }
 
+void
+Selection::toggle (Redirect* r)
+{
+       RedirectSelection::iterator i;
+
+       if ((i = find (redirects.begin(), redirects.end(), r)) == redirects.end()) {
+               redirects.push_back (r);
+       } else {
+               redirects.erase (i);
+       }
+       RedirectsChanged();
+
+}
+
+void
+Selection::toggle (Playlist* pl)
+{
+       PlaylistSelection::iterator i;
+
+       if ((i = find (playlists.begin(), playlists.end(), pl)) == playlists.end()) {
+               pl->ref ();
+               playlists.push_back(pl);
+       } else {
+               playlists.erase (i);
+       }
+
+       PlaylistsChanged ();
+}
+
+void
+Selection::toggle (TimeAxisView* track)
+{
+       TrackSelection::iterator i;
+       
+       if ((i = find (tracks.begin(), tracks.end(), track)) == tracks.end()) {
+               void (Selection::*pmf)(TimeAxisView*) = &Selection::remove;
+               track->GoingAway.connect (sigc::bind (mem_fun (*this, pmf), track));
+               tracks.push_back (track);
+       } else {
+               tracks.erase (i);
+       }
+
+       TracksChanged();
+}
+
+void
+Selection::toggle (AudioRegionView* r)
+{
+       AudioRegionSelection::iterator i;
+
+       if ((i = find (audio_regions.begin(), audio_regions.end(), r)) == audio_regions.end()) {
+               audio_regions.add (r);
+       } else {
+               audio_regions.erase (i);
+       }
+
+       RegionsChanged ();
+}
+
+void
+Selection::toggle (vector<AudioRegionView*>& r)
+{
+       AudioRegionSelection::iterator i;
+
+       for (vector<AudioRegionView*>::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));
+               } else {
+                       audio_regions.erase (i);
+               }
+       }
+
+       RegionsChanged ();
+}
+
+long
+Selection::toggle (jack_nframes_t start, jack_nframes_t end)
+{
+       AudioRangeComparator cmp;
+
+       /* XXX this implementation is incorrect */
+
+       time.push_back (AudioRange (start, end, next_time_id++));
+       time.consolidate ();
+       time.sort (cmp);
+       
+       TimeChanged ();
+
+       return next_time_id - 1;
+}
+
+
 void
 Selection::add (Redirect* r)
 {
@@ -247,6 +340,8 @@ Selection::add (jack_nframes_t start, jack_nframes_t end)
 {
        AudioRangeComparator cmp;
 
+       /* XXX this implementation is incorrect */
+
        time.push_back (AudioRange (start, end, next_time_id++));
        time.consolidate ();
        time.sort (cmp);
@@ -568,6 +663,6 @@ Selection::add (vector<AutomationSelectable*>& autos)
                points.push_back (**i);
                delete *i;
        }
-       
+
        PointsChanged ();
 }