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:
parent
f0d2fec29d
commit
fc5be662be
@ -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 */
|
||||
@ -157,53 +138,7 @@ 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> 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;
|
||||
}
|
||||
|
@ -47,15 +47,11 @@ class RegionSelection : public std::list<RegionView*>
|
||||
|
||||
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<RegionView *>& by_layer() const { return _bylayer; }
|
||||
void by_position (std::list<RegionView*>&) const;
|
||||
@ -66,9 +62,6 @@ class RegionSelection : public std::list<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
|
||||
PBD::ScopedConnection death_connection;
|
||||
};
|
||||
|
Loading…
Reference in New Issue
Block a user