summaryrefslogtreecommitdiff
path: root/gtk2_ardour/region_selection.cc
diff options
context:
space:
mode:
authorCarl Hetherington <carl@carlh.net>2010-11-04 18:05:17 +0000
committerCarl Hetherington <carl@carlh.net>2010-11-04 18:05:17 +0000
commitfc5be662befcbf973db2f21066b1b1883da7acc8 (patch)
tree51bd6a961f481b4accc7001a05757394000fc4b3 /gtk2_ardour/region_selection.cc
parentf0d2fec29dd00bf62ba946385dea603e20a5b7f4 (diff)
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
Diffstat (limited to 'gtk2_ardour/region_selection.cc')
-rw-r--r--gtk2_ardour/region_selection.cc92
1 files changed, 26 insertions, 66 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> 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;
+}