13
0

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
This commit is contained in:
Carl Hetherington 2010-11-04 18:05:17 +00:00
parent f0d2fec29d
commit fc5be662be
2 changed files with 28 additions and 75 deletions

View File

@ -34,9 +34,6 @@ using namespace PBD;
RegionSelection::RegionSelection () RegionSelection::RegionSelection ()
{ {
RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, ui_bind (&RegionSelection::remove_it, this, _1), gui_context()); RegionView::RegionViewGoingAway.connect (death_connection, MISSING_INVALIDATOR, ui_bind (&RegionSelection::remove_it, this, _1), gui_context());
_current_start = 0;
_current_end = 0;
} }
/** Copy constructor. /** 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()); 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) { for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) {
add (*i); add (*i);
} }
@ -65,9 +59,6 @@ RegionSelection::operator= (const RegionSelection& other)
clear_all(); clear_all();
_current_start = other._current_start;
_current_end = other._current_end;
for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) { for (RegionSelection::const_iterator i = other.begin(); i != other.end(); ++i) {
add (*i); add (*i);
} }
@ -83,8 +74,6 @@ RegionSelection::clear_all()
{ {
clear(); clear();
_bylayer.clear(); _bylayer.clear();
_current_start = 0;
_current_end = 0;
} }
/** /**
@ -117,14 +106,6 @@ RegionSelection::add (RegionView* rv)
return false; 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); push_back (rv);
/* add to layer sorted list */ /* add to layer sorted list */
@ -156,54 +137,8 @@ RegionSelection::remove (RegionView* rv)
// remove from layer sorted list // remove from layer sorted list
_bylayer.remove (rv); _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> 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); erase (r);
return true; return true;
} }
@ -314,3 +249,28 @@ RegionSelection::involves (const TimeAxisView& tv) const
return false; 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;
}

View File

@ -47,15 +47,11 @@ class RegionSelection : public std::list<RegionView*>
void clear_all(); void clear_all();
nframes_t start () const { framepos_t start () const;
return _current_start;
}
/* "end" collides with list<>::end */ /* "end" collides with list<>::end */
nframes_t end_frame () const { framepos_t end_frame () const;
return _current_end;
}
const std::list<RegionView *>& by_layer() const { return _bylayer; } const std::list<RegionView *>& by_layer() const { return _bylayer; }
void by_position (std::list<RegionView*>&) const; void by_position (std::list<RegionView*>&) const;
@ -66,9 +62,6 @@ class RegionSelection : public std::list<RegionView*>
void add_to_layer (RegionView *); 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<RegionView *> _bylayer; ///< list of regions sorted by layer std::list<RegionView *> _bylayer; ///< list of regions sorted by layer
PBD::ScopedConnection death_connection; PBD::ScopedConnection death_connection;
}; };