fix region un/combine, based on a patch by Tom Brand
This commit is contained in:
parent
c7c3c1e924
commit
c8fd1d26eb
@ -36,6 +36,19 @@ struct LIBARDOUR_API RegionSortByLayer {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/* sort by RegionSortByLayerAndPosition()
|
||||||
|
* is equivalent to
|
||||||
|
* stable_sort by RegionSortByPosition();
|
||||||
|
* stable_sort by RegionSortByLayer();
|
||||||
|
*/
|
||||||
|
struct LIBARDOUR_API RegionSortByLayerAndPosition {
|
||||||
|
bool operator() (boost::shared_ptr<Region> a, boost::shared_ptr<Region> b) {
|
||||||
|
return
|
||||||
|
(a->layer() < b->layer() && a->position() < b->position())
|
||||||
|
|| (a->layer() == b->layer() && a->position() < b->position());
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
} // namespace
|
} // namespace
|
||||||
|
|
||||||
#endif /* __libardour_region_sorters_h__ */
|
#endif /* __libardour_region_sorters_h__ */
|
||||||
|
@ -2809,7 +2809,14 @@ Playlist::combine (const RegionList& r)
|
|||||||
|
|
||||||
pl->in_partition = true;
|
pl->in_partition = true;
|
||||||
|
|
||||||
for (RegionList::const_iterator i = r.begin(); i != r.end(); ++i) {
|
/* sort by position then layer.
|
||||||
|
* route_time_axis passes 'selected_regions' - which is not sorted.
|
||||||
|
* here we need the top-most first, then every layer's region softed by position.
|
||||||
|
*/
|
||||||
|
RegionList sorted(r);
|
||||||
|
sorted.sort(RegionSortByLayerAndPosition());
|
||||||
|
|
||||||
|
for (RegionList::const_iterator i = sorted.begin(); i != sorted.end(); ++i) {
|
||||||
|
|
||||||
/* copy the region */
|
/* copy the region */
|
||||||
|
|
||||||
@ -3050,6 +3057,7 @@ Playlist::uncombine (boost::shared_ptr<Region> target)
|
|||||||
|
|
||||||
for (vector<boost::shared_ptr<Region> >::iterator i = originals.begin(); i != originals.end(); ++i) {
|
for (vector<boost::shared_ptr<Region> >::iterator i = originals.begin(); i != originals.end(); ++i) {
|
||||||
add_region ((*i), (*i)->position());
|
add_region ((*i), (*i)->position());
|
||||||
|
set_layer((*i), (*i)->layer());
|
||||||
}
|
}
|
||||||
|
|
||||||
in_partition = false;
|
in_partition = false;
|
||||||
|
Loading…
Reference in New Issue
Block a user