add keybinding editor
[ardour.git] / gtk2_ardour / region_selection.cc
index 34810691f5c33e3f1cc678b9dc056daa0f6f55bc..2e4eaaadcd08a5f82922481aa0685668c1bd4610 100644 (file)
@@ -28,15 +28,27 @@ using namespace ARDOUR;
 using namespace PBD;
 using namespace sigc;
 
+/**
+ *  Construct an empty RegionSelection.
+ */
 
 RegionSelection::RegionSelection ()
 {
+       RegionView::RegionViewGoingAway.connect (mem_fun(*this, &RegionSelection::remove_it));
+
        _current_start = 0;
        _current_end = 0;
 }
 
+/**
+ *  Copy constructor.
+ *  @param other RegionSelection to copy.
+ */
+
 RegionSelection::RegionSelection (const RegionSelection& other)
 {
+       RegionView::RegionViewGoingAway.connect (mem_fun(*this, &RegionSelection::remove_it));
+
        for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) {
                add (*i);
        }
@@ -44,7 +56,10 @@ RegionSelection::RegionSelection (const RegionSelection& other)
        _current_end = other._current_end;
 }
 
-
+/**
+ *  operator= to set a RegionSelection to be the same as another.
+ *  @param other Other RegionSelection.
+ */
 
 RegionSelection&
 RegionSelection::operator= (const RegionSelection& other)
@@ -64,6 +79,10 @@ RegionSelection::operator= (const RegionSelection& other)
        return *this;
 }
 
+/**
+ *  Empty this RegionSelection.
+ */
+
 void
 RegionSelection::clear_all()
 {
@@ -73,11 +92,22 @@ RegionSelection::clear_all()
        _current_end = 0;
 }
 
+/**
+ *  @param rv RegionView.
+ *  @return true if this selection contains rv.
+ */
+
 bool RegionSelection::contains (RegionView* rv) const
 {
        return find (begin(), end(), rv) != end();
 }
 
+/**
+ *  Add a region to the selection.
+ *  @param rv Region to add.
+ *  @return false if we already had the region, otherwise true.
+ */
+
 bool
 RegionSelection::add (RegionView* rv)
 {
@@ -86,8 +116,6 @@ RegionSelection::add (RegionView* rv)
                return false;
        }
 
-       rv->RegionViewGoingAway.connect (mem_fun(*this, &RegionSelection::remove_it));
-
        if (rv->region()->first_frame() < _current_start || empty()) {
                _current_start = rv->region()->first_frame();
        }
@@ -98,47 +126,60 @@ RegionSelection::add (RegionView* rv)
        
        push_back (rv);
 
-       // add to layer sorted list
+       /* add to layer sorted list */
 
        add_to_layer (rv);
 
        return true;
 }
 
+/**
+ *  Remove a region from the selection.
+ *  @param rv Region to remove.
+ */
+
 void
 RegionSelection::remove_it (RegionView *rv)
 {
        remove (rv);
 }
 
+/**
+ *  Remove a region from the selection.
+ *  @param rv Region to remove.
+ *  @return true if the region was in the selection, false if not.
+ */
+
 bool
 RegionSelection::remove (RegionView* rv)
 {
-       RegionSelection::iterator i;
-
-       if ((i = find (begin(), end(), rv)) != end()) {
+       RegionSelection::iterator r;
 
-               erase (i);
+       if ((r = find (begin(), end(), rv)) != end()) {
 
                // remove from layer sorted list
                _bylayer.remove (rv);
                
-               if (empty()) {
+               if (size() == 1) {
+
+                       /* this is the last one, so when we delete it
+                          we will be empty.
+                       */
 
                        _current_start = 0;
                        _current_end = 0;
 
                } else {
                        
-                       boost::shared_ptr<Region> region ((*i)->region());
-
+                       boost::shared_ptr<Region> region ((*r)->region());
+                       
                        if (region->first_frame() == _current_start) {
                                
                                /* reset current start */
                                
                                nframes_t ref = max_frames;
                                
-                               for (i = begin (); i != end(); ++i) {
+                               for (RegionSelection::iterator i = begin (); i != end(); ++i) {
                                        if (region->first_frame() < ref) {
                                                ref = region->first_frame();
                                        }
@@ -154,7 +195,7 @@ RegionSelection::remove (RegionView* rv)
                                
                                nframes_t ref = 0;
                                
-                               for (i = begin (); i != end(); ++i) {
+                               for (RegionSelection::iterator i = begin (); i != end(); ++i) {
                                        if (region->first_frame() > ref) {
                                                ref = region->first_frame();
                                        }
@@ -164,12 +205,19 @@ RegionSelection::remove (RegionView* rv)
                        }
                }
 
+               erase (r);
+
                return true;
        }
 
        return false;
 }
 
+/**
+ *  Add a region to the list sorted by layer.
+ *  @param rv Region to add.
+ */
+
 void
 RegionSelection::add_to_layer (RegionView * rv)
 {
@@ -196,6 +244,11 @@ struct RegionSortByTime {
 };
 
 
+/**
+ *  @param foo List which will be filled with the selection's regions
+ *  sorted by position.
+ */
+
 void
 RegionSelection::by_position (list<RegionView*>& foo) const
 {
@@ -222,7 +275,13 @@ struct RegionSortByTrack {
            }
     }
 };
-       
+
+
+/**
+ *  @param List which will be filled with the selection's regions
+ *  sorted by track and position.
+ */
+
 void
 RegionSelection::by_track (list<RegionView*>& foo) const
 {
@@ -237,6 +296,10 @@ RegionSelection::by_track (list<RegionView*>& foo) const
        return;
 }
 
+/**
+ *  @param Sort the selection by position and track.
+ */
+
 void
 RegionSelection::sort_by_position_and_track ()
 {
@@ -244,6 +307,11 @@ RegionSelection::sort_by_position_and_track ()
        sort (sorter);
 }
 
+/**
+ *  @param tv Track.
+ *  @return true if any of the selection's regions are on tv.
+ */
+
 bool
 RegionSelection::involves (const TimeAxisView& tv) const
 {