X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fregion_selection.cc;h=2e4eaaadcd08a5f82922481aa0685668c1bd4610;hb=29f0d9732eb68fcaa22219cedddddd47bcaa8c17;hp=34810691f5c33e3f1cc678b9dc056daa0f6f55bc;hpb=f4fe4d36b1db9d5c267273e2f772e9d6b3746d1c;p=ardour.git diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index 34810691f5..2e4eaaadcd 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -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 ((*i)->region()); - + boost::shared_ptr 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& 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& foo) const { @@ -237,6 +296,10 @@ RegionSelection::by_track (list& 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 {