* bugfix from http://tracker.ardour.org/view.php?id=2155 thanks to kristian: fix...
[ardour.git] / gtk2_ardour / audio_streamview.cc
index 1e66b29321494a9f6e8e5ca289a111277b0e332d..08ac532319ffa6f65d9e160f9da35548b56fa9d7 100644 (file)
@@ -73,7 +73,6 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
        _amplitude_above_axis = 1.0;
 
        use_rec_regions = tv.editor.show_waveforms_recording ();
-
 }
 
 AudioStreamView::~AudioStreamView ()
@@ -310,6 +309,7 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
 
        for (list<CrossfadeView *>::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
                if ((*i)->crossfade == crossfade) {
+
                        if (!crossfades_visible || layer_display == Stacked) {
                                (*i)->hide();
                        } else {
@@ -339,10 +339,9 @@ AudioStreamView::add_crossfade (boost::shared_ptr<Crossfade> crossfade)
                                               _samples_per_unit,
                                               region_color,
                                               *lview, *rview);
-
+       cv->set_valid (true);
        crossfade->Invalidated.connect (mem_fun (*this, &AudioStreamView::remove_crossfade));
        crossfade_views.push_back (cv);
-
        if (!Config->get_xfades_visible() || !crossfades_visible || layer_display == Stacked) {
                cv->hide ();
        }
@@ -389,6 +388,8 @@ AudioStreamView::redisplay_diskstream ()
                        apl->foreach_crossfade (this, &AudioStreamView::add_crossfade);
        }
 
+       RegionViewList  copy;
+
        for (i = region_views.begin(); i != region_views.end(); ) {
                tmp = i;
                tmp++;
@@ -396,9 +397,47 @@ AudioStreamView::redisplay_diskstream ()
                if (!(*i)->is_valid()) {
                        delete *i;
                        region_views.erase (i);
-               } 
+                       i = tmp;
+                       continue;
+               } else {
+                       (*i)->enable_display(true);
+               }
+
+               /* 
+                  sort regionviews by layer so that when we call region_layered ()
+                  the canvas layering works out (in non-stacked mode).
+               */
+
+               if (copy.size() == 0) {
+                       copy.push_front((*i));
+                       i = tmp;
+                       continue;
+               }
+
+               RegionViewList::iterator k = copy.begin();
+               RegionViewList::iterator l = copy.end();
+               l--;
+
+               if ((*i)->region()->layer() <= (*k)->region()->layer()) {
+                       copy.push_front((*i));
+                       i = tmp;
+                       continue;
+               } else if ((*i)->region()->layer() >= (*l)->region()->layer()) {
+                       copy.push_back((*i));
+                       i = tmp;
+                       continue;
+               }
+
+               for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
+                 
+                       if ((*j)->region()->layer() >= (*i)->region()->layer()) {
+                               copy.insert(j, (*i));
+                               break;
+                       }
+               }
 
                i = tmp;
+
        }
 
        for (xi = crossfade_views.begin(); xi != crossfade_views.end();) {
@@ -413,10 +452,12 @@ AudioStreamView::redisplay_diskstream ()
                xi = tmpx;
        }
 
-       /* now fix layering */
-
-       for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
-               region_layered (*i);
+       /* now fix canvas layering */
+       
+       for (RegionViewList::iterator j = copy.begin(); j != copy.end(); ++j) {
+                       (*j)->enable_display(true);
+                       (*j)->set_y_position_and_height(0, height);
+                       region_layered (*j);
        }
 }
 
@@ -425,8 +466,9 @@ AudioStreamView::set_show_waveforms (bool yn)
 {
        for (list<RegionView *>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
                AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
-               if (arv)
+               if (arv) {
                        arv->set_waveform_visible (yn);
+               }
        }
 }