diff options
Diffstat (limited to 'libs/ardour/playlist.cc')
-rw-r--r-- | libs/ardour/playlist.cc | 156 |
1 files changed, 42 insertions, 114 deletions
diff --git a/libs/ardour/playlist.cc b/libs/ardour/playlist.cc index de6d58dbd7..306f933f26 100644 --- a/libs/ardour/playlist.cc +++ b/libs/ardour/playlist.cc @@ -1585,33 +1585,61 @@ Playlist::set_edit_mode (EditMode mode) void Playlist::relayer () { - RegionList::iterator i; - uint32_t layer = 0; - /* don't send multiple Modified notifications when multiple regions are relayered. */ freeze (); - if (Config->get_layer_model() == MoveAddHigher || - Config->get_layer_model() == AddHigher) { + /* build up a new list of regions on each layer */ - RegionSortByLastLayerOp cmp; - RegionList copy = regions; + std::vector<RegionList> layers; + /* we want to go through regions from desired lowest to desired highest layer, + which depends on the layer model + */ + RegionList copy = regions; + if (Config->get_layer_model() == MoveAddHigher || Config->get_layer_model() == AddHigher) { + RegionSortByLastLayerOp cmp; copy.sort (cmp); + } + + for (RegionList::iterator i = copy.begin(); i != copy.end(); ++i) { + + /* find the lowest layer that this region can go on */ + size_t j = layers.size(); + while (j > 0) { + /* try layer j - 1; it can go on if it overlaps no other region + that is already on that layer + */ + RegionList::iterator k = layers[j - 1].begin(); + while (k != layers[j - 1].end()) { + if ((*k)->overlap_equivalent (*i)) { + break; + } + k++; + } - for (i = copy.begin(); i != copy.end(); ++i) { - (*i)->set_layer (layer++); + if (k != layers[j - 1].end()) { + /* no overlap, so we can use this layer */ + break; + } + + j--; } - } else { - - /* Session::LaterHigher model */ + if (j == layers.size()) { + /* we need a new layer for this region */ + layers.push_back (RegionList ()); + } - for (i = regions.begin(); i != regions.end(); ++i) { - (*i)->set_layer (layer++); + layers[j].push_back (*i); + } + + /* set up the layer numbers in the regions */ + for (size_t j = 0; j < layers.size(); ++j) { + for (RegionList::iterator i = layers[j].begin(); i != layers[j].end(); ++i) { + (*i)->set_layer (j); } } @@ -1631,33 +1659,6 @@ Playlist::relayer () /* XXX these layer functions are all deprecated */ void -Playlist::raise_region (boost::shared_ptr<Region> region) -{ - uint32_t rsz = regions.size(); - layer_t target = region->layer() + 1U; - - if (target >= rsz) { - /* its already at the effective top */ - return; - } - - move_region_to_layer (target, region, 1); -} - -void -Playlist::lower_region (boost::shared_ptr<Region> region) -{ - if (region->layer() == 0) { - /* its already at the bottom */ - return; - } - - layer_t target = region->layer() - 1U; - - move_region_to_layer (target, region, -1); -} - -void Playlist::raise_region_to_top (boost::shared_ptr<Region> region) { /* does nothing useful if layering mode is later=higher */ @@ -1679,79 +1680,6 @@ Playlist::lower_region_to_bottom (boost::shared_ptr<Region> region) } } -int -Playlist::move_region_to_layer (layer_t target_layer, boost::shared_ptr<Region> region, int dir) -{ - RegionList::iterator i; - typedef pair<boost::shared_ptr<Region>,layer_t> LayerInfo; - list<LayerInfo> layerinfo; - layer_t dest; - - { - RegionLock rlock (const_cast<Playlist *> (this)); - - for (i = regions.begin(); i != regions.end(); ++i) { - - if (region == *i) { - continue; - } - - if (dir > 0) { - - /* region is moving up, move all regions on intermediate layers - down 1 - */ - - if ((*i)->layer() > region->layer() && (*i)->layer() <= target_layer) { - dest = (*i)->layer() - 1; - } else { - /* not affected */ - continue; - } - } else { - - /* region is moving down, move all regions on intermediate layers - up 1 - */ - - if ((*i)->layer() < region->layer() && (*i)->layer() >= target_layer) { - dest = (*i)->layer() + 1; - } else { - /* not affected */ - continue; - } - } - - LayerInfo newpair; - - newpair.first = *i; - newpair.second = dest; - - layerinfo.push_back (newpair); - } - } - - /* now reset the layers without holding the region lock */ - - for (list<LayerInfo>::iterator x = layerinfo.begin(); x != layerinfo.end(); ++x) { - x->first->set_layer (x->second); - } - - region->set_layer (target_layer); - -#if 0 - /* now check all dependents */ - - for (list<LayerInfo>::iterator x = layerinfo.begin(); x != layerinfo.end(); ++x) { - check_dependents (x->first, false); - } - - check_dependents (region, false); -#endif - - return 0; -} - void Playlist::nudge_after (nframes_t start, nframes_t distance, bool forwards) { |