Fix menu missing fit-tracks.
[ardour.git] / gtk2_ardour / audio_streamview.cc
index 3490c9d6c2506d7f4f05aa072f72aabdead4c35a..7fc7be2db2441fd2a4541ab2e44d19d25101c175 100644 (file)
@@ -61,19 +61,10 @@ AudioStreamView::AudioStreamView (AudioTimeAxisView& tv)
        crossfades_visible = true;
        _waveform_scale = LinearWaveform;
        _waveform_shape = Traditional;
-       
-       if (tv.is_track())
-               stream_base_color = ARDOUR_UI::config()->canvasvar_AudioTrackBase.get();
-       else
-               stream_base_color = ARDOUR_UI::config()->canvasvar_AudioBusBase.get();
-       
-       canvas_rect->property_fill_color_rgba() = stream_base_color;
-       canvas_rect->property_outline_color_rgba() = RGBA_BLACK;
-
+       color_handler ();
        _amplitude_above_axis = 1.0;
 
        use_rec_regions = tv.editor.show_waveforms_recording ();
-
 }
 
 AudioStreamView::~AudioStreamView ()
@@ -113,7 +104,7 @@ AudioStreamView::set_amplitude_above_axis (gdouble app)
 }
 
 RegionView*
-AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves)
+AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wait_for_waves, bool recording)
 {
        AudioRegionView *region_view = 0;
 
@@ -143,8 +134,13 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
 
        switch (_trackview.audio_track()->mode()) {
        case Normal:
-               region_view = new AudioRegionView (canvas_group, _trackview, region, 
+               if (recording) {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
+                                                  _samples_per_unit, region_color, recording, TimeAxisViewItem::Visibility(TimeAxisViewItem::ShowFrame | TimeAxisViewItem::HideFrameRight));
+               } else {
+                       region_view = new AudioRegionView (canvas_group, _trackview, region, 
                                                   _samples_per_unit, region_color);
+               }
                break;
        case Destructive:
                region_view = new TapeAudioRegionView (canvas_group, _trackview, region, 
@@ -160,7 +156,6 @@ AudioStreamView::add_region_view_internal (boost::shared_ptr<Region> r, bool wai
        region_view->set_amplitude_above_axis(_amplitude_above_axis);
        region_views.push_front (region_view);
 
-       
        /* if its the special single-sample length that we use for rec-regions, make it 
           insensitive to events 
        */
@@ -310,6 +305,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 +335,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 +384,9 @@ AudioStreamView::redisplay_diskstream ()
                        apl->foreach_crossfade (this, &AudioStreamView::add_crossfade);
        }
 
+       RegionViewList copy;
+
+       /* Place regions */
        for (i = region_views.begin(); i != region_views.end(); ) {
                tmp = i;
                tmp++;
@@ -396,9 +394,40 @@ AudioStreamView::redisplay_diskstream ()
                if (!(*i)->is_valid()) {
                        delete *i;
                        region_views.erase (i);
+                       i = tmp;
+                       continue;
                } else {
                        (*i)->enable_display(true);
-                       (*i)->set_y_position_and_height(0, height);
+               }
+
+               /* 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;
@@ -415,10 +444,10 @@ AudioStreamView::redisplay_diskstream ()
 
                xi = tmpx;
        }
-
+       
        /* now fix layering */
 
-       for (RegionViewList::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+       for (RegionViewList::iterator i = copy.begin(); i != copy.end(); ++i) {
                region_layered (*i);
        }
 }
@@ -428,8 +457,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);
+               }
        }
 }
 
@@ -458,7 +488,7 @@ AudioStreamView::set_waveform_scale (WaveformScale scale)
 void
 AudioStreamView::setup_rec_box ()
 {
-       // cerr << _trackview.name() << " streamview SRB\n";
+       //cerr << _trackview.name() << " streamview SRB region_views.size() = " << region_views.size() << endl;
 
        if (_trackview.session().transport_rolling()) {
 
@@ -467,7 +497,6 @@ AudioStreamView::setup_rec_box ()
                if (!rec_active && 
                    _trackview.session().record_status() == Session::Recording && 
                    _trackview.get_diskstream()->record_enabled()) {
-
                        if (_trackview.audio_track()->mode() == Normal && use_rec_regions && rec_regions.size() == rec_rects.size()) {
 
                                /* add a new region, but don't bother if they set use_rec_regions mid-record */
@@ -539,8 +568,9 @@ AudioStreamView::setup_rec_box ()
                        rec_rect->property_x1() = xstart;
                        rec_rect->property_y1() = 1.0;
                        rec_rect->property_x2() = xend;
-                       rec_rect->property_y2() = (double) _trackview.height - 1;
-                       rec_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_RecordingRect.get();
+                       rec_rect->property_y2() = (double) _trackview.current_height() - 1;
+                       rec_rect->property_outline_color_rgba() = ARDOUR_UI::config()->canvasvar_TimeAxisFrame.get();
+                       rec_rect->property_outline_what() = 0x1 | 0x2 | 0x4 | 0x8;
                        rec_rect->property_fill_color_rgba() = fill_color;
                        rec_rect->lower_to_bottom();
                        
@@ -559,11 +589,9 @@ AudioStreamView::setup_rec_box ()
                } else if (rec_active &&
                           (_trackview.session().record_status() != Session::Recording ||
                            !_trackview.get_diskstream()->record_enabled())) {
-
                        screen_update_connection.disconnect();
                        rec_active = false;
                        rec_updating = false;
-
                }
                
        } else {
@@ -649,7 +677,6 @@ void
 AudioStreamView::update_rec_regions ()
 {
        if (use_rec_regions) {
-
                uint32_t n = 0;
 
                for (list<pair<boost::shared_ptr<Region>,RegionView*> >::iterator iter = rec_regions.begin(); iter != rec_regions.end(); n++) {
@@ -687,7 +714,7 @@ AudioStreamView::update_rec_regions ()
 
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
 
                                                /* also update rect */
@@ -712,7 +739,7 @@ AudioStreamView::update_rec_regions ()
                                                
                                                if (origlen == 1) {
                                                        /* our special initial length */
-                                                       add_region_view_internal (region, false);
+                                                       add_region_view_internal (region, false, true);
                                                }
                                                
                                                /* also hide rect */
@@ -728,6 +755,28 @@ AudioStreamView::update_rec_regions ()
        }
 }
 
+void
+AudioStreamView::show_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (true);
+               }
+       }
+}
+
+void
+AudioStreamView::hide_all_fades ()
+{
+       for (list<RegionView*>::iterator i = region_views.begin(); i != region_views.end(); ++i) {
+               AudioRegionView* const arv = dynamic_cast<AudioRegionView*>(*i);
+               if (arv) {
+                       arv->set_fade_visibility (false);
+               }
+       }
+}
+
 void
 AudioStreamView::show_all_xfades ()
 {
@@ -778,14 +827,14 @@ AudioStreamView::color_handler ()
 }
 
 void
-AudioStreamView::update_contents_y_position_and_height ()
+AudioStreamView::update_contents_height ()
 {
-       StreamView::update_contents_y_position_and_height ();
+       StreamView::update_contents_height ();
        
        for (CrossfadeViewList::iterator i = crossfade_views.begin(); i != crossfade_views.end(); ++i) {
                if (layer_display == Overlaid) {
                        (*i)->show ();
-                       (*i)->set_y_position_and_height (0, height);
+                       (*i)->set_height (height);
                } else {
                        (*i)->hide ();
                }