X-Git-Url: https://main.carlh.net/gitweb/?a=blobdiff_plain;f=gtk2_ardour%2Fregion_selection.cc;h=c0f3f60e3f5b9e2d0a004a9bbf567d06a479c998;hb=b115a04babe8435eeaba36469eeb6145250c70cd;hp=1a5a556514eabc209fa7238511a001e0bceca5ee;hpb=ea2648503b520e3da54263ce0bafb388d22a9cd8;p=ardour.git diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index 1a5a556514..c0f3f60e3f 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -21,6 +21,7 @@ #include "ardour/region.h" #include "gui_thread.h" +#include "midi_region_view.h" #include "region_view.h" #include "region_selection.h" #include "time_axis_view.h" @@ -33,10 +34,7 @@ using namespace PBD; */ RegionSelection::RegionSelection () { - RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, ui_bind (&RegionSelection::remove_it, this, _1), gui_context()); - - _current_start = 0; - _current_end = 0; + RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, boost::bind (&RegionSelection::remove_it, this, _1), gui_context()); } /** Copy constructor. @@ -45,10 +43,7 @@ RegionSelection::RegionSelection () RegionSelection::RegionSelection (const RegionSelection& other) : std::list() { - RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, ui_bind (&RegionSelection::remove_it, this, _1), gui_context()); - - _current_start = other._current_start; - _current_end = other._current_end; + RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, boost::bind (&RegionSelection::remove_it, this, _1), gui_context()); for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { add (*i); @@ -65,9 +60,6 @@ RegionSelection::operator= (const RegionSelection& other) clear_all(); - _current_start = other._current_start; - _current_end = other._current_end; - for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { add (*i); } @@ -82,9 +74,8 @@ void RegionSelection::clear_all() { clear(); + pending.clear (); _bylayer.clear(); - _current_start = 0; - _current_end = 0; } /** @@ -96,24 +87,35 @@ bool RegionSelection::contains (RegionView* rv) const return find (begin(), end(), rv) != end(); } +bool RegionSelection::contains (boost::shared_ptr region) const +{ + for (const_iterator r = begin (); r != end (); ++r) { + if ((*r)->region () == region) { + return true; + } + } + return false; +} + /** Add a region to the selection. * @param rv Region to add. - * @return false if we already had the region, otherwise true. + * @return false if we already had the region or if it cannot be added, + * otherwise true. */ bool RegionSelection::add (RegionView* rv) { - if (contains (rv)) { - /* we already have it */ + if (!rv->region()->playlist()) { + /* not attached to a playlist - selection not allowed. + This happens if the user tries to select a region + during a capture pass. + */ return false; } - 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(); + if (contains (rv)) { + /* we already have it */ + return false; } push_back (rv); @@ -147,54 +149,8 @@ RegionSelection::remove (RegionView* rv) // remove from layer sorted list _bylayer.remove (rv); - - 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 ((*r)->region()); - - if (region->first_frame() == _current_start) { - - /* reset current start */ - - nframes_t ref = max_frames; - - 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 (RegionSelection::iterator i = begin (); i != end(); ++i) { - if (region->first_frame() > ref) { - ref = region->first_frame(); - } - } - - _current_end = ref; - } - } - + pending.remove (rv->region()->id()); erase (r); - return true; } @@ -224,9 +180,9 @@ RegionSelection::add_to_layer (RegionView * rv) } struct RegionSortByTime { - bool operator() (const RegionView* a, const RegionView* b) const { - return a->region()->position() < b->region()->position(); - } + bool operator() (const RegionView* a, const RegionView* b) const { + return a->region()->position() < b->region()->position(); + } }; @@ -249,16 +205,16 @@ RegionSelection::by_position (list& foo) const } struct RegionSortByTrack { - bool operator() (const RegionView* a, const RegionView* b) const { + bool operator() (const RegionView* a, const RegionView* b) const { - /* really, track and position */ + /* really, track and position */ - if (a->get_time_axis_view().order() == b->get_time_axis_view().order()) { - return a->region()->position() < b->region()->position(); - } else { - return a->get_time_axis_view().order() < b->get_time_axis_view().order(); - } - } + if (a->get_time_axis_view().order() == b->get_time_axis_view().order()) { + return a->region()->position() < b->region()->position(); + } else { + return a->get_time_axis_view().order() < b->get_time_axis_view().order(); + } + } }; @@ -305,3 +261,65 @@ RegionSelection::involves (const TimeAxisView& tv) const return false; } +framepos_t +RegionSelection::start () const +{ + framepos_t s = max_framepos; + for (RegionSelection::const_iterator i = begin(); i != end(); ++i) { + s = min (s, (*i)->region()->position ()); + } + + if (s == max_framepos) { + return 0; + } + + return s; +} + +framepos_t +RegionSelection::end_frame () const +{ + framepos_t e = 0; + for (RegionSelection::const_iterator i = begin(); i != end(); ++i) { + e = max (e, (*i)->region()->last_frame ()); + } + + return e; +} + +/** @return the playlists that the regions in the selection are on */ +set > +RegionSelection::playlists () const +{ + set > pl; + for (RegionSelection::const_iterator i = begin(); i != end(); ++i) { + pl.insert ((*i)->region()->playlist ()); + } + + return pl; +} + +size_t +RegionSelection::n_midi_regions () const +{ + size_t count = 0; + + for (const_iterator r = begin(); r != end(); ++r) { + MidiRegionView* const mrv = dynamic_cast (*r); + if (mrv) { + ++count; + } + } + + return count; +} + +ARDOUR::RegionList +RegionSelection::regionlist () const +{ + ARDOUR::RegionList rl; + for (const_iterator r = begin (); r != end (); ++r) { + rl.push_back ((*r)->region ()); + } + return rl; +}