Remove region raise() and lower(). Try to do region layering better.

git-svn-id: svn://localhost/ardour2/trunk@1881 d708f5d6-7413-0410-9779-e7cbd77b26cf
This commit is contained in:
Carl Hetherington 2007-05-18 13:55:25 +00:00
parent de9187f0ed
commit 452daa6371
9 changed files with 42 additions and 185 deletions

View File

@ -870,9 +870,7 @@ class Editor : public PublicEditor
void set_region_lock (bool);
void set_region_position_lock (bool);
void set_region_opaque (bool);
void raise_region ();
void raise_region_to_top ();
void lower_region ();
void lower_region_to_bottom ();
void split_region ();
void split_region_at (nframes_t);

View File

@ -1006,25 +1006,6 @@ Editor::button_release_handler (ArdourCanvas::Item* item, GdkEvent* event, ItemT
case 2:
switch (mouse_mode) {
case MouseObject:
switch (item_type) {
case RegionItem:
if (Keyboard::modifier_state_equals (event->button.state, Keyboard::Shift)) {
raise_region ();
} else if (Keyboard::modifier_state_equals (event->button.state, Keyboard::ModifierMask (Keyboard::Shift|Keyboard::Alt))) {
lower_region ();
} else {
// Button2 click is unused
}
return true;
break;
default:
break;
}
break;
case MouseRange:
// x_style_paste (where, 1.0);

View File

@ -1708,24 +1708,12 @@ Editor::loop_location (Location& location)
}
}
void
Editor::raise_region ()
{
selection->foreach_region (&Region::raise);
}
void
Editor::raise_region_to_top ()
{
selection->foreach_region (&Region::raise_to_top);
}
void
Editor::lower_region ()
{
selection->foreach_region (&Region::lower);
}
void
Editor::lower_region_to_bottom ()
{

View File

@ -271,24 +271,12 @@ RegionView::region_opacity ()
set_frame_color ();
}
void
RegionView::raise ()
{
_region->raise ();
}
void
RegionView::raise_to_top ()
{
_region->raise_to_top ();
}
void
RegionView::lower ()
{
_region->lower ();
}
void
RegionView::lower_to_bottom ()
{

View File

@ -65,9 +65,7 @@ class RegionView : public TimeAxisViewItem
void move (double xdelta, double ydelta);
void raise ();
void raise_to_top ();
void lower ();
void lower_to_bottom ();
bool set_position(nframes_t pos, void* src, double* delta = 0);

View File

@ -125,8 +125,6 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f
void freeze ();
void thaw ();
void raise_region (boost::shared_ptr<Region>);
void lower_region (boost::shared_ptr<Region>);
void raise_region_to_top (boost::shared_ptr<Region>);
void lower_region_to_bottom (boost::shared_ptr<Region>);
@ -265,8 +263,6 @@ class Playlist : public PBD::StatefulDestructible, public boost::enable_shared_f
boost::shared_ptr<Playlist> cut (nframes_t start, nframes_t cnt, bool result_is_hidden);
boost::shared_ptr<Playlist> copy (nframes_t start, nframes_t cnt, bool result_is_hidden);
int move_region_to_layer (layer_t, boost::shared_ptr<Region> r, int dir);
void relayer ();
void unset_freeze_parent (Playlist*);

View File

@ -155,8 +155,6 @@ class Region : public PBD::StatefulDestructible, public boost::enable_shared_fro
void trim_to (nframes_t position, nframes_t length, void *src);
void set_layer (layer_t l); /* ONLY Playlist can call this */
void raise ();
void lower ();
void raise_to_top ();
void lower_to_bottom ();

View File

@ -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 */
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;
RegionList copy = regions;
copy.sort (cmp);
}
for (RegionList::iterator i = copy.begin(); i != copy.end(); ++i) {
for (i = copy.begin(); i != copy.end(); ++i) {
(*i)->set_layer (layer++);
/* 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++;
}
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);
}
}
@ -1630,33 +1658,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)
{
@ -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)
{

View File

@ -852,24 +852,6 @@ Region::sync_position() const
}
void
Region::raise ()
{
boost::shared_ptr<Playlist> pl (playlist());
if (pl) {
pl->raise_region (shared_from_this ());
}
}
void
Region::lower ()
{
boost::shared_ptr<Playlist> pl (playlist());
if (pl) {
pl->lower_region (shared_from_this ());
}
}
void
Region::raise_to_top ()
{