X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fregion_selection.cc;h=20dd8c1d24fbddccf3b9b73ee0d5af38f9d90ba4;hb=ccf58b8de23619db9983a45f696fd97e13a15cce;hp=7ac7763773a6848aa90d871d4e0df8d09de27ab0;hpb=2dd0b9321c87838e9f2276c02f5942daac2b836e;p=ardour.git diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index 7ac7763773..20dd8c1d24 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -1,5 +1,5 @@ /* - Copyright (C) 2006 Paul Davis + Copyright (C) 2006 Paul Davis This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by @@ -18,17 +18,19 @@ #include -#include +#include "ardour/region.h" #include "region_view.h" #include "region_selection.h" #include "time_axis_view.h" +using namespace std; using namespace ARDOUR; using namespace PBD; using namespace sigc; - +/** Construct an empty RegionSelection. + */ RegionSelection::RegionSelection () { RegionView::RegionViewGoingAway.connect (mem_fun(*this, &RegionSelection::remove_it)); @@ -37,35 +39,46 @@ RegionSelection::RegionSelection () _current_end = 0; } +/** Copy constructor. + * @param other RegionSelection to copy. + */ RegionSelection::RegionSelection (const RegionSelection& other) + : std::list() + , sigc::trackable(other) { RegionView::RegionViewGoingAway.connect (mem_fun(*this, &RegionSelection::remove_it)); + _current_start = other._current_start; + _current_end = other._current_end; + for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { add (*i); } - _current_start = other._current_start; - _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) { if (this != &other) { clear_all(); - - for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { - add (*i); - } _current_start = other._current_start; _current_end = other._current_end; + + for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { + add (*i); + } } return *this; } +/** Empty this RegionSelection. + */ void RegionSelection::clear_all() { @@ -75,11 +88,19 @@ 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) { @@ -91,85 +112,99 @@ RegionSelection::add (RegionView* rv) if (rv->region()->first_frame() < _current_start || empty()) { _current_start = rv->region()->first_frame(); } - + if (rv->region()->last_frame() > _current_end || empty()) { _current_end = rv->region()->last_frame(); } - + 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; + RegionSelection::iterator r; - if ((i = find (begin(), end(), rv)) != end()) { - - 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(); } } - + _current_start = ref; - + } - + if (region->last_frame() == _current_end) { /* reset current end */ - + 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(); } } - + _current_end = ref; } } + 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 +231,10 @@ struct RegionSortByTime { }; +/** + * @param foo List which will be filled with the selection's regions + * sorted by position. + */ void RegionSelection::by_position (list& foo) const { @@ -212,17 +251,22 @@ RegionSelection::by_position (list& foo) const struct RegionSortByTrack { bool operator() (const RegionView* a, const RegionView* b) const { - + /* really, track and position */ - if (a->get_trackview().order == b->get_trackview().order) { + if (a->get_trackview().order() == b->get_trackview().order()) { return a->region()->position() < b->region()->position(); } else { - return a->get_trackview().order < b->get_trackview().order; + return a->get_trackview().order() < b->get_trackview().order(); } } }; - + + +/** + * @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 +281,9 @@ RegionSelection::by_track (list& foo) const return; } +/** + * @param Sort the selection by position and track. + */ void RegionSelection::sort_by_position_and_track () { @@ -244,6 +291,10 @@ 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 { @@ -254,4 +305,4 @@ RegionSelection::involves (const TimeAxisView& tv) const } return false; } - +