From fc5be662befcbf973db2f21066b1b1883da7acc8 Mon Sep 17 00:00:00 2001 From: Carl Hetherington Date: Thu, 4 Nov 2010 18:05:17 +0000 Subject: [PATCH] Remove incorrect caching of region selection start/end points, and always compute them. I'm pretty sure the slow-down won't be a problem in practice. Fixes #3520. git-svn-id: svn://localhost/ardour2/branches/3.0@7963 d708f5d6-7413-0410-9779-e7cbd77b26cf --- gtk2_ardour/region_selection.cc | 92 ++++++++++----------------------- gtk2_ardour/region_selection.h | 11 +--- 2 files changed, 28 insertions(+), 75 deletions(-) diff --git a/gtk2_ardour/region_selection.cc b/gtk2_ardour/region_selection.cc index 16f89e5eab..8ad7502414 100644 --- a/gtk2_ardour/region_selection.cc +++ b/gtk2_ardour/region_selection.cc @@ -34,9 +34,6 @@ 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; } /** Copy constructor. @@ -47,9 +44,6 @@ RegionSelection::RegionSelection (const RegionSelection& other) { 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; - for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { add (*i); } @@ -65,9 +59,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); } @@ -83,8 +74,6 @@ RegionSelection::clear_all() { clear(); _bylayer.clear(); - _current_start = 0; - _current_end = 0; } /** @@ -117,14 +106,6 @@ RegionSelection::add (RegionView* rv) 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(); - } - push_back (rv); /* add to layer sorted list */ @@ -156,54 +137,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 */ - - framepos_t ref = max_framepos; - - 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; - } - } - + erase (r); - return true; } @@ -314,3 +249,28 @@ 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()->position () + (*i)->region()->length ()); + } + + return e; +} diff --git a/gtk2_ardour/region_selection.h b/gtk2_ardour/region_selection.h index c4ad44da37..fd43e4626f 100644 --- a/gtk2_ardour/region_selection.h +++ b/gtk2_ardour/region_selection.h @@ -47,15 +47,11 @@ class RegionSelection : public std::list void clear_all(); - nframes_t start () const { - return _current_start; - } + framepos_t start () const; /* "end" collides with list<>::end */ - nframes_t end_frame () const { - return _current_end; - } + framepos_t end_frame () const; const std::list& by_layer() const { return _bylayer; } void by_position (std::list&) const; @@ -66,9 +62,6 @@ class RegionSelection : public std::list void add_to_layer (RegionView *); - nframes_t _current_start; ///< start position for the selection - nframes_t _current_end; ///< end position for the selection - std::list _bylayer; ///< list of regions sorted by layer PBD::ScopedConnection death_connection; }; -- 2.30.2