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 ()
|
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;
|
||||||
|
}
|
||||||
|
@ -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;
|
||||||
};
|
};
|
||||||
|
Loading…
Reference in New Issue
Block a user